Перекладач


10

"Розмова" - це барокована мова на основі акумулятора, що створюється у відповідь на цитату Денніса на talk.tryitonline.net.

Waiting for someone to create an esolang called talk. 

. Мова "Talk" має 4 команди:

  • 00 Якщо акумулятор 0, встановіть акумулятор 0.
  • 01 Якщо акумулятор 0, встановіть його на 1.
  • 10 Якщо акумулятор 1, встановіть акумулятор 0.
  • 11 Якщо акумулятор 1, встановіть його на 1.

Вхід:

  • Введення можна приймати будь-яким прийнятним методом введення за нашими стандартними правилами вводу / виводу.

  • Є два входи, початкове значення акумулятора та програма. Ви можете об'єднати ці два входи в один вхід або розділити ваш вхід на дійсні команди (наприклад, взявши їх як список; наприклад [00, 01, 00]), якщо хочете.

Вихід:

  • Після закінчення виконання команди акумулятор виводиться неявно.

Правила:

  • Вхід може бути одним рядком або списком символів.
  • Як це є , виграє найкоротша відповідь у байтах.
  • Ми беремо цифри або рядки / символи.

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

0 0001111101 -> 1
0 000100 -> 1
0 11001000 -> 0

Табло лідерів

Ось фрагмент стека для створення як звичайного табло, так і огляду переможців за мовою.

Щоб переконатися, що ваша відповідь відображається, будь ласка, почніть свою відповідь із заголовка, використовуючи наступний шаблон Markdown:

# Language Name, N bytes

де Nрозмір вашого подання. Якщо ви покращите свій рахунок, ви можете зберегти старі бали у заголовку, прокресливши їх. Наприклад:

# Ruby, <s>104</s> <s>101</s> 96 bytes

Якщо ви хочете включити у свій заголовок декілька чисел (наприклад, тому що ваш результат - це сума двох файлів або ви хочете окремо вказати штрафні санкції для перекладача), переконайтесь, що фактичний бал є останнім номером у заголовку:

# Perl, 43 + 2 (-p flag) = 45 bytes

Ви також можете зробити ім'я мови посиланням, яке потім з’явиться у фрагменті таблиць лідерів:

# [><>](http://esolangs.org/wiki/Fish), 121 bytes


3
Отже, є два входи, послідовність команд та початкове значення акумулятора?
xnor

4
Деякі тестові випадки, які не змінюють акумулятор, почніть з 1 в акумуляторі або не має інструкцій, це було б добре
Джо Кінг,

8
Чи справді Talk можна вважати мовою програмування ?
Луїс Мендо

8
@A_ Цей коментар, мабуть, мав на увазі як жарт. Ще в той день мова під назвою Lang мала б URL-адресу lang.tryitonline.net(зараз це tio.run/#lang). Тож мова під назвою Talk спричинить плутанину з URL-адресою для нещодавно створеної чатової кімнати, а самеtalk.tryitonline.net
Луїс Мендо

7
Надалі будь ласка, утримуйтесь від зміни вводу / виводу після опублікування низки відповідей. Я повернувся сьогодні і, якщо дозволили скласти картографічні входи, це зовсім інше завдання, ніж те, на що я відповів .
GammaFunction

Відповіді:


21

Желе , 3 байти

y@/

Введення - це єдиний список: акумулятор, за яким йдуть пари.

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

Як це працює

yАтом здійснює транслітерації; [a, b] yc замінює a на b , тому він повертається b, якщо a = c і c, якщо a ≠ c .

y@/складе / зменшує введення за yдопомогою замінених аргументів, виконуючи одну транслітерацію на пару.


14
Це єдина відповідь Jelly, яку я бачив досі, що використовує лише символи ASCII.

2
Було декілька. Дивись ма, ні Unicode!
Денніс

21

Python 3 , 43 байти

lambda s:re.sub("00|11","",s)[-1]
import re

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

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

Важкою частиною є доведення рішення, що дає правильний результат. Щоб побачити це, нам потрібен глибокий аналіз команд. По-перше, ми можемо бачити, що команди мають такі властивості:

  • Властивість (1) : командує 00та 11зберігає стан акумулятора.
  • Властивість (2) : командує 01та 10робить стан акумулятора таким же, як і другий біт, незалежно від його початкового стану.

Отже, кінцевим станом акумулятора є:

  • Випадок 1 : Якщо немає 01або 10команда не існує, кінцевий стан такий же, як початковий.
  • Випадок 2 : інакше останній біт останнього 10або 01команди.

Далі ми покажемо, що рішення дає правильний результат в обох випадках. Ми доведемо твердження про кінцевий стан, 0а кінцевий стан 1можна підтвердити аналогічно. Якщо кінцевим станом є 0вхід, то в будь-якій з наступних форм:

  • ^0{2k+1}11(11|00)*

    Для випадку 1 вхідний рядок sповинен починатися з 2k+10s, а потім 11і 00команд. Усунення 00s і 11s дає одиничне 0, що є кінцевим станом.

  • .+10{2k+1}11(11|00)*

    Для випадку 2 вхідний рядок закінчується 10командою, після чого дорівнює нулю або більше, 00і 11s. Ця модель еквівалентна 1наступним 2k+10s, а потім нуль або більше 11років і 00с. Усунення 00s і 11s залишає після останнього з 2k+10 в кінці рядка, що представляє кінцевий стан.

Виходячи з усього вищесказаного, після вилучення 00s і 11s одночасно в одному проході ( 01001є зустрічним прикладом, якщо 00виключається в одному проході, а потім 11в іншому проході) з вхідного сигналу s, останній символ є кінцевим станом. Звідси доводиться правильність рішення.


Ласкаво просимо до PPCG! Відмінна відповідь і приємний офіційний доказ, щоб піти з цим!
GammaFunction

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

9

Perl 6 , 17 байт

{m/.)>[(.)$0]*$/}

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

