Симулятор обміну стеками


73

Напишіть програму або функцію, яка містить рядок, що містить лише символи ^та v(ви можете припустити, що інших символів не буде). Прочитайте зліва направо цей рядок представляє послідовність клацань миші, здійснених одним користувачем під час першого перегляду питання або відповіді щодо обміну стеками .

Кожен ^являє собою клацання кнопки оновлення, і кожен vозначає натискання кнопки знищення . (Для робочих прикладів дивіться трохи ліворуч.)

Припустимо, що жодних обмежень для голосування не діє, тому всі кліки зареєстровані правильно.
Роздрукувати або повернути:

  • 1або +1якщо повідомлення в кінцевому підсумку ановується.
  • 0якщо повідомлення закінчується, не проголосується. ( -0І +0не дійсні)
  • -1 якщо повідомлення в кінцевому підсумку буде заборонено.

Повідомлення починаються з нуля чистих голосів від користувача, а кнопки змінюють чисті голоси таким чином:

Net Votes Before    Button Pressed    Net Votes After
1                   ^                 0
1                   v                 -1
0                   ^                 1
0                   v                 -1
-1                  ^                 1
-1                  v                 0

Виграє найкоротший код у байтах.

Тестові приклади:

[empty string] -> 0
^^ -> 0
^v -> -1
^ -> 1
v -> -1
v^ -> 1
vv -> 0
^^^ -> 1
vvv -> -1
^^^^ -> 0
vvvv -> 0
^^^^^ -> 1
vvvvv -> -1
^^^^^^ -> 0
vvvvvv -> 0
^^v -> -1
^v^ -> 1
^vv -> 0
vv^ -> 1
v^v -> -1
v^^ -> 0
^vvv^^vv^vv^v^ -> 1
^vvv^^vv^vv^v^^ -> 0
^vvv^^vv^vv^v^^^ -> 1
^vvv^^vv^vv^v^^v -> -1
^vvv^^vv^vv^v^^vv -> 0
^vvv^^vv^vv^v^^vvv -> -1
^vvvvvvvvvvvv -> 0
^^vvvvvvvvvvvv -> 0
^^^vvvvvvvvvvvv -> 0
vvv^^^^^^^^^^^^ -> 0
vv^^^^^^^^^^^^ -> 0
v^^^^^^^^^^^^ -> 0

14
Що? немає сторонного голосування? Геоборти та Seadrus сумні
Оптимізатор

25
Шановний розробник Secret SE: Вітаємо вас з успішним введенням вашої власної спільноти у вдосконалення сайту ...;)
ніж

1
Я вже деякий час дивився на прикладну таблицю, і досі не отримую тестових випадків. публікація з оцінкою 1 стає голосовою, і вона нараховує 0. А публікація з оцінкою 0 стає голосовою і має оцінку 1. А публікація з оцінкою -1 встає - проголосували за оцінку 1. Отже, ^персонаж може викликати зміну балів -1, +1 або +2? Я щільний де? Що відбувається?
Бред

4
@Brad Я пропоную спробувати дії з якоюсь фактичною публікацією (наприклад, саме це питання). Повторення публікації, яку ви вже оскаржили, скасовує оновлення. Те ж саме з пониженням.
Захоплення Кальвіна

6
Цікаво, якими були голоси в реальному часі за це питання. Я готовий поставити під сумнів, що багато людей використовували це питання як тестовий випадок.
MikeTheLiar

Відповіді:


35

Gol> <> 0,3.11 , 13 12 11 байт

iEh`^=:@)+M

Спробуйте в Інтернеті . Незважаючи на те, що це буде добре працювати в наступному оновлення, я вказав його як 0,3.11 на всякий випадок.

Пояснення

i               Read char
 Eh             If EOF, halt and output top of stack as num
   `^=          Push 1 if char is ^, else 0
      :@        Dup and rotate, giving [is^ is^ votecount]
        )       Compare greater than, pushing 1 or 0 as appropriate
         +M     Add and subtract 1

Зауважте, що при першому використанні @витягніть 0 з нижньої частини стека, щоб ініціалізувати підрахунок голосів для першої ітерації

