Tłumacz ustny

10

„Talk” to barokowy język oparty na akumulatorach, który powstał w odpowiedzi na cytat Dennisa na talk.tryitonline.net.

Waiting for someone to create an esolang called talk. 

. Język „Talk” ma 4 polecenia:

  • 00 Jeśli akumulator ma wartość 0, ustaw akumulator na 0.
  • 01 Jeśli akumulator ma wartość 0, ustaw akumulator na 1.
  • 10 Jeśli akumulator ma wartość 1, ustaw akumulator na 0.
  • 11 Jeśli akumulator ma wartość 1, ustaw akumulator na 1.

Wejście:

  • Dane wejściowe można pobierać dowolną akceptowalną metodą wprowadzania danych, stosując nasze standardowe reguły we / wy.

  • Są dwa wejścia, początkowa wartość akumulatora i program. Możesz połączyć te dwa dane wejściowe w jedno wejście lub podzielić dane wejściowe na prawidłowe polecenia (np. Biorąc je jako listę; np. [00, 01, 00]), Jeśli chcesz.

Wynik:

  • Po zakończeniu wykonywania polecenia akumulator jest wysyłany niejawnie.

Zasady:

  • Dane wejściowe mogą być pojedynczymi łańcuchami lub listami znaków.
  • Jak to jest , najkrótsza odpowiedź w bajtach wygrywa.
  • Bierzemy cyfry lub ciągi / znaki.

    Przypadki testowe:

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

Liderów

Oto fragment kodu, który pozwala wygenerować zarówno zwykłą tabelę wyników, jak i przegląd zwycięzców według języka.

Aby upewnić się, że twoja odpowiedź się pojawi, zacznij od nagłówka, korzystając z następującego szablonu Markdown:

# Language Name, N bytes

gdzie Njest rozmiar twojego zgłoszenia. Jeśli poprawić swój wynik, to może zachować stare porachunki w nagłówku, uderzając je przez. Na przykład:

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

Jeśli chcesz umieścić w nagłówku wiele liczb (np. Ponieważ twój wynik jest sumą dwóch plików lub chcesz osobno wymienić kary za flagi tłumacza), upewnij się, że rzeczywisty wynik jest ostatnią liczbą w nagłówku:

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

Możesz także ustawić nazwę języka jako link, który pojawi się we fragmencie tabeli wyników:

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