Користується "Ви можете об'єднати ці два входи в один вхід, якщо вам подобається", взявши введення як значення акумулятора, з'єднаного з командами, наприклад, 1,[00,11]є 10011. Якщо це не нормально, то це лише 5 зайвих байтів f(accumulator, commands). Повертає об'єкт відповідності, який можна примусити до рядка.

Пояснення:

{                }  # Anonymous code block
 m/             /   # Find the first match from the input
   .)>              # Capture a number
      [     ]*      # Followed by any number of
       (.)$0        # Pairs of identical characters
              $     # Ending the string

В основному це працює, тому що команди 00і 11команди не роблять буквально нічого, тоді як команди 01і 10просто встановлюють акумулятор на другу цифру команди. Якщо немає команд, то вона замість цього приймає початкове значення акумулятора.


6

Zsh , 33 байт

Список символів передається як аргументи, початкове значення акумулятора передається як stdin.

read a
for x y;a=$[x^a?a:y]
<<<$a

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


39 байт : Якщо команди повинні бути одним рядком

Введення - accumulator commandsаргументи.

for x y (${(s::)2})1=$[x^$1?$1:y]
<<<$1

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


Для задоволення, ось 50-байтний рекурсивний однокласочник ( TIO ):

<<<${${2+`f $[$1^${2[1]}?$1:${2[2]}] ${2:2}`}:-$1}

6

Python 3 , 52 байти

f=lambda a,s:s and f([s[1],a][s[0]==s[1]],s[2:])or a

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

Виправлено непослідовний тип повернення завдяки Шасу Брауну

Приймає вхід у вигляді двох рядків; акумулятор і код.


О ні, це було швидко.
ВисокоРадіоактивний

1
Приємно, але у нього є ця потенційна проблема - f(1,'11')==f(1,'01')є False; вона іноді повертає, intа іноді a str. Тож, можливо, вкажіть, що він приймає акаунт як рядок?
Час Браун

@ChasBrown Добрий дзвінок, це набагато простіше, ніж те, про що я думав.
негативна

Приємно, але оскільки ваша функція є рекурсивною, вона не може бути анонімною. Це має бути 52 байти .
Jitse

5

Брахілог , 11 9 байт

tġ₂≠ˢtt|h

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

Оскільки вже давно мені вдалося забути поняття про друк акумулятора після кожної команди , я сформулював значно менш наївне рішення з деяким натхненням з відповіді Джо Кінга на Perl.

       |     The output is
     tt      the last element of the last element of
t            the last element of the input
 ġ₂          split into length-2 slices
   ≠ˢ        with equal pairs removed.
       |     If there is no such element, the input
        h    's first element is the output.

Старе рішення:

Брахілог , 18 16 байт

ġ₂ᵗc{th~h?tt|h}ˡ

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

-2 байти від зміни формату введення.


5

JavaScript (ES6), 27 байт

Вводиться як " (a)(code)де" код - це список 2-бітних цілих чисел.

a=>c=>c.map(x=>a^=x==a+1)|a

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


JavaScript (ES6),  47  40 байт

Вводиться як (a)(code), де код - рядок.

a=>c=>c.replace(/../g,x=>a^=x%4==a+1)&&a

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

Як?

Нижче наведені всі можливі випадки. Єдині два випадки, коли нам потрібно переключити акумулятор(a=0,x=012) і (a=1,x=102).

  a | x (bin) | int(x) % 4 | a + 1 | equal?