Для ілюстрації з повною таблицею:

Votes before    Button    Is ^?    Compare <    Add     Subtract 1
     1            ^         1         0          1          0
     1            v         0         0          0         -1
     0            ^         1         1          2          1
     0            v         0         0          0         -1
    -1            ^         1         1          2          1
    -1            v         0         1          1          0

1
.... бовтатися! Хороший!
El'endia Starman

22

машинний код x86, 24 байти

31 C0 8A 11 84 D2 75 07 C0 E0 02 C0 F8 06 C3 41 38 C2 74 EC 88 D0 EB EA

Це функція, що використовує конвенцію про виклик швидкого виклику, яка бере рядок і повертає 8-бітове ціле число.

Я перевірив це за допомогою наступної програми C, яку необхідно скласти для 32-бітного режиму.

#include <stdio.h>
#include <inttypes.h>

 __attribute__ ((aligned (16))) const unsigned char fun[] = {

    0x31,  //xor eax,eax
        0xC0,
    0x8A, //mov [ecx],dl
        1 | 2<<3,
    0x84, //test dl, dl
        0xC0 | 2<<3 | 2,
    0x75, // jnz
        7,
    0xC0, //shl al 2
        0xC0 | 4<<3,
        2,
    0xC0, //sar al 6
        0xC0 | 7<<3,
        6,
    0xC3, //ret
    0x41, //inc ecx
    0x38, //cmp al,dl
        0xC0 | 2,
    0x74, //je
        -20,
    0x88, //mov dl,al
        0xC0 | 2<<3,
    0xEB, //jmp
        -22,
};

int main()
{
    __fastcall int8_t (*votesimulator)(char*) = fun;
    char* s[] = {
        "",
        "^^",
        "^v",
        "^",
        "v",
        "v^",
        "vv",
        "^^^",
        "vvv",
        "^^^^",
        "vvvv",
        "^^^^^",
        "vvvvv",
        "^^^^^^",
        "vvvvvv",
        "^^v",
        "^v^",
        "^vv",
        "vv^",
        "v^v",
        "v^^",
        "^vvv^^vv^vv^v^",
        "^vvv^^vv^vv^v^^",
        "^vvv^^vv^vv^v^^^",
        "^vvv^^vv^vv^v^^v",
        "^vvv^^vv^vv^v^^vv",
        "^vvv^^vv^vv^v^^vvv",
        "^vvvvvvvvvvvv",
        "^^vvvvvvvvvvvv",
        "^^^vvvvvvvvvvvv",
        "vvv^^^^^^^^^^^^",
        "vv^^^^^^^^^^^^",
        "v^^^^^^^^^^^^",
    };

    for(int i = 0; i < sizeof(s)/sizeof(*s); i++)
        printf("%d\n", votesimulator(s[i]));

    printf("\n%d\n", sizeof(fun));
    for(int i = 0; i < sizeof(fun); i++)
        printf("%02X ", fun[i]);
    return 0;
}

Це дозволено? Я маю на увазі, що я міг би також написати все на C і просто сказати, що для коду С потрібен порожній файл для виконання завдання, кажучи, що мій код є рамкою, завдяки чому мій код стає 0байт. Чому це відрізняється від вашого рішення?
Заїбіс

@Zaibis Оскільки мій розчин містить код, який вирішує проблему? Див. Meta.codegolf.stackexchange.com/a/1071/30688 .
feersum

21

JavaScript (ES7), 47 46 44 43 37 36 байт