źródło
3
Czyli są dwa wejścia, sekwencja poleceń i początkowa wartość akumulatora?
xnor
4
Niektóre przypadki testowe, które nie zmieniają akumulatora, zaczynają się od 1 w akumulatorze lub nie mają instrukcji, byłyby dobre
Jo King
8
Czy Talk naprawdę można uznać za język programowania ?
Luis Mendo,
8
@A_ Ten komentarz prawdopodobnie miał być żartem. Wcześniej język o nazwie Lang miał adres URL lang.tryitonline.net(teraz jest tio.run/#lang). Tak więc język o nazwie Talk spowodowałby zamieszanie w adresie URL niedawno utworzonego pokoju rozmów, którym jesttalk.tryitonline.net
Luis Mendo
7
W przyszłości powstrzymaj się od zmiany We / Wy po opublikowaniu szeregu odpowiedzi. Wróciłem dzisiaj i pozwolenie na mapowanie danych wejściowych sprawia, że ​​jest to zupełnie inne wyzwanie niż odpowiedź .
GammaFunction

Odpowiedzi:

21

Galaretka , 3 bajty

y@/

Dane wejściowe to jedna lista: akumulator, a po nim pary.

Wypróbuj online!

Jak to działa

yTransliteration atom wykonuje; [a, b] yc zastępuje z b i wraca b jeśli A = C i C czy ≠ C .

y@/folds / zmniejsza dane wejściowe za ypomocą zamienionych argumentów, wykonując jedną transliterację na parę.

Dennis
źródło
14
To jedyna jak dotąd odpowiedź Jelly, która używa tylko znaków ASCII.
2
Było kilka. Spójrz, nie ma Unicode!
Dennis
21

Python 3 , 43 bajty

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

Wypróbuj online!

Funkcja przyjmuje jako ciąg pojedynczy ciąg znaków, gdzie pierwszym znakiem jest stan początkowy, a reszta ciągu reprezentuje polecenia. To rozwiązanie można łatwo przenieść na inne języki, które lepiej obsługują wyrażenia regularne.

Trudność polega na udowodnieniu, że rozwiązanie daje właściwy wynik. Aby to zobaczyć, potrzebujemy dogłębnej analizy poleceń. Po pierwsze, widzimy, że polecenia mają następujące właściwości:

  • Właściwość (1) : wydaje polecenia 00i 11zachowuje stan akumulatora.
  • Właściwość (2) : wydaje polecenia 01i 10ustawia stan akumulatora na taki sam jak drugi bit, niezależnie od jego pierwotnego stanu.

Dlatego końcowy stan akumulatora to:

  • Przypadek 1 : Jeśli nie ma polecenia 01lub 10komendy, stan końcowy jest taki sam jak stan początkowy.
  • Przypadek 2 : W przeciwnym razie ostatni bit ostatniego polecenia 10lub 01polecenia.

Następnie pokażemy, że rozwiązanie daje poprawny wynik w obu przypadkach. Udowodnimy stwierdzenie stanu końcowego, 0a stan końcowy 1można udowodnić analogicznie. Jeśli stanem końcowym jest 0dane wejściowe, ma jedną z następujących postaci:

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

    W przypadku 1 ciąg wejściowy smusi zaczynać się od 2k+10, a następnie poleceń 11i 00. Wyeliminowanie 00s i 11s daje pojedynczy 0, który jest stanem końcowym.

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

    W przypadku 2 ciąg wejściowy kończy się 10poleceniem, po którym następuje zero lub więcej 00i 11s. Ten wzorzec jest równoważny 1następującym po nim 2k+10, a następnie zero lub więcej 11s i 00s. Eliminacja 00si 11s pozostawia ostatnią z 2k+1zer na końcu łańcucha, która reprezentuje stan końcowy.

W oparciu o powyższe, po wyeliminowaniu 00s i 11s jednocześnie w jednym pojedynczym przejściu ( 01001jest przeciw-przykładem, jeśli 00zostanie wyeliminowany w jednym przejściu, a następnie 11w drugim przejściu) z wejścia s, ostatni znak jest stanem końcowym. Dlatego udowodniono poprawność rozwiązania.

Joel
źródło
Witamy w PPCG! Doskonała odpowiedź i miły formalny dowód na to!
GammaFunction
3
Dzięki. Wydaje mi się, że ludzie mogą wątpić w takie proste rozwiązanie, które na pierwszy rzut oka wydaje się prawidłowe. Dlatego istnieje potrzeba przedstawienia na to dowodu.
Joel
9

Perl 6 , 17 bajtów

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

Wypróbuj online!

Wykorzystuje „Można połączyć te dwa wejścia do jednego wejścia, jeśli lubisz” poprzez wejście jako wartość akumulatora połączonego z polecenia np 1,[00,11]jest 10011. Jeśli to nie jest w porządku, to tylko 5 dodatkowych bajtów, aby wziąć to jako f(accumulator, commands). Zwraca dopasowany obiekt, który można przymusić do łańcucha.

Wyjaśnienie:

{                }  # 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

Zasadniczo prace bo 00i 11polecenia zrobić dosłownie nic, podczas gdy 01i 10poleceń wystarczy ustawić akumulator do drugiej cyfry polecenia. Jeśli nie ma żadnych poleceń, zamiast tego przyjmuje początkową wartość akumulatora.

Jo King
źródło
6

Zsh , 33 bajty

Lista znaków jest przekazywana jako argumenty, wartość początkowa akumulatora jest przekazywana jako stdin.

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

Wypróbuj online!


39 bajtów : jeśli polecenia muszą być pojedynczym ciągiem

Dane wejściowe są accumulator commandsargumentami.

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

Wypróbuj online!


Dla zabawy, oto 50 bajtowa rekurencyjna jedna linijka ( TIO ):

<<<${${2+`f $[$1^${2[1]}?$1:${2[2]}] ${2:2}`}:-$1}
Funkcja Gamma
źródło
6

Python 3 , 52 bajty

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

Wypróbuj online!

Naprawiono niespójny typ zwrotu dzięki Chas Brown

Pobiera dane wejściowe jako dwa ciągi; akumulator i kod.

ujemna siódemka
źródło
O nie, to było szybkie.
Wysoce promieniotwórcze
1
Fajnie, ale ma ten potencjalny problem - f(1,'11')==f(1,'01')jest False; czasami zwraca inta czasem a str. Więc może sprecyzować, że pobiera dane wejściowe jako ciąg?
Chas Brown,
@ChasBrown Dobra rozmowa, to o wiele prostsze niż to, o czym myślałem.
negatywne siedem
Fajnie, ale ponieważ twoja funkcja jest rekurencyjna, nie może być anonimowa. Powinien mieć 52 bajty .
Jitse,
5

Brachylog , 11 9 bajtów

tġ₂≠ˢtt|h

Wypróbuj online!

Ponieważ minęło już tyle czasu, że mogłem zapomnieć o drukowaniu akumulatora po każdym poleceniu , sformułowałem znacznie mniej naiwne rozwiązanie z pewną inspiracją z odpowiedzi Joela Perla.

       |     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.

Stare rozwiązanie:

Brachylog , 18 16 bajtów

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

Wypróbuj online!

-2 bajty od zmiany formatu wejściowego.

Niepowiązany ciąg
źródło
5

JavaScript (ES6), 27 bajtów

Pobiera dane wejściowe jako (a)(code), gdzie kod jest listą 2-bitowych liczb całkowitych.

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

Wypróbuj online!


JavaScript (ES6),  47  40 bajtów

Pobiera dane wejściowe jako (a)(code), gdzie kod jest łańcuchem.

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

Wypróbuj online!

W jaki sposób?

Wszystkie możliwe przypadki zostały podsumowane poniżej. Są tylko dwa przypadki, w których musimy przełączyć akumulator(za=0,x=012)) i (za=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
Arnauld
źródło
4

sed -E, 26 19 bajtów

-7 bajtów z @Cowsquack realizując usunięcie wszystkich par działa tak samo.

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

Pobiera dane wejściowe konkatenowane razem na standardowe wejście. Zainspirowany odpowiedzią Jo Kinga Perla . Usuń końcowe pary Usuń wszystkie pary, a następnie uzyskaj ostatnią cyfrę.

Wypróbuj online! Wypróbuj online!

Funkcja Gamma
źródło
1
Ostatnia linia może być prosta s/.*\B//, ale i tak zmiana podejścia nieco daje jeszcze krótsze 19 bajtów Wypróbuj online!
user41805,
1
Huh, nie sądziłem, że s/(.)\1//gto zadziała, ponieważ może usunąć koniec jednej pary i początek następnej, ale nadal działa. Świetny!
GammaFunction
@ GammaFunction s/(.)\1//gjest równoważne z s/00|11//gpokazanym w moim rozwiązaniu.
Joel
4

Retina 0.8.2 , 18 11 bajtów

(.)\1

!`.$

Wypróbuj online! Link zawiera przypadki testowe. Pobiera dane wejściowe skonkatenowane. Zaoszczędzono 6 bajtów dzięki @CowsQuack za zwrócenie uwagi na to, że usunięcie wszystkich podwójnych znaków, a następnie pobranie ostatniej pozostałej postaci działa, chociaż w rzeczywistości port oryginalnej odpowiedzi @ JoKing mógł zostać golfowany o 3 bajty nawet bez tej sztuczki.

Neil
źródło
12 bajtów Wypróbuj online!
user41805,
@ Cowsquack D'oh, kiedy pomyślisz o oddzieleniu etapów, to już jest 2-bajtowe zapisywanie, następnie zapisany jest kolejny bajt, ponieważ możesz go użyć !`.$, a następnie kolejne 4 bajty, ponieważ nie musisz ograniczać się do par końcowych ...
Neil,
4

Python 3 , 38 bajtów

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

Wypróbuj online!

Na podstawie rozwiązania Joela . Pobiera dane wejściowe jako listę początkowej wartości akumulatora (długość jeden ciąg), a następnie polecenia (długość dwa ciągi). Znajduje ostatnie polecenie o dwóch nierównych wartościach i wyświetla jego drugi znak.

Aby spadła do początkowej wartości akumulatora, gdy nie ma takich poleceń, robimy to, aby ciąg wartości początkowej o jednym znaku przeszedł test. Robimy to, sprawdzając, czy lista singletonów z ostatnim znakiem nie jest równa liście wszystkich poprzedzających znaków, która jest przekazywana przez dowolny ciąg długości-jeden lub długość-dwa ciąg z dwoma różnymi znakami.

xnor
źródło
3

Perl 5 -p , 37 33 bajtów

$\=<>;s/(.)(.)/$\=$2if$\==$1/ge}{

Wypróbuj online!

Dane wejściowe to dwa wiersze: pierwszy wiersz to sekwencja poleceń, drugi to akumulator.

Xcali
źródło
3

Python 2 , 56 bajtów

f=lambda a,c:f([a,1,0,a][int(c[:2],2)],c[2:])if c else a

Wypróbuj online!

Chas Brown
źródło
3

Galaretka , 8 6 bajtów

EÐḟṪṪo

Wypróbuj online!

-2 bajty dzięki Nickowi Kennedy'emu, który poinformował mnie o zmianie zasad. (Jego proponowany golf EÐḟFȯṪwydaje się nieco mądrzejszy, ale ma taką samą długość jak moje poprzednie rozwiązanie minuss2 .) Format wejściowy przyjmuje teraz polecenia jako listę dwuznakowych ciągów, ale stopka testowa tłumaczy dla wygody stary format.

Przetłumaczone z mojego nowszego rozwiązania Brachylog.

Stara wersja:

Galaretka , 13 bajtów

ḢẎ⁼⁹a⁸o
s2ç@ƒ

Wypróbuj online!

Nie jestem w 100% pewien, że jest to poprawne, ale udaje się to we wszystkich trzech przypadkach testowych. Traktuje polecenia jako lewy argument, a początkowy akumulator jako prawy argument.

Niepowiązany ciąg
źródło
1
Dane wejściowe mogą być podzielone na listę, więc możesz mieć EÐḟFȯṪdane wejściowe takie jak np [[0,0],[0,1],[1,1],[1,1],[0,1]].
Nick Kennedy,
Wow, zmiany w specyfikacji były naprawdę dość duże ...
Niepowiązany ciąg
3

Haskell , 29 bajtów

Definiuje nienazwaną funkcję w pierwszym wierszu z typem (Foldable t, Eq b) => b -> t [b] -> b. Na potrzeby tego kodu golfa możemy utworzyć jego instancję, gdy Char -> [String] -> Charpierwszym argumentem jest akumulator, a drugim listą ciągów, przy czym każdy ciąg jest pojedynczą komendą.

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

Wypróbuj online!

ankh-morpork
źródło
1
Ten sam bytecount, jeśli zdefiniujesz go za pomocą notacji przedrostkowej . Nie mogę uwierzyć, że napisałem prawie dokładnie tę samą odpowiedź w tym samym czasie, nawet z wyjaśnieniem podpisu typu…
cole
2

Python, 111 bajtów

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

Nie golfił. EDYCJA: AHHH Ktoś mnie pobił!

Wysoce radioaktywny
źródło
2

Haskell , 36 bajtów

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

Wypróbuj online!

Pobiera dane wejściowe jako miejsce, w f(string)(char)którym znak jest akumulatorem, a ciąg znaków jest listą poleceń.

Jo King
źródło
2

Stax , 3 bajty

F|t

Uruchom i debuguj

Dla każdej instrukcji wykonaj tłumaczenie znaków.

rekurencyjny
źródło
2

Keg , -ir, 16 bajtów

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

Wypróbuj online!

Wyjaśnione:

  1. Pobiera niejawne dane wejściowe i przesuwa wartość akumulatorów na dół

  2. Powtórz następujące czynności (długość stosu - 1 podzielona przez 2) razy

2.1 Przesuń akumulator z powrotem na górę

2.2 Porównaj pod kątem równości z pierwszą częścią polecenia

2.2.1 Jeśli to prawda, wymień akumulator, w przeciwnym razie pop zastąp

Dane wejściowe są pobierane jako początkowa wartość acc połączona ze źródłem. Na przykład

010011000
  • Pierwszy znak jest wartością acc
  • Reszta to program
Lyxal
źródło
1

Bash , 58 40 bajtów

Dodaj jeden bajt dla pełnego programu: zmień fna $0.

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

58 bajtów Wypróbuj online!

Trójka zwróci false, gdy $1jest ustawiona na 0, ale ,1na końcu zapewnia, że ​​całość ((expression))zwróci true, z wyjątkiem błędu składniowego.

Po zużyciu wszystkich argumentów występuje błąd składniowy i rekurencja się kończy.


Funkcja Gamma
źródło
1

Węgiel drzewny , 16 bajtów

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

Wypróbuj online! Link jest do pełnej wersji kodu. Bierze osobne argumenty. Wyjaśnienie:

F⪪η²

Podziel instrukcje na pary cyfr i nałóż na nie pętlę.

F⁼θ§ι⁰

Jeśli akumulator jest równy pierwszej cyfrze ...

≔§ι¹θ

... następnie przypisz do niej drugą cyfrę.

θ

Wydrukuj akumulator na końcu pętli.

Neil
źródło
1

Galaretka , 7 bajtów

fؽḂ⁹;Ṫ

Dyadic Link akceptujący program jako listę liczb całkowitych po lewej stronie i początkowy akumulator po prawej stronie, który daje liczbę całkowitą.

Wypróbuj online! Lub zobacz zestaw testowy

Jonathan Allan
źródło
Usuwam mapowanie danych wejściowych, ponieważ @GammaFunction polecił mi to zrobić.
@A_ ah OK nie mogę usunąć na telefonie komórkowym, więc będę musiał rozwiązać ten problem później
Jonathan Allan
@A_ naprawiono do pracy z 0,1,2,3 niezmapowaną wersją instrukcji jako cyfr, czy to w porządku?
Jonathan Allan
1
Tak, w porządku.
1

Runiczne Zaklęcia , 28 bajtów

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

Wypróbuj online!

Pobiera dane wejściowe jako ciąg bajtów oddzielonych spacjami (Runiczna nie rozumie list). Pierwszy bajt to stan początkowy, a co drugi bajt to program. Walidacja nie jest przeprowadzana (tzn. Zakłada, że ​​tylko prawidłowe programy są podawane jako dane wejściowe i nie ma znaczenia, jaką wartość stosuje się do reprezentowania 0i 1).

Draco18s nie ufa już SE
źródło
1

Montaż x86, 33 bajtów

Przyjmuje początkowy stan akumulatora w CL(liczba całkowita 0lub 1) i adres poleceń jako łańcuch ASCII zakończony zerem ESI. Pozostawia końcowy stan akumulatora w CL.

Skieruj instrukcję wywołania na offset 0x1B(etykieta interpretw Objaśnieniu).

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

Objaśnienie (Korzystanie ze składni 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
źródło
1

C (gcc) , 45 41 bajtów

f(a,i)char*i;{a=*i?f(a^*i?a:i[1],i+2):a;}

Wypróbuj online!

Ogolono 4 bajty dzięki @ErikF!

G. Sliepen
źródło
1
Możesz zapisać 4 bajty, używając zwykłej sztuczki polegającej na zapisaniu wartości zwracanej w pierwszym parametrze: Wypróbuj online!
ErikF
0

Kryształ , 46 bajtów

Z poleceniami w Array(Tuple(Int32,Int32)), takimi jak [{0,0}, {0,1}, {0,0}].

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

Wypróbuj online!

Jest to dość proste do zrozumienia w bardziej czytelnej formie:

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

Funkcja zapętla każde polecenie, automatycznie rozpakowując wartości krotek do ci v. Następnie ustawia statewedług wzoru

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

do czego doszedłem głównie metodą prób i błędów. Po przetworzeniu wszystkich poleceń zwraca wartość stanu.

Kinxer
źródło
0

C (clang) , 68 62 bajtów

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

Wypróbuj online!

Pobiera wskaźnik na początek ciągu źródłowego, wskaźnik na koniec ciągu źródłowego (start + strlen (start)) i początkową wartość akumulatora.

Stara wersja (drukuje ASCII 48/49 dla 0/1):

t(s,e,a)char*s,*e;{for(;s<e;++s)a=*s++-48^a?a:*s-48;putchar(a+48);}
osuka_
źródło
0

Java (JDK) , 38 bajtów

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

Wypróbuj online!

Wejścia są inti IntStreamz 0, 1, 2i 3, które odpowiadają 00, 01, 10, 11z binarnym.

Olivier Grégoire
źródło