----+---------+------------+-------+--------
  0 |   "00"  |  0 % 4 = 0 |   1   |   N
  1 |   "00"  |  0 % 4 = 0 |   2   |   N
  0 |   "01"  |  1 % 4 = 1 |   1   |   Y
  1 |   "01"  |  1 % 4 = 1 |   2   |   N
  0 |   "10"  | 10 % 4 = 2 |   1   |   N
  1 |   "10"  | 10 % 4 = 2 |   2   |   Y
  0 |   "11"  | 11 % 4 = 3 |   1   |   N
  1 |   "11"  | 11 % 4 = 3 |   2   |   N

4

sed -E, 26 19 байт

Цілих -7 байт від @Cowsquack, здійснюючи видалення всіх пар працює добре.

s/(.)\1//g
s/.*\B//

Збирає вхід, з'єднаний разом на stdin. Натхненний відповіддю Джо Кінга Perl . Смугайте слідні пари Видаліть усі пари та отримайте останню цифру.

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


1
Останній рядок може бути простим s/.*\B//, але у будь-якому випадку, якщо змінити підхід, трохи більше, ви отримаєте ще коротший 19 байт. Спробуйте його онлайн!
користувач41805

1
Так, я не думав, що s/(.)\1//gце спрацює, оскільки це може прибрати кінець однієї пари та початок наступної, але це все одно працює. Відмінно!
GammaFunction

@GammaFunction s/(.)\1//gеквівалентний s/00|11//gпоказаному в моєму рішенні.
Джоель

4

Сітківка 0,8.2 , 18 11 байт

(.)\1

!`.$

Спробуйте в Інтернеті! Посилання включає тестові випадки. Вводить зведений вхід. Збережено 6 байт завдяки @CowsQuack за вказівку на те, що видалення всіх подвоєних символів, а потім взяття останнього символу, що залишився, хоча насправді порт оригінальної відповіді @ JoKing міг би бути зіграний на 3 байти навіть без цього фокусу.



@Cowsquack D'oh, коли ви думаєте про розділення етапів, це вже 2-байт збереження, потім ще один байт збережений, тому що ви можете використовувати !`.$, а потім ще 4 байти, тому що вам не потрібно обмежуватися трейлінг пар ...
Ніл

4

Python 3 , 38 байт

lambda l:[y for*x,y in l if[y]!=x][-1]

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

На основі рішення Джоеля . Приймає введення як список початкового значення акумулятора (довжина-одна рядок) з подальшими командами (довжина-два рядки). Знаходить останню команду з двома неоднаковими значеннями та виводить її другий символ.

Щоб це не потрапило до початкового значення акумулятора, коли таких команд немає, ми робимо це так, щоб однорядова рядок початкового значення пройшла тест. Ми робимо це, перевіряючи, чи однотонний список з останнім символом неоднаковий до списку всіх попередніх символів, який передається будь-якою довжиною-однією рядком або довжиною-двома рядками з двома різними символами.




3

Желе , 8 6 байт

EÐḟṪṪo

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

-2 байти завдяки Ніку Кеннеді, який повідомив мене про зміну правил. (Його запропонований гольф, EÐḟFȯṪздається дещо розумнішим, але має таку ж довжину, як і моє попереднє рішення мінус s2.) Формат введення тепер приймає команди як список дво символьних рядків, але тестовий колонтитул перекладається зі старого формату для зручності.

Перекладено з моїх новіших рішень Brachylog.

Стара версія:

Желе , 13 байт

ḢẎ⁼⁹a⁸o
s2ç@ƒ

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

Я не на 100% впевнений, що це правильно, але це вдається в усіх трьох тестових випадках. Команди приймає як лівий аргумент, а початковий акумулятор - як правий аргумент.


1
Вхід дозволено розділити на список, так що ви можете мати EÐḟFȯṪцей вклад, наприклад [[0,0],[0,1],[1,1],[1,1],[0,1]].
Нік Кеннеді

Нічого, зміни в специфікації дійсно були досить великими ...
Непов’язана струна

3

Хаскелл , 29 байт

Визначає неназвану функцію в першому рядку з типом (Foldable t, Eq b) => b -> t [b] -> b. Для цілей цього коду гольф, ми можемо створити його як такий, Char -> [String] -> Charде перший аргумент - акумулятор, а другий - список рядків, кожен рядок якого є однією командою.