Закреслений 44 все ще є регулярним 44 :(

s=>[for(x of s)s=x<"v"?s!=1:!~s-1]|s

Зберігає загальний обсяг у s. Використовує for ofцикл для повторення кожного символу в рядку та оновлення sна основі поточного символу та попереднього значення.

Правки: Golfed ~s&&-1to !~s-1. Цей вираз має дорівнювати 0, якщо sінакше дорівнює -1 і -1. Збережено 6 байт завдяки @nderscore.

Як працює вираз:

 ~s    // Bitwise inverse. ~s==0 only if s==-1
!      // Logical negate. Casts to boolean. Equivalent to s==-1
   -1  // Subtract. Casts to number so true-1 is 1-1 and false-1 is 0-1

3
Я знизив його до 37 байт:v=>[for(x of v)v=x<"v"?~~v<1:!~v-1]|v
nderscore

@nderscore Ей, це чудово. Я думав, що зайва змінна незграбна, але не думала, що зможу її усунути.
intrepidcoder

1
Закреслений 44 все ще є регулярним 44 ...
Rɪᴋᴇʀ

Чи не були вилучені розуміння масивів із специфікації?
МерМонти

8

CJam, 18 14 байт

Оновлена ​​версія зі значними поліпшеннями сприяла Денніс:

0'jqf{-g_@=!*}

Спробуйте в Інтернеті

Пояснення:

0     Start value for running total.
'j    Push character between '^ and 'v for use in loop.
q     Get input.
f{    Apply block with argument to all input characters.
  -     Subtract character from 'j. This will give -12 for '^, 12 for 'v.
  g     Signum, to get 1 for '^, -1 for 'v, which is our increment value.
  _     Copy increment value.
  @     Bring running total to top.
  =     Compare. This will give 1 for the -1/-1 and 1/1 combinations where the new
        running total is 0. Otherwise, the new running total is the increment value.
  !     Negate to get 0 for the -1/-1 and 1/1 cases.
  *     Multiply result with increment value, to get new running total.
}     End block applied to input characters.

7

Befunge 93 - 55 байт

vj#p01:>#<:1+|
>~:10g-|v:g25<
^p01"j"<1^   <
./*34-g0<@

52 символи та 3 нові рядки.

Випробуваний на цьому перекладачі .

Це jрівновіддалене від ^і vв ассії, тому його використовують для здійснення арифметичних перетворень у підсумку, а не для умов, що вимагають місця.


7

мозковий ебать, 146 байт

,[[>->+<<-]>[[-]>[<+>-]]>[-]<<[<],]----[>-----<--]--[>>+<<++++++]+>[<-]<[->>++.<++++[<------>-]]>[<+<<]----[>+++++<--]>[,+<]>>[<<]-[>+<-----]>---.

Ця програма бере кожен байт введення та порівнює його з останнім. Якщо вони однакові, він відкидає вхід і зберігає "0" як "попередній вхід", інакше він зберігає його нормально.

Якщо кінцевий результат є v, він друкується -. Якщо кінцевий результат був ненульовим, 1 додається до порожньої комірки. Нарешті, до цієї комірки додається 48, і вона друкується.


7

Javascript ES6, 91 48 символів

s=>~~{'^':1,v:-1}[s.replace(/(.)\1/g).slice(-1)]

Пояснення: undefinedзакінчується на d.

Тест:

` -> 0
^^ -> 0
^v -> -1
^ -> 1
v -> -1
v^ -> 1
vv -> 0
^^^ -> 1
vvv -> -1
^^^^ -> 0
vvvv -> 0
^^^^^ -> 1
vvvvv -> -1
^^^^^^ -> 0
vvvvvv -> 0
^^v -> -1
^v^ -> 1
^vv -> 0
vv^ -> 1
v^v -> -1
v^^ -> 0
^vvv^^vv^vv^v^ -> 1
^vvv^^vv^vv^v^^ -> 0
^vvv^^vv^vv^v^^^ -> 1
^vvv^^vv^vv^v^^v -> -1
^vvv^^vv^vv^v^^vv -> 0
^vvv^^vv^vv^v^^vvv -> -1
^vvvvvvvvvvvv -> 0
^^vvvvvvvvvvvv -> 0
^^^vvvvvvvvvvvv -> 0
vvv^^^^^^^^^^^^ -> 0
vv^^^^^^^^^^^^ -> 0
v^^^^^^^^^^^^ -> 0`
.split("\n").map(s => s.split(" -> "))
.every(([s,key]) => (s=>~~{'^':1,v:-1}[s.replace(/(.)\1/g).slice(-1)])(s)==key)

Історія відповідей:

s=>({'':0,'^':1,v:-1}[s.replace(/^(.)\1(\1\1)*(?=.?$)|.*(.)(((?!\3).)\5)+/,"").substr(-1)])
s=>~~{'^':1,v:-1}[s.replace(/^(.)\1(\1\1)*(?=.?$)|.*(.)(((?!\3).)\5)+/,"").substr(-1)]
s=>~~{'^':1,v:-1}[s.replace(/^.*(.)(((?!\1).)\3)+|(.)\4(\4\4)*/,"").substr(-1)]
s=>~~{'^':1,v:-1}[s.replace(/^.*(.)(((?!\1).)\3)+|(.)\4(\4\4)*/,"").slice(-1)]
s=>~~{'^':1,v:-1}[s.replace(/.*(.)(((?!\1).)\3)+|(.)\4(\4\4)*/,"").slice(-1)]
s=>~~{'^':1,v:-1}[s.replace(/.*(.)(((?!\1).)\3)+|((.)\5)*/,"").slice(-1)]
s=>~~{'^':1,v:-1}[s.replace(/((.)\2)+/g,"!").slice(-1)]
s=>~~{'^':1,v:-1}[s.replace(/(.)\1/g,"!").slice(-1)]
s=>~~{'^':1,v:-1}[s.replace(/(.)\1/g,0).slice(-1)]
s=>~~{'^':1,v:-1}[s.replace(/(.)\1/g).slice(-1)]

