2017-07-20 4 views
5

Heute habe ich versucht, ein Konto auf Esolangs.org, das esoteric programming languages Wiki zu erstellen. Ich hatte vorher schon ein paar Wikis beigetragen, und ich hatte ein oder zwei kleine Seitenänderungen, die ich beitragen wollte.

... das heißt, bis ich das CAPTCHA-Verifikationsrätsel sah, das verwendet wurde, um ein neues Konto zu erstellen.

Captcha puzzle for Esolangs.org

eine obskure Sprache für die CAPTCHA Verwenden wurde höchstwahrscheinlich als dumm in-Witz gedacht. Ich verbrachte jedoch fast eine halbe Stunde damit, die Sprache zu verstehen, um ein neues Konto zu erstellen.

Der Stack-Überlauf-Tag Auszug für beschreibt es als „eine Kreuzung zwischen Forth und Lemming.The Esolang Wiki sagt Belunge speziell erstellt wurde „zu kompilieren wie möglich mit dem Ziel, so schwierig zu sein.“ Schließlich gab ich und benutzte eine online Befunge interpreter, die mir die Antwort 52256370 gab.

Was ich nicht verstehe ist, warum die Ausgabe von 9332682811>\#+:#*9-#\[email protected]52256370 ist.

Ich habe ein paar Kommentare gesehen, die darauf hindeuten, dass es sich um eine Konvertierung von Base-10 zu Base-9 handelt. Als ich jedoch versuchte, dies zu überprüfen, indem ich 9332682811 mit einem online base converter umwandelte, erhielt ich ein Ergebnis von 26072072027.

+0

Es ist nur eine einfache Schleife und einige Arithmetik. Perl-Übersetzung erstellt von https://esolangs.org/wiki/Befunge#Instructions: http://ideone.com/40CLcK – melpomene

+0

Dies ist ein Base 9-Konverter. – user2357112

+0

Es konvertiert * von * Base 9, die '9' ist nicht Teil der Nummer, und Sie setzen die Eingabe in Rückwärts. – user2357112

Antwort

3

Dieses Programm analysiert 332682811 als Little-Endian-base-9-Integer und druckt es in base-10.

Befunge interpretiert Anweisungen auf einem 2D-Gitter (oder Torus, je nach Version) mit einem Anweisungszeiger, der sich frei in zwei Dimensionen bewegen kann. Dieses Programm ist ein Einzeiler, der Befehlszeiger bewegt sich also nur vorwärts und rückwärts.

9332682811 verschiebt diese Ziffern einzeln auf den Wertestapel von Befunge, und dann führen die folgenden Anweisungen eine einfache Schleife aus. In einer normalen Iteration der Schleife, sieht es wie folgt aus:

Instructions    Meaning          Top stack values 

9332682811>\#+:#*9-#\[email protected] 
      >    Set the instruction pointer to travel   a b 
          to the right. 
      \    Swap the top 2 values on the stack.   b a 
      #+   Nothing, since # means      b a 
          skip the next instruction. 
       :   Duplicate the top value on the stack.   b a a 
       9  Push 9.          b a a 9 
        -  Pop two values and push their difference.  b a (a-9) 
        _ Pop the top value and set the instruction  b a 
          pointer traveling right if the value is 0 
          or left otherwise. 
        \  Swap the top 2 values.      a b 
       9  Push 9.          a b 9 
       *   Pop two values and push their product.  a (b*9) 
      +   Pop two values and push their sum.   (b*9 + a) 
      >    Set the instruction pointer traveling 
          right again. 

Also, wenn der zweite Wert auf dem Stapel zu Beginn einer Iteration 9 ist, erscheint die Iteration zwei Werte b und a und schiebt b*9 + a.

Wenn der zweite Wert ist 9, die Schleife beendet und druckt den Top-Wert:

Instructions    Meaning          Top stack values 

9332682811>\#+:#*9-#\[email protected] 
        _ Pop the top value and set the instruction  b a 
          pointer traveling right if the value is 0 
          or left otherwise. 
         $ Discard the top value.      b 
         . Pop and print the top value. 
         @ 

So in der Zusammenfassung, das Programm schiebt eine Reihe von Ziffern und ersetzt wiederholt a und b mit b*9+a bis es trifft 9, das Signal zu stoppen. Dies ist ein Basis 9-Konverter.

Wenn Sie versuchen, dies mit another base converter zu überprüfen, stellen Sie sicher, dass Sie die Endiannität richtig erhalten. 332682811 ist Little-Endian, also müssen Sie es möglicherweise umkehren.

Verwandte Themen