foldl(#)
a#[x,y]|a==x=y|1>0=a

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


1
Той самий номер рахунку, якщо ви визначаєте його за допомогою позначення префікса . Не можу повірити, що я написав майже таку саму відповідь одночасно, навіть включаючи пояснення підпису типу…
cole

2

Пітон, 111 байт

def f(a,b):
    c=a
    for i in range(0,len(b)-1,2):
        c=(not b[i])*(c or b[i] or b[i+1]) or c*b[i]*b[i+1]
    return c

Безумовно. EDIT: AHHH Хтось мене до цього побив!





2

Keg , -ir16 байт

"(!;½|':"=['_"|_

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

Пояснили:

  1. Бере непрямий вхід і справа зміщує значення акумуляторів на дно

  2. Повторіть наступне (довжина стека - 1, розділене на 2) рази

2.1. Перемістіть акумулятор назад вгору

2.2. Порівняйте рівність з першою частиною команди

2.2.1. Якщо це правда, замініть акумулятор, інакше поставте його

Введення приймається як початкове значення акаунта, з'єднане з джерелом. Напр

010011000
  • Перший знак - це значення
  • Відпочинок - це програма

1

Баш , 58 40 байт

Додайте один байт для повної програми: змінити fна $0.

(($1=$2-a?a:$3,1))&&f $1 ${@:4}||echo $1

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

Потрійний поверне брехня , коли $1встановлено значення 0, але ,1на кінцях забезпечують весь ((expression))повертає істину, за винятком помилки синтаксису.

Коли всі аргументи споживаються, трапляється синтаксична помилка і рекурсія закінчується.



1

Вугілля деревне , 16 байт

F⪪η²F⁼θ§ι⁰≔§ι¹θθ

Спробуйте в Інтернеті! Посилання на багатослівну версію коду. Бере окремі аргументи. Пояснення:

F⪪η²

Розбийте інструкції на пари цифр і переведіть на них петлю.

F⁼θ§ι⁰

Якщо акумулятор дорівнює першій цифрі ...

≔§ι¹θ

... потім призначте їй другу цифру.

θ

Роздрукуйте акумулятор на кінці петлі.



1

Желе , 7 байт

fؽḂ⁹;Ṫ

Дьядічна Посилання, що приймає програму як список цілих чисел зліва та початковий акумулятор праворуч, який дає ціле число.

Спробуйте в Інтернеті! Або подивіться тестовий набір


Я видаляю введення-карти, тому що @GammaFunction рекомендував мені це зробити.

@A_ ах ОК не можу видалити на мобільному, тому доведеться вирішити це пізніше
Джонатан Аллан

@A_ налаштовано на роботу з 0,1,2,3 неоформленою версією інструкцій як цифрами, це добре?
Джонатан Аллан

1
Так, це нормально.


1

Рунічні чари , 28 байт

/~@/i~/i<
/=?/~iR:l}i{l1-=?!

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

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


1

x86 Асамблея, 33 байт

Приймає початковий стан акумулятора у CL(ціле 0чи або 1) та адресу команд як ASCII-рядок, що закінчується нулем ESI. Залишає остаточний стан акумулятора в CL.

Вкажіть інструкцію про виклик на зміщення 0x1B(позначка interpretв Поясненні).

3C 30 74 03 B0 01 C3 30 C0 C3 E8 F1 FF FF FF 38
C8 AC 75 07 E8 E7 FF FF FF 88 C1 AC 84 C0 75 EA
C3

Пояснення (за допомогою синтаксису Intel):

; function to convert ASCII '1'/'0' into 0 or 1 int values (from AL to AL)
ctob:
        CMP AL, 0x30 ; '0'
        JE .zero
        MOV AL, 1
        RET
        .zero:
        XOR AL, AL
        RET

; interpreting function
        interp_lp:
                CALL ctob     ; convert to number
                CMP AL, CL    ; compare to current accumulator
                LODSB         ; read the next character of the string
                              ; this doesn't affect any flags and we need to do
                              ; it in both cases anyway
                JNE interpret ; if AL != CL (from above, not the new value of AL), skip forward
                CALL ctob     ; convert AL to number
                MOV CL, AL    ; store AL in CL
interpret:      LODSB         ; read the next character of the string
                TEST AL, AL   ; check if it is a zero byte
                JNZ interp_lp ; if not, jump back into the loop
        RET



0

Кристал , 46 байт

З командами в Array(Tuple(Int32,Int32)), наприклад [{0,0}, {0,1}, {0,0}].

def f(s,i);i.map{|c,v|s+=~(s^c)&(s^v)%2};s;end

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

Це досить просто зрозуміти в більш читаному вигляді:

def f(state, instructions)
  instructions.map do |check, value|
    state += ~(state ^ check) & (state ^ value) % 2
  end
  state
end

Функція переходить через кожну команду, автоматично розпаковуючи значення кортежу в cі v. Потім він встановлює stateформулу

state = state + NOT(state XOR check) AND (state XOR value) mod 2

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


0

C (стук) , 68 62 байт

t(s,e,a)char*s,*e;{for(;s<e;++s)a=*s++-48^a?a:*s-48;puts(&a);}

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

Бере вказівник на початок початкового рядка, вказівник на кінець вихідного рядка (start + strlen (start)) та початкове значення акумулятора.

Стара версія (друкує ASCII 48/49 для 0/1):

t(s,e,a)char*s,*e;{for(;s<e;++s)a=*s++-48^a?a:*s-48;putchar(a+48);}

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