7

Пітон 2, 49

lambda s:reduce(lambda x,c:cmp(cmp('u',c),x),s,0)

Здійснює взаємодію з функцією оновлення

lambda x,c:cmp(cmp('u',c),x)

який приймає поточний підрахунок голосів xта новий символ cта видає новий підрахунок голосів.

Ідея полягає в тому , щоб використовувати Python 2 в cmpфункцію, яка порівнює два її арг і дає -1, 0, 1для <, ==, >відповідно. Внутрішня cmp('u',c)дає -1за vі 1для ^; будь-якого персонажа між ними достатньо 'u'. Потім зовнішній порівнює це з тим x, що дає cmp(1,x)для ^і cmp(-1,x)для v, які мають правильні значення.

Пряма ітерація була на 3 символи довше (52), хоча це було б на одну ознаку (48), якщо input()дозволяти брати лапки.

x=0
for c in raw_input():x=cmp(cmp('u',c),x)
print x

Найкраща рекурсивна функція, яку я знайшов, була на один чар довше (50)

f=lambda s:len(s)and cmp(cmp('u',s[-1]),f(s[:-1]))

5

Пролог, 159 152 байт

Код:

v(1,^,0).
v(1,v,-1).
v(0,^,1).
v(0,v,-1).
v(-1,^,1).
v(-1,v,0).
r(X,[H|T]):-T=[],v(X,H,Z),write(Z);v(X,H,Z),r(Z,T).
p(S):-atom_chars(S,L),r(0,L).

Перевірте сам:
Інтернет-перекладач тут

Приклад

>p("^vvv^^vv^vv^v^^vvv").
-1

>p("^vvv^^vv^vv^v^")
1

Редагувати: Збережено 7 байтів, об'єднавши r-пропозиції з АБО.


Хм. Здається, ви могли зберегти досить багато байтів, змінивши операторів замість визначення функцій (якщо це вважається функцією за правилами PPCG?)
лише ASCII

@ ASCII лише: Так. Я не навчився цього фокусу, коли писав це :)
Емінька,

4

CJam, 16 байт

