TTT: Turing Text Tape

Oct 02 2020

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 .

  1. Richten Sie ein Array mit der Ausgabelänge ein.
  2. Füllen Sie die Einträge im Array mit Bandkopfbewegungswerten.
    1. Suchen Sie den ASCII-Wert des aktuellen Zeichens in Binärform
    2. Kehren Sie es um und konvertieren Sie eine Zahl zurück n.
    3. Subtrahieren Sie nbei Bedarf von der aktuellen Kopfhaltung und Modulo um 256, was zu einem Wert führtr
    4. r ist der Wert, den Sie im Array speichern müssen
    5. Der Kopf ist jetzt in Position n.
  3. DO READ OUT das 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 das DOfor GIVE UPund READ 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ösen ICL666I 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

8 Lynn Oct 02 2020 at 20:13

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.

5 Arnauld Oct 02 2020 at 20:09

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
5 KevinCruijssen Oct 02 2020 at 21:43

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

4 Neil Oct 03 2020 at 02:28

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.

3 UnrelatedString Oct 03 2020 at 19:21

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.

2 UnrelatedString Oct 03 2020 at 17:13

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.