"Talk" ist eine baroquifizierte akkumulatorbasierte Sprache, die als Antwort auf Dennis ' Zitat auf talk.tryitonline.net erstellt wird.
Waiting for someone to create an esolang called talk.
. Die "Talk" -Sprache hat 4 Befehle:
00
Wenn der Akku 0 ist, setzen Sie den Akku auf 0.01
Wenn der Akku 0 ist, setzen Sie den Akku auf 1.10
Wenn der Akku 1 ist, setzen Sie den Akku auf 0.11
Wenn der Akku 1 ist, setzen Sie den Akku auf 1.
Eingang:
Die Eingabe kann über jede akzeptable Eingabemethode nach unseren Standard-E / A-Regeln erfolgen.
Es gibt zwei Eingänge, den anfänglichen Akkumulatorwert und das Programm. Sie können diese beiden Eingaben zu einer Eingabe zusammenführen oder Ihre Eingabe in gültige Befehle aufteilen (z. B. als Liste verwenden, z. B.
[00, 01, 00]
), wenn Sie möchten.
Ausgabe:
- Am Ende einer Befehlsausführung wird der Akkumulator implizit ausgegeben.
Regeln:
- Die Eingabe kann eine einzelne Zeichenfolge oder Zeichenliste sein.
- Da dies Code-Golf ist, gewinnt die kürzeste Antwort in Bytes.
- Wir nehmen Ziffern oder Zeichenfolgen / Zeichen.
Testfälle:
0 0001111101 -> 1
0 000100 -> 1
0 11001000 -> 0
Bestenlisten
Hier ist ein Stack-Snippet, mit dem Sie sowohl eine regelmäßige Rangliste als auch eine Übersicht der Gewinner nach Sprache erstellen können.
Um sicherzustellen, dass Ihre Antwort angezeigt wird, beginnen Sie Ihre Antwort mit einer Überschrift unter Verwendung der folgenden Markdown-Vorlage:
# Language Name, N bytes
Wo N
ist die Größe Ihrer Einreichung? Wenn Sie Ihren Score zu verbessern, Sie können alte Rechnungen in der Überschrift halten, indem man sich durch das Anschlagen. Zum Beispiel:
# Ruby, <s>104</s> <s>101</s> 96 bytes
Wenn Sie dort mehrere Zahlen in Ihre Kopfzeile aufnehmen möchten (z. B. weil Ihre Punktzahl die Summe von zwei Dateien ist oder Sie die Strafen für Dolmetscherflaggen separat auflisten möchten), stellen Sie sicher, dass die tatsächliche Punktzahl die letzte Zahl in der Kopfzeile ist:
# Perl, 43 + 2 (-p flag) = 45 bytes
Sie können den Sprachnamen auch zu einem Link machen, der dann im Leaderboard-Snippet angezeigt wird:
# [><>](http://esolangs.org/wiki/Fish), 121 bytes
lang.tryitonline.net
(jetzt ist estio.run/#lang
). Eine Sprache namens Talk würde also zu Verwechslungen mit der URL des kürzlich erstellten Chatrooms führen, nämlichtalk.tryitonline.net
Antworten:
Gelee , 3 Bytes
Die Eingabe ist eine einzelne Liste: der Akkumulator, gefolgt von den Paaren.
Probieren Sie es online aus!
Wie es funktioniert
Das
y
Atom führt eine Transliteration durch; [a, b]y
c ersetzt a durch b , gibt also b zurück, wenn a = c und c, wenn a ≠ c .y@/
Faltet / reduziert die Eingabe durchy
vertauschte Argumente und führt eine Transliteration pro Paar durch.quelle
Python 3 , 43 Bytes
Probieren Sie es online aus!
Die Funktion verwendet eine einzelne Zeichenfolge als Eingabe, wobei das erste Zeichen der Anfangszustand ist und der Rest der Zeichenfolge die Befehle darstellt. Diese Lösung kann problemlos in andere Sprachen portiert werden, die reguläre Ausdrücke besser unterstützen.
Der schwierige Teil besteht darin, zu beweisen, dass die Lösung das richtige Ergebnis liefert. Um dies zu sehen, benötigen wir eine gründliche Analyse der Befehle. Erstens können wir sehen, dass die Befehle die folgenden Eigenschaften haben:
00
und11
Beibehaltung des Akkumulatorstatus.01
und10
machen den Akkumulatorstatus unabhängig vom ursprünglichen Status mit dem zweiten Bit identisch.Daher ist der endgültige Akkumulatorzustand:
01
oder ein10
Befehl vorhanden ist, entspricht der Endzustand dem Ausgangszustand.10
oder01
Befehls.Als nächstes werden wir zeigen, dass die Lösung in beiden Fällen das richtige Ergebnis liefert. Wir werden die Aussage für den Endzustand beweisen
0
und der Endzustand von1
kann analog bewiesen werden. Wenn der Endzustand0
der Fall ist, erfolgt die Eingabe in einer der folgenden Formen:^0{2k+1}11(11|00)*
Für Fall 1 muss die Eingabezeichenfolge
s
mit2k+1
0s beginnen, gefolgt von11
und00
Befehlen. Das Eliminieren von00
s und11
s ergibt eine einzige0
, die der Endzustand ist..+10{2k+1}11(11|00)*
In Fall 2 endet die Eingabezeichenfolge mit einem
10
Befehl, gefolgt von null oder mehr00
und11
s. Dieses Muster entspricht a1
gefolgt von2k+1
0s und dann null oder mehr11
s und00
s. Durch Eliminieren von00
s und11
s bleibt die letzte der2k+1
Nullen am Ende der Zeichenfolge zurück, die den Endzustand darstellt.Basierend auf all dem oben Gesagten ist nach dem gleichzeitigen Eliminieren von
00
s und11
s in einem einzigen Durchgang (01001
ist ein Gegenbeispiel, wenn00
in einem Durchgang und dann11
in einem anderen Durchgang eliminiert wird )s
das letzte Zeichen der Endzustand. Damit ist die Richtigkeit der Lösung bewiesen.quelle
Perl 6 , 17 Bytes
Probieren Sie es online aus!
Nutzt „Sie können fusionieren diese beiden Eingänge in einen Eingang , wenn Sie wie“ durch die Eingabe als Akkumulatorwert unter verkettet mit den Befehlen zB
1,[00,11]
ist10011
. Wenn dies nicht in Ordnung ist, sind es nur 5 zusätzliche Bytes, um es als zu nehmenf(accumulator, commands)
. Gibt ein Übereinstimmungsobjekt zurück, das zu einer Zeichenfolge gezwungen werden kann.Erläuterung:
Grundsätzlich funktioniert dies, weil die Befehle
00
und11
buchstäblich nichts bewirken, während die Befehle01
und10
den Akkumulator nur auf die zweite Ziffer des Befehls setzen. Wenn keine Befehle vorhanden sind, wird stattdessen der Anfangswert des Akkumulators verwendet.quelle
Zsh , 33 Bytes
Die Zeichenliste wird als Argumente übergeben, der Anfangswert des Akkumulators als stdin.
Probieren Sie es online aus!
39 Bytes : Wenn die Befehle eine einzelne Zeichenfolge sein müssen
Eingabe ist
accumulator
commands
als Argumente.Probieren Sie es online aus!
Zum Spaß hier ein rekursiver 50-Byte -Einzeiler ( TIO ):
quelle
Python 3 , 52 Bytes
Probieren Sie es online aus!
Inkonsistenter Rückgabetyp dank Chas Brown behoben
Nimmt die Eingabe als zwei Zeichenfolgen auf. der Akku und der Code.
quelle
f(1,'11')==f(1,'01')
istFalse
; es gibt manchmal einint
und manchmal einstr
. Geben Sie also an, ob die Eingabe als Zeichenfolge verwendet werden soll.Brachylog ,
119 BytesProbieren Sie es online aus!
Da ich lange genug vergessen habe, den Akku nach jedem Befehl zu drucken , habe ich eine deutlich weniger naive Lösung formuliert, die sich von Jo Kings Perl-Antwort inspirieren lässt.
Alte Lösung:
Brachylog ,
1816 BytesProbieren Sie es online aus!
-2 Bytes vom Ändern des Eingabeformats.
quelle
JavaScript (ES6), 27 Byte
Nimmt die Eingabe als
(a)(code)
, wobei Code eine Liste von 2-Bit-Ganzzahlen ist.Probieren Sie es online aus!
JavaScript (ES6),
4740 ByteNimmt die Eingabe als
(a)(code)
, wobei Code eine Zeichenfolge ist.Probieren Sie es online aus!
Wie?
quelle
sed- E,
2619 BytesEine satte -7 Bytes von @Cowsquack durch Realisieren, dass alle Paare entfernt werden, funktioniert ebenfalls.
Nimmt Eingaben auf stdin zusammen. Inspiriert von Jo Kings Perl-Antwort .
Nachlaufende Paareentfernen Entfernen Sie alle Paare und erhalten Sie die letzte Ziffer.Probieren Sie es online aus!Probieren Sie es online aus!quelle
s/.*\B//
, aber wenn Sie den Ansatz leicht ändern, erhalten Sie noch kürzere 19 Bytes. Probieren Sie es online aus!s/(.)\1//g
das funktionieren würde, da es das Ende eines Paares und den Anfang des nächsten entfernen könnte, aber es funktioniert immer noch. Ausgezeichnet!s/(.)\1//g
entspricht ders/00|11//g
in meiner Lösung gezeigten.Retina 0,8,2 ,
1811 BytesProbieren Sie es online aus! Link enthält Testfälle. Nimmt verkettete Eingaben entgegen. Dank @CowsQuack wurden 6 Bytes gespart, weil darauf hingewiesen wurde, dass das Entfernen aller doppelten Zeichen und das anschließende Entfernen des letzten verbleibenden Zeichens funktioniert, obwohl der Port von @ JoKings ursprünglicher Antwort auch ohne diesen Trick um 3 Bytes hätte gespielt werden können.
quelle
!`.$
, und dann weitere 4 Bytes, weil Sie sich nicht auf nachfolgende Paare beschränken müssen ...Python 3 , 38 Bytes
Probieren Sie es online aus!
Basierend auf Joels Lösung . Nimmt die Eingabe als Liste des anfänglichen Akkumulatorwerts (Zeichenfolge Länge eins) gefolgt von den Befehlen (Zeichenfolgen Länge zwei). Findet den letzten Befehl mit zwei ungleichen Werten und gibt sein zweites Zeichen aus.
Damit dies auf den anfänglichen Akkumulatorwert fällt, wenn keine solchen Befehle vorhanden sind, machen wir es so, dass die Zeichenfolge mit einem einzelnen Zeichen den Test besteht. Dazu prüfen wir, ob eine Singleton-Liste mit dem letzten Zeichen ungleich einer Liste aller vorhergehenden Zeichen ist, die von einer beliebigen Zeichenfolge der Länge 1 oder 2 mit zwei verschiedenen Zeichen übergeben wird.
quelle
Perl 5
-p
,3733 BytesProbieren Sie es online aus!
Die Eingabe besteht aus zwei Zeilen: Die erste Zeile ist die Befehlssequenz, die zweite ist der Akkumulator.
quelle
Python 2 , 56 Bytes
Probieren Sie es online aus!
quelle
Gelee ,
86 BytesProbieren Sie es online aus!
-2 Bytes dank Nick Kennedy, der mich über eine Regeländerung informiert hat. (Sein vorgeschlagenes Golfspiel
EÐḟFȯṪ
scheint etwas klüger zu sein, hat aber die gleiche Länge wie meine vorherige Lösung minuss2
.) Das Eingabeformat verwendet die Befehle jetzt als Liste von Zeichenfolgen mit zwei Zeichen, aber die Testfußzeile wird aus Bequemlichkeitsgründen aus dem alten Format übersetzt.Übersetzt aus meiner neueren Brachylog-Lösung.
Alte Version:
Gelee , 13 Bytes
Probieren Sie es online aus!
Ich bin nicht 100% sicher, ob dies korrekt ist, aber es gelingt in allen drei Testfällen. Nimmt die Befehle als linkes Argument und den anfänglichen Akkumulator als rechtes Argument.
quelle
EÐḟFȯṪ
mit der Eingabe z[[0,0],[0,1],[1,1],[1,1],[0,1]]
.Haskell , 29 Bytes
Definiert eine unbenannte Funktion in der ersten Zeile mit Typ
(Foldable t, Eq b) => b -> t [b] -> b
. Für die Zwecke dieses Code-Golfs können wir es so instanziieren,Char -> [String] -> Char
dass das erste Argument der Akkumulator und das zweite eine Liste von Zeichenfolgen ist, wobei jede Zeichenfolge ein einzelner Befehl ist.Probieren Sie es online aus!
quelle
Python, 111 Bytes
Ungolfed. EDIT: AHHH Jemand hat mich geschlagen!
quelle
Haskell , 36 Bytes
Probieren Sie es online aus!
Nimmt die Eingabe so
f(string)(char)
an, dass das Zeichen der Akkumulator und die Zeichenfolge die Liste der Befehle ist.quelle
05AB1E , 3 Bytes
Probieren Sie es online aus!
Reißverschluss, auf den Stapel werfen, ersetzen.
quelle
Stax , 3 Bytes
Führen Sie es aus und debuggen Sie es
Führen Sie für jede Anweisung eine Zeichenübersetzung durch.
quelle
Bash ,
5840 BytesFügen Sie ein Byte für ein vollständiges Programm hinzu: Wechseln Sie
f
zu$0
.58 BytesProbieren Sie es online aus!Das Ternär gibt false zurück, wenn
$1
es auf gesetzt ist0
, aber das,1
am Ende stellt sicher, dass das Ganze((expression))
true zurückgibt, mit Ausnahme eines Syntaxfehlers.Wenn alle Argumente verbraucht sind, tritt ein Syntaxfehler auf und die Rekursion endet.
quelle
Holzkohle , 16 Bytes
Probieren Sie es online aus! Der Link führt zur ausführlichen Version des Codes. Nimmt separate Argumente. Erläuterung:
Teilen Sie die Anweisungen in Ziffernpaare auf und durchlaufen Sie sie.
Wenn der Akku gleich der ersten Ziffer ist ...
... dann weisen Sie ihm die zweite Ziffer zu.
Drucken Sie den Akku am Ende der Schleife.
quelle
MATL ,
1312 BytesNimmt die Eingabe als zweispaltige Matrix, in der jede Zeile ein Befehl und eine Zahl ist
Probieren Sie es online aus! Oder überprüfen Sie alle Testfälle
quelle
Gelee , 7 Bytes
Ein dyadischer Link, der das Programm als Liste von Ganzzahlen links und den anfänglichen Akkumulator rechts akzeptiert, der eine Ganzzahl ergibt.
Probieren Sie es online aus! Oder sehen Sie sich eine Testsuite an
quelle
PHP , 38 Bytes
Probieren Sie es online aus!
Grundsätzlich Port von Jo Kings Idee .
quelle
Runenverzauberungen , 28 Bytes
Probieren Sie es online aus!
Nimmt die Eingabe als eine Reihe von durch Leerzeichen getrennten Bytes auf (Runic versteht keine Listen). Das erste Byte ist der Anfangszustand und jedes zweite Byte ist das Programm. Es erfolgt keine Prüfung (dh er nimmt nur dann gültig Programme werden als Eingabe gegeben und es ist egal, was Wert verwendet wird , darstellen
0
und1
).quelle
x86-Assembly, 33 Byte
Nimmt den anfänglichen Akkumulatorstatus in
CL
(Ganzzahl0
oder1
) und die Adresse der Befehle als ASCII-Zeichenfolge mit Nullterminierung aufESI
. Lässt den endgültigen Akkumulatorzustand inCL
.Richten Sie die Aufrufanweisung auf Offset
0x1B
(Beschriftunginterpret
in der Erläuterung).Erläuterung (unter Verwendung der Intel-Syntax):
quelle
C (gcc) ,
4541 BytesProbieren Sie es online aus!
4 Bytes dank @ErikF rasiert!
quelle
Keg ,
-ir
16 BytesProbieren Sie es online aus!
Erklärt:
Nimmt die implizite Eingabe und verschiebt den Akkumulatorwert nach rechts nach unten
Wiederholen Sie die folgenden Schritte (Länge des Stapels - 1 geteilt durch 2)
2.1. Schieben Sie den Akku wieder nach oben
2.2. Vergleichen Sie die Gleichheit mit dem ersten Teil des Befehls
2.2.1. Wenn dies der Fall ist, ersetzen Sie den Akku, andernfalls setzen Sie den Ersatz ein
Die Eingabe wird als anfänglicher acc-Wert verwendet, der mit der Quelle verknüpft ist. Z.B
quelle
Kristall , 46 Bytes
Mit Befehlen in einem
Array(Tuple(Int32,Int32))
, wie z[{0,0}, {0,1}, {0,0}]
.def f(s,i);i.map{|c,v|s+=~(s^c)&(s^v)%2};s;end
Probieren Sie es online aus!
Es ist ziemlich einfach in einer besser lesbaren Form zu verstehen:
Die Funktion durchläuft jeden Befehl und entpackt die Tupelwerte automatisch in
c
undv
. Es setzt dann diestate
durch die Formelwas ich meistens durch Versuch und Irrtum erreicht habe. Sobald alle Befehle verarbeitet wurden, wird der Statuswert zurückgegeben.
quelle
C (Klirren) ,
6862 BytesProbieren Sie es online aus!
Nimmt einen Zeiger auf den Anfang der Quellzeichenfolge, einen Zeiger auf das Ende der Quellzeichenfolge (start + strlen (start)) und den anfänglichen Akkumulatorwert.
Alte Version (druckt ASCII 48/49 für 0/1):
quelle
Java (JDK) , 38 Byte
Probieren Sie es online aus!
Die Eingänge sind
int
und einIntStream
von0
,1
,2
oder3
, die entsprechen00
,01
,10
,11
von binär.quelle