0re`W=(2%*c'a--g

Це буде крах після друку 0 , якщо це доречно. Помилку можна придушити за допомогою інтерпретатора Java. Якщо ви спробуєте це в Інтернеті , ігноруйте все, окрім останнього рядка виводу.

Як це працює

0                e# Push a 0 on the stack.
 r               e# Read a whitespace-separated token from STDIN.
  e`             e# Perform run-length encoding.
    W=           e# Select the last [repetitions character] pair.
                 e# This will fail for the empty string, so the
                 e# interpreter will print the stack's only element (0).
      (          e# Shift out the number of repetitions.
       2%        e# Compute its parity.
         *       e# Create a string, repeating the character 1 or 0 times.
          c      e# Cast to character.
                 e# This will fail for a zero-length string, so the
                 e# interpreter will print the stack's only element (0).
           'a-   e# Subtract the character 'a' from '^' or 'v'.
              -  e# Subtract the difference (integer) from 0.
               g e# Apply the sign function.

4

Python 2, 177 159 72 байт

Все ще щось нове в цій справі про гольф коду.

def v(s): 
 c=0 
 for i in s:c=((0,1)[c<1],(0,-1)[c>-1])[i=="^"] 
 return c

EDIT: виправлено неправильну поведінку.
EDIT 2: Дякуємо @MorganThrapp за бриття багато байтів.


Дивно. Я розберуся в це.
DJgamer98

Виявляється, я забув правильну ^ тоді v поведінку (і навпаки).
DJgamer98

Видалення посади до її виправлення.
DJgamer98

Це має працювати зараз.
DJgamer98

1
Цей відступ не зовсім правильний, я просто запропонував редагувати правильний відступ. Ви не можете відформатувати код у коментарях, тому він був неправильним у моєму.
Морган Трапп

4

JavaScript (ES6), 64 59 58 52 байт

f=v=>(t=/\^*$|v*$/.exec(v)[0]).length*(t<'v'?1:-1)%2

Це ґрунтується на спостереженні, що на результат впливає лише остання розтягнення повторення (або одного, ^або v).

Завдяки Нілу за те, що він грає в 6 байт.


1
Навіщо потрібні знімки? Мені здається, f=v=>(t=/\^*$|v*$/.exec(v)[0]).length*(t<'v'?1:-1)%2достатньо.
Ніл

@Neil: Мені невідомо, що масив примушується до першого елемента >або <оператору. Дякуємо за поради
n̴̖̋h̷͉̃a̷̭̿h̷̭̿́d̷̰̀ĥ̷̳

Ніякого примусу не було, я просто перемістив те, [0]що, можливо, вас збентежило.
Ніл

@Neil: О, я справді розгублений. Я не зрозумів, що ти перемістив його всередину, я подумав f=v=>(t=/\^*$|v*$/.exec(v))[0].length*(t<'v'?1:-1)%2, що це працює, що працює за типом примусу з масивом.
n̴̖̋h̷͉̃a̷̭̿h̸̡̅ẗ̵̨́d̷̰̀ĥ̷̳

4

Haskell, 40 байт

1%'^'=0
_%'^'=1
1%_=-1
_%_=0
v=foldl(%)0

Ви можете вирізати всі пробіли, визначивши fфункцію інфіксації %. Крім того, я думаю, що vможе бути _.
xnor

На насправді, хіба це не дасть -1для vvзамість 0?
xnor

О, я завжди забуваю про вставки. Дякуємо за місце, пропустили внутрішню інверсію.
Лейф Віллерс

Збережіть 3 символи, замінивши третій рядок (15 символів) на 1%_=-1 _%_=0, 12 символів.
Кевін Рейд

Гаразд, тепер це стало коротше.
Leif Willerts

4

Скала, 75 байт

def d(s:String)=s./:(0){case(1,94)|(-1,'v')=>0;case(_,94)=> 1;case _=> -1}

Тест на реалізовану функцію.

  object Util {
        def d(s: String) = s./:(0) { 
    case (1, '^') | (-1, 'v') => 0
    case (_, '^') => 1
    case (_, _) => -1
  }      
      def main(s: Array[String]): Unit = {
        println("1 == " + d("^vvv^^vv^vv^v^^^"))
        println("1 == " + d("^vvv^^vv^vv^v^"))
        println("-1 == " + d("^vvv^^vv^vv^v^^vvv"))
        println("0 == " + d("^^^vvvvvvvvvvvv"))
        println("0 == " + d("vvv^^^^^^^^^^^^"))
      }
    }

1
Ласкаво просимо до PPCG! Не могли б ви додати пояснення та / або версію, що не має волі?
Аддісон Кримп

3

APL, 17

(⊣×≠)/⌽0,2-'^ '⍳⍞

Для перекладачів без позначень вил (як GNU APL) це було б {⍺×⍺≠⍵}/⌽0,2-'^ '⍳⍞(19). Це, мабуть, найбільш нудне з можливих рішень, оскільки воно працює безпосередньо з визначення проблеми.


3

Рубі, 41 35 байт

Регекс. Цікавою є лише остання натиснута кнопка, тому перевірте довжину її виконання. Потім порівняйте його "a"(або будь-яку букву між ^і v), щоб отримати 1або -1.

->s{s[/(.?)\1*$/].size%2*(?a<=>$1)}

3

C # 6, 18 + 80 = 98 байт

Потрібно:

using System.Linq;

Фактична функція:

int S(string v)=>v.Split(new[]{"^^","vv"},0).Last().Length<1?0:v.Last()<95?1:-1;

Як це працює: код спочатку видаляє всі до останнього ^^або vv. Цей вміст не має значення, оскільки натискання однієї кнопки двічі завжди скасує ваш голос. Вона робить це шляхом поділу на ^^і vvі з останнім пунктом. Якщо цей пункт є порожнім рядком ( .Length<1), функція повертається, 0оскільки все голосування було скасовано. Якщо рядок не порожній, він просто перегляне останній знак початкового рядка: він перекриє всі попередні голоси. Якщо char код менший за 95, то він буде 94 ^, тому він повертається 1, інакше -1.


3

Пітон 2,7, 79 75 88

s=input()
print (0,(1,-1)[s[-1]=='v'])[len(s[s.rfind(('v^','^v')[s[-1]=='v'])+1:])%2!=0]

Це насправді нічого не друкує.
Морган Трапп

Запустивши його в моєму перекладачі, він показує вихід останнього рядка
wnnmaw

Це тому, що ви запускаєте його у відповідь. Вам потрібно надати повну програму, яка працюватиме поза REPL.
Морган Трапп

Крім того, ви можете скоротити цей термінал, (-1,(1,0)[n==0])[n>0]щоб зберегти 10 байт. Також не використовуйте a=str.count. Це насправді коштує вам 4 байти.
Морган Трапп

Це дає -1 для n = 0, але крутий синтаксис
wnnmaw

2

Minkolang 0,11 , 28 22 байт

0$I2&N."j"o-34*:dr=,*!

Спробуйте тут.

Пояснення

0                         Push a 0 (running total)
 $I                       Push length of input
   2&N.                   Output as integer and stop if this is 0
       "j"                Push 106
          o               Take character from input (94 for ^, 118 for v)
                          <<so ^ becomes +12 and v becomes -12>>
           -              Subtract
            34*:          Divide by 12
                d         Duplicate top of stack
                 r        Reverse stack
                  =,      Push 0 if equal, 1 otherwise
                    *     Multiply
                          <<this handles two of the same vote in a row>>
                     !    Unconditional trampoline (jumps the 0 at the beginning)

Зауважте, що N.в кінці немає. Це тому, що я дав їй обернутися до початку. Коли вхід порожній, остаточний підсумок виводиться як ціле число, і програма зупиняється.



2

Математика, 60 байт

Mod[#,2]Sign@#&@Tr@Last@Split@StringCases[#,{"^"->1,_->-1}]&

@#&? Це марно (якщо Sequenceвони не задіяні, але Sequenceвони не задіяні.
CalculatorFeline

2

Сценарій форми , 26 байт

"^"$"0>1@-"~"v"$"0<1-"~0@!

Як це будить:

"^"$     split input on '^'
"
  0>         Check if the number is more than 0 (1 if true, 0 if false).
  1@-        subtract the answer from one.
"~       Join it back together, with this string in place of '^'
"v"$     Split on 'v'
"        
  0<         Check if 0 is more than the number (1 if true, 0 if false).
  1-         subtract one from the results
"~       Join it back together, with this string in place of 'v'
0@       add a zero to the stack and place it under the string just built. 
!        run the string as code

2

C # 6, 18 + 97 95 = 115 113 байт, відсутність рядкових методів, надмірна LINQ

int v(string s)=>(int)s.Reverse().TakeWhile((c,i)=>i<1||c==s[s.Length-i])?.Sum(x=>x<95?1:-1)%2;

Воістину заслуговує на те, щоб передувати цьому

using System.Linq;

Є ідея використовувати x<95?1:-1замість x=='^'?1:-1від відповіді ProgramFOX в

Збіг:

  • Налаштування, яку я вкрав, використовує порівняння з 95 - кількість байтів, виключаючи оператор використання, використовуючи вказане налаштування
  • Сума цифр загальної кількості байтів дорівнює кількості цифр від загального числа байтів, записаних як римська цифра

2

C: 67 66 байт

гольф:

void f(char *v){int i=0,c,s=0;for(;v[i]!=0;i++){v[i]>94?s--:s++;}}

неозорений:

void f (char *v)
{
    int i = 0, c, s = 0;

    for (;v[i]!=0;i++)
    {
        v[i] > 94 ? s-- : s++;
    }
}

Це не повертає результату. Тут не проходять усі тести.
Роберт Анджежук

2

Ідіть, 179 байт

Надзвичайно наївне рішення.

package main
import(."fmt"."strings")
func main(){a:=""
i:=0
Scanln(&a)
b:=Split(a,"")
for _,e:=range b{switch i{case 1:i--
case 0:if e=="^"{i++}else{i--}
case-1:i++}}
Println(i)}

Безголівки:

package main

import (
    ."fmt"
    ."strings"
)

func main() {
    a := ""
    i := 0
    Scanln(&a)
    b := Split(a, "")
    for _, e := range b {
        switch i {
        case 1:
            i--
        case 0:
            if e == "^" {
                i++
            } else {
                i--
            }
        case -1:
            i++
        }
    }
    Println(i)
}

2

Perl 5, 41 байт

40 байт, плюс 1 для -p

/(.)\1*$/;$_=((length$&)%2)*($1=~v?-1:1)

/(.)\1*$/;порівнює вхідний рядок з регулярним виразом /(.)\1*$/, тобто бачить, чи закінчується він одним символом, повтореним деяким числом ≥1 разів.

Якщо так, $&то цілий рядок повторення та $1символ; в іншому випадку (тобто вхідна рядок порожня), ці дві змінні є порожньою рядком.

$1=~v?-1:1порівнює $1з регулярним виразом vі повертає -1, якщо він відповідає, а 1 - інакше.

І помножте, що ± 1 (length$&)%2, на довжину $&модуля 2.


2

05AB1E , 14 12 11 байт

Îvy'^QDŠ‹+<

Порт на відповідь @ Sp3000 'Gol> <> .

ПРИМІТКА: @Grimy вже опублікував коротшу альтернативу на 8 байт для 05AB1E , тож обов'язково підтримайте його!

Спробуйте в Інтернеті або перевірте всі тестові випадки .

Пояснення:

Î            # Push 0 (later mentioned as `r`) and the input-string
 v           # Loop over the characters of the input:
  y'^Q      '#  Does the current character equal "^"?
             #  (results in 1 for truthy; 0 for falsey - later mentioned as `b`)
      D      #  Duplicate this result `b`
       Š     #  Triple swap (`r`,`b`,`b`) to (`b`,`r`,`b`)
            #  Check if the boolean `b` is smaller than the result-integer `r`
             #  (again results in 1 for truthy; 0 for falsey)
         +   #  Add them together
          <  #  Decrease this by 1
             # (Implicitly output the result-integer `r` after the loop)

2

05AB1E , 8 байт

㤮öÓÆ.±

Спробуйте в Інтернеті!

Альтернативні рішення з однаковою довжиною: u㤮öÓÆ(, 㤮ögÓÆ(.


1
Це не працює. Ні ваш розміщений код, ні код у посиланні TIO (який відрізняється) не ^^ -> 0
враховуйте

@Emigna дякую, що вказали на це! Я виправив код, це все-таки 8 байт.
Грим


1

Рубі, 43

->s{a=0
s.bytes{|i|b=9-i/11;a=a!=b ?b:0}
a}

9-i/11оцінює до 1 або -1, якщо дано коди ascii ^(94) або v(118)

У тестовій програмі:

f=->s{a=0
s.bytes{|i|b=9-i/11;a=a!=b ?b:0}
a}

g=gets.chomp
puts f[g]
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.