Переводчик разговоров

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

Leaderboards

Вот фрагмент стека, который генерирует как регулярную таблицу лидеров, так и обзор победителей по языкам.

Чтобы убедиться, что ваш ответ отображается, начните его с заголовка, используя следующий шаблон уценки:

# 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
Luis Mendo
7
В будущем, пожалуйста, воздержитесь от изменения ввода / вывода после публикации ряда ответов. Я вернулся сегодня, и наличие разрешенных входных данных делает этот вызов совершенно отличным от того, что я ответил .
GammaFunction

Ответы:

21

Желе , 3 байта

y@/

Вход представляет собой единый список: аккумулятор, за которым следуют пары.

Попробуйте онлайн!

Как это работает

yАтом совершает транслитерации; [a, b] yc заменяет a на b , поэтому возвращает b, если a = c, и c, если a ≠ c .

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

Деннис
источник
14
Это единственный ответ Jelly, который я видел до сих пор, в котором используются только символы ASCII.
2
Там было несколько. Смотри, ма, нет Юникода!
Деннис
21

Python 3 , 43 байта

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

Попробуйте онлайн!

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

Трудная часть состоит в том, чтобы доказать, что решение дает правильный результат. Чтобы увидеть это, нам нужен глубокий анализ команд. Во-первых, мы видим, что команды имеют следующие свойства:

  • Свойство (1) : командует 00и 11сохраняет состояние аккумулятора.
  • Свойство (2) : команды 01и 10делают состояние аккумулятора таким же, как второй бит, независимо от его исходного состояния.

Следовательно, конечное состояние аккумулятора:

  • Случай 1 : если команда no 01или 10существует, конечное состояние совпадает с исходным состоянием.
  • Случай 2 : в противном случае последний бит последней 10или 01команды.

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

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

    В случае 1 входная строка sдолжна начинаться с 2k+10, а затем 11и 00команды. Устранение 00s и 11s приводит к единственному результату 0, который является конечным состоянием.

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

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

Исходя из всего вышесказанного, после устранения 00s и 11s одновременно за один проход ( 01001является контрпримером, если 00исключается за один проход, а затем 11на другом проходе) из ввода s, последний символ является конечным состоянием. Следовательно, правильность решения доказана.

Joel
источник
Добро пожаловать в PPCG! Отличный ответ и хорошее формальное доказательство!
GammaFunction
3
Спасибо. Я чувствую, что люди могут сомневаться в том, что такое простое решение на первый взгляд дает правильный результат. Таким образом, есть необходимость предоставить доказательства для этого.
Джоэл
9

Perl 6 , 17 байт

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

Попробуйте онлайн!

Использует преимущество «Вы можете объединить эти два входа в один вход, если хотите», взяв вход в качестве значения аккумулятора, объединенного с командами, например 1,[00,11]is 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}
GammaFunction
источник
6

Python 3 , 52 байта

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

Попробуйте онлайн!

Исправлен несовместимый тип возврата благодаря Chas Brown

Принимает ввод как две строки; аккумулятор и код.

минус семь
источник
О нет, это было быстро.
ВысокоРадиоактивный
1
Хорошо, но у него есть эта потенциальная проблема - f(1,'11')==f(1,'01')есть False; иногда возвращает, intа иногда str. Так, может быть, указать, что он принимает входные данные в виде строки?
Час Браун
@ChasBrown Хороший звонок, это намного проще, чем я думал.
отрицательное семь
Хорошо, но поскольку ваша функция рекурсивная, она не может быть анонимной. Это должно быть 52 байта .
Джитс
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,Иксзнак равно012) а также (aзнак равно1,Иксзнак равно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
Arnauld
источник
4

sed -E, 26 19 байт

Целых -7 байт от @Cowsquack, осуществляя удаление всех пар работает хорошо.

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

Принимает входные данные, объединенные на стандартный ввод. Вдохновленный ответом Perl Джо Кинга . Удалите концевые пары. Удалите все пары, затем получите последнюю цифру.

Попробуйте онлайн! Попробуйте онлайн!

GammaFunction
источник
1
Последняя строка может быть простой s/.*\B//, но в любом случае изменение подхода слегка дает еще более короткие 19 байт. Попробуйте онлайн!
user41805
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]

Попробуйте онлайн!

Основано на решении Джоэла . Принимает input как список начального значения аккумулятора (строка длины одна), за которой следуют команды (строки длины две). Находит последнюю команду с двумя неравными значениями и выводит ее второй символ.

Чтобы сделать это падение до начального значения аккумулятора, когда таких команд нет, мы сделаем так, чтобы строка начального значения с одним символом прошла тест. Мы делаем это, проверяя, не совпадает ли одноэлементный список с последним символом со списком всех предыдущих символов, который передается любой строкой длиной одна или длиной две с двумя разными символами.

XNOR
источник
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

Haskell , 29 байт

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

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

Попробуйте онлайн!

Анк-Морпорка
источник
1
То же bytecount, если вы определите его с помощью префиксной нотации . Я не могу поверить, что написал почти тот же самый ответ в то же самое время, даже включая объяснение подписи типа…
Коул
2

Python, 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

Ungolfed. РЕДАКТИРОВАТЬ: AHHH Кто-то избил меня до этого!

HighlyRadioactive
источник
2

Haskell , 36 байт

f(x:y:s)=f s.last.(:[y|x/=y])
f _=id

Попробуйте онлайн!

Принимает ввод, f(string)(char)где символ является аккумулятором, а строка является списком команд.

Джо Кинг
источник
2

Keg , -ir16 байт

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

Попробуйте онлайн!

Разъяснение:

  1. Принимает неявный ввод и вправо сдвигает значение аккумуляторов вниз

  2. Повторите следующее (длина стека - 1, деленное на 2) раз

2.1. Сдвиньте аккумулятор обратно наверх

2.2. Сравните на равенство с первой частью команды

2.2.1. Если это правда, замените аккумулятор, в противном случае вытолкните замену

Входные данные принимаются в качестве начального значения acc, объединенного с источником. Например

010011000
  • Первый символ соответствует значению
  • Отдых программный
Lyxal
источник
1

Баш , 58 40 байт

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

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

58 байт. Попробуйте онлайн!

Тернар будет возвращать ложь, когда $1задано значение 0, но ,1в конце гарантирует, что целое ((expression))вернет истину, за исключением синтаксической ошибки.

Когда все аргументы использованы, возникает синтаксическая ошибка и рекурсия заканчивается.


GammaFunction
источник
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-=?!

Попробуйте онлайн!

Принимает ввод как последовательность разделенных пробелами байтов (Рунический не понимает списки). Первый байт - это начальное состояние, а каждый второй байт - это программа. Проверка не выполняется (то есть предполагается, что в качестве входных данных передаются только допустимые программы, и не важно, какое значение используется для представления 0и 1).

Draco18s больше не доверяет SE
источник
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

Fayti1703
источник
0

Crystal , 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

который я пришел в основном методом проб и ошибок. Как только все команды были обработаны, он возвращает значение состояния.

Kinxer
источник
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);}
osuka_
источник
0

Java (JDK) , 38 байт

a->p->p.reduce(a,(s,c)->c<1|c>2?s:c%2)

Попробуйте онлайн!

Входы являются intи IntStreamиз 0, 1, 2или 3, которые соответствуют 00, 01, 10, 11из двоичного файла.

Оливье Грегуар
источник