TTT: Turing Text Tape
Einführung
Ah, INTERCAL ...
So sehr ich jeden ermutigen möchte, es online zu versuchen , ist die Textausgabe nur schmerzhaft.
Laut Dokumentation wird das "Turing Text Model" verwendet. Während es ein ... interessantes Konzept ist, macht es ungefähr so viel Spaß, wie sich selbst in den Fuß zu schießen. Und was machen wir mit einer solchen Aufgabe? Automatisieren Sie es.
Das Turing-Textmodell
Die Zeichen, die INTERCAL kennt, werden auf ein kreisförmiges Band gedruckt, das nur in die positive Richtung bewegt werden kann. Das Drucken erfolgt durch Übergeben von Bandkopfbewegungsbefehlen in einem Array an die READ OUTAnweisung. Jedes ASCII-Zeichen ist auf der Innenseite des Bandes geschrieben (auf der Außenseite befinden sich die Zeichen für die Eingabe, duh). Dies führt dazu, dass sich die Bytes der Zeichen umgekehrt auf dem Band befinden. Außerdem bewegt sich der Bandkopf entlang der Zeichenliste rückwärts, da seine Positionierung auf der Außenseite des Bandes basiert.
Der Kopf beginnt an Position 0.
Jetzt beginnt die Magie. Ich werde die Erklärung von Truttle1 verwenden, um eine Ausgabe zu erzielen .
- Richten Sie ein Array mit der Ausgabelänge ein.
- Füllen Sie die Einträge im Array mit Bandkopfbewegungswerten.
- Suchen Sie den ASCII-Wert des aktuellen Zeichens in Binärform
- Kehren Sie es um und konvertieren Sie eine Zahl zurück
n. - Subtrahieren Sie
nbei Bedarf von der aktuellen Kopfhaltung und Modulo um 256, was zu einem Wert führtr rist der Wert, den Sie im Array speichern müssen- Der Kopf ist jetzt in Position
n.
DO READ OUTdas Array.
BITTE BEACHTEN SIE
- Das Array ist vorinitialisiert mit
0, der erste Index ist1 - INTERCAL verwendet erweiterte 8-Bit-ASCII-Zeichen, daher die Bandlänge von 256.
- Zwischen 1/3 und 1/5 aller Zeilen muss mit beginnen
PLEASE. Beachten Sie, dass Sie in diesem Fall dasDOforGIVE UPundREAD OUT, aber nichts anderes löschen, wie in den Beispielen gezeigt.
Herausforderung
Geben Sie bei einer gegebenen Eingabezeichenfolge ein gültiges INTERCAL-Programm aus, das diese Zeichenfolge druckt und beendet.
Beispiele
Druckt "BUZZ"
DO ,1 <- #4
DO ,1 SUB #1 <- #190
DO ,1 SUB #2 <- #152
PLEASE DO ,1 SUB #3 <- #336
DO READ OUT ,1
PLEASE GIVE UP
Leerzeichen sind optional. Die folgenden Drucke "FIZZ"
DO,1<-#4DO,1SUB#1<-#158DO,1SUB#2<-#208DO,1SUB#3<-#312PLEASEREADOUT,1PLEASEGIVEUP
(Beispiele, die schamlos aus dem FizzBuzz-Programm von Truttle1 aus dem Video gestohlen wurden.)
Eine ungolfed Referenzimplementierung in Python 3 finden Sie hier
Regeln
- Keine Standardlücken
- Dies ist Code-Golf , kürzester Code gewinnt.
- Sie können nur Eingaben> = 1, ASCII-Zeichen erwarten.
- Das Programm darf außer
ICL774I RANDOM COMPILER BUGund keine Fehler auslösenICL666I COMPILER HAS INDIGESTION. Das erste geschieht zufällig, das zweite ist, dass C-Intercal nicht mehr genügend Speicher hat und das umgeht, was nicht Teil der Herausforderung ist
Antworten
Python 3 , 157 Bytes
t=i=0
p=o='PLEASE'
for c in input():i+=1;k=int(f'{ord(c):08b}'[::-1],2);o+=i%4//3*p+f'DO,1SUB#{i}<-#{t-k&255}';t=k
print(f'DO,1<-#{i}{o}DOREADOUT,1DOGIVEUP')
Probieren Sie es online aus!
Dies druckt \$n+3\$Anweisungen, von denen \$\left\lfloor \frac{n+5}{4} \right\rfloor\$sind höflich. Dieses Verhältnis passt kaum in das \$[1/5, 1/3]\$Höflichkeit Intervall für alle \$n \geq 1\$.
-1 Byte dank Neil.
JavaScript (Node.js) , 156 148 Byte
s=>`DO,1<-#${Buffer(s).map(c=>o+=`${i++&&~i&3?'':'PLEASE'}DO,1SUB#${i}<-#`+(p-(g=k=>p=k--&&c>>k&1|g(k)*2)(8)&255),i=p=o=""),i+o}DOREADOUT,1DOGIVEUP`
Probieren Sie es online aus!
Probieren Sie die Ausgabe in INTERCAL!
Wie?
Bitumkehr
Wir verwenden eine rekursive Funktion, um die Bits des Zeichens c umzukehren .
( g = k => // k = bit position counter
k-- && // decrement k; if it was not 0:
c >> k & 1 // bring the k-th bit of c at position 0 and isolate it
| g(k) // bitwise OR with a recursive call,
* 2 // whose result is doubled
)(8) // initial call with k = 8
Höflichkeit
Beginnend i = 0fügen wir eine höfliche Aussage ein, wenn der folgende Ausdruck falsch ist:
i++ && ~i & 3
Dies bedeutet, dass wir ein PLEASEfür das erste verarbeitete Zeichen und dann alle 4 Zeichen, beginnend mit dem dritten , einfügen .
Weder die führende Anweisung noch die beiden nachfolgenden Anweisungen sind höflich. Sie werden als markiert Lund TTjeweils in der folgenden Tabelle.
length | output structure | politeness ratio
--------+--------------------+------------------
1 | LPTT | 1/ 4 = 0.250
2 | LP-TT | 1/ 5 = 0.200 <-- lower bound
3 | LP-PTT | 2/ 6 ≈ 0.333 <-- upper bound
4 | LP-P-TT | 2/ 7 ≈ 0.286
5 | LP-P--TT | 2/ 8 = 0.250
6 | LP-P---TT | 2/ 9 ≈ 0.222
7 | LP-P---PTT | 3/10 = 0.300
8 | LP-P---P-TT | 3/11 ≈ 0.273
9 | LP-P---P--TT | 3/12 = 0.250
10 | LP-P---P---TT | 3/13 ≈ 0.231
11 | LP-P---P---PTT | 4/14 ≈ 0.286
12 | LP-P---P---P-TT | 4/15 ≈ 0.267
13 | LP-P---P---P--TT | 4/16 = 0.250
14 | LP-P---P---P---TT | 4/17 ≈ 0.235
15 | LP-P---P---P---PTT | 5/18 ≈ 0.278
.. | ... | 1/5 < r < 1/3
05AB1E , 77 74 54 Bytes
Ç₁+₁šb퀨C¥(₁%€‘‚µ,1<-#1€·,1—¨#1<-#ÿ€·‚Ø€Ä,1‘J‘ÿ€·†¿€¾
-20 Bytes durch Portierung von @ UnrelatedStrings Jelly-Antwort , also stellen Sie sicher, dass Sie ihn positiv bewerten !!
Ausgänge mit Leerzeichen an #1 DO,1 SUB#, DO READ OUTund DO GIVE UP.
Probieren Sie es online aus oder überprüfen Sie einige weitere Testfälle .
Probieren Sie die Ausgabe in INTERCAL.
Erläuterung:
Ç # Convert the (implicit) input-string to a list of codepoint integers
₁+ # Add 256 to each value
₁š # Prepend 256 at the front of the list
b # Convert each value to a binary string
í # Reverse each
۬ # Remove the last digit of each
C # Convert each from binary back to a base-10 integer
¥ # Take the forward differences (deltas) of this list
( # Negate each difference
₁% # Take modulo-256 on each
€ # Map over each integer:
‘‚µ,1<-#1€·,1—¨#1<-#ÿ€·‚Ø€Ä,1‘
# Push dictionary string "PLEASE,1<-#1 DO,1 SUB#1<-#ÿ DO READ OUT",
# where the `ÿ` is automatically filled with the integer
J # Join this list of strings together
‘ÿ€·†¿€¾ # Push string "ÿ DO GIVE UP", where the `y` is filled with the string
# (after which the result is output implicitly)
Sehen Sie diese 05AB1E Spitze von mir (Abschnitt Wie das Wörterbuch benutzen? ) Zu verstehen , warum ‘‚µ,1<-#1€·,1—¨#1<-#ÿ€·‚Ø€Ä,1‘ist "PLEASE,1<-#1 DO,1 SUB#1<-#ÿ DO READ OUT"und ‘ÿ€·†¿€¾ist "ÿ DO GIVE UP".
Holzkohle , 90 89 85 Bytes
DO,1<-#ILθ⊞υ⁰⭆θ⪫⟦×PLEASE⊖﹪κ³DO,1SUB#⊕κ<-#﹪⁻⊟υΣ⊞Oυ⍘⮌◧⍘℅ι !⁸ !²⁵⁶⟧ω”Z1∨?AE₂-πK↷Y:γüD0←✂
Probieren Sie es online aus! Der Link führt zur ausführlichen Version des Codes. Erläuterung:
DO,1<-#ILθ
Drucken Sie die Anweisung aus, um die Länge der Ausgabe festzulegen.
⊞υ⁰
Beginnen Sie mit dem Kopf an Position 0. Der Wert wird tatsächlich in der vordefinierten leeren Liste gespeichert, da wir den Wert der Liste später mithilfe der Funktionen Pop und PushOperator ändern können, anstatt auf einen Befehl zurückgreifen zu müssen.
⭆θ⪫⟦...⟧ω
Durchlaufen Sie die Zeichen und drucken Sie die Verkettung von 5 Ausdrücken für jedes Zeichen. (Dies ist etwas golfiger, da die Verkettung die beiden numerischen Werte in der Liste automatisch stringifiziert).
×PLEASE⊖﹪κ³
Sei höflich bei jedem dritten Charakter. Es gibt auch ein PLEASEam Ende, so dass das Höflichkeitsverhältnis ¹⁄₄, ¹⁄₅, ²⁄₆, ²⁄₇, ²⁄₈, ³⁄₉, ³⁄₁₀, ³⁄₁₁ ist ... danach das Höflichkeitsverhältnis tendiert zu ¹⁄₃.
DO,1SUB#⊕κ<-#
Drucken Sie den 1-indizierten Index am Anfang der Anweisung, um das Zeichen auszugeben.
﹪⁻⊟υΣ⊞Oυ⍘⮌◧⍘℅ι !⁸ !²⁵⁶
Berechnen Sie die umgekehrte Binärzahl des aktuellen Zeichens, geben Sie die Differenz vom Kopf aus und aktualisieren Sie den Kopf mit der neuen umgekehrten Binärdatei in einem Ausdruck. Die Binärdatei wird mit Leerzeichen für codiert, 0sodass sie leicht auf 8 Bit aufgefüllt werden kann. Außerdem werden durch die Verwendung von Zeichenfolgen Trennzeichen vermieden, die ansonsten erforderlich wären.
”Z1∨?AE₂-πK↷Y:γüD0←✂
Drucken Sie die komprimierten nachfolgenden Anweisungen aus, um die Zeichenfolge auszugeben und zu beenden. Durch die Zeichenfolgenkomprimierung muss ich mir keine Gedanken darüber machen, wie oft ich weiter ausgeben möchte PLEASE.
Python 3 , 128 Bytes
t=0
for c in input():n=int(f'{ord(c):08b}'[::-1],2);print(f'PLEASE,1<-#1DO,1SUB#1<-#{t-n&255}DOREADOUT,1');t=n
print('DOGIVEUP')
Probieren Sie es online aus!
Erzeugt eine ähnliche Ausgabe wie meine Jelly-Lösung, ist jedoch ebenso eine Modifikation der Python-Lösung von Lynn.
Ursprünglich wurde der "Walross" -Operator von Python 3.8 verwendet , aber es stellte sich heraus, dass er nicht um 2 Bytes kürzer war.
Gelee , 62 59 Bytes
OŻ+⁹BUṖ€Ḅ_Ɲ%⁹“!![ẓ,ȮFẈẋ⁹⁾V!ĖÐĊnß6ṛ»;;“Œ°þ[ṪȦṄ»Ʋ€;“©⁴Œ½OлŒu
Probieren Sie es online aus!
Verwendet eine Array-Länge von 1 und druckt wiederholt, um beim Indizieren zu sparen, und setzt die Länge wiederholt auf eins, um die Höflichkeitslogik zu sparen: Längenelement-Druck bildet eine sehr bequeme Einheit von 3.
Ohne String-Komprimierung:
OŻ+⁹BUṖ€Ḅ_Ɲ%⁹“please,1<-#1do,1sub#1<-#”;;“doreadout,1”Ʋ€;“dogiveup”Œu
Versuchen Sie ein Ergebnis online!
O Codepoints of input.
Ż Prepend zero,
+⁹ add 256 to each,
B convert each to binary.
U Reverse each,
Ṗ€ remove last element from each,
Ḅ convert from binary.
_Ɲ Subtract all adjacent pairs,
%⁹ and modulo 256.
Ʋ€ Map:
; prepend to the number
“...» "please,1<-#1do,1sub#1<-#",
; append to that
“...» "doreadout,1".
;“...» Append "dogiveup" to the whole result
Œu and uppercase.