Pure Sourcery - Formungsprogramme, die die Ziffern 0 bis 9 ausgeben

21

Hier ist eine 5 x 7-Pixelschrift für die Ziffern 0 bis 9:

.███.
█...█
█...█
█...█
█...█
█...█
.███.

..█..
███..
..█..
..█..
..█..
..█..
█████

.███.
█...█
....█
...█.
..█..
.█...
█████

.███.
█...█
....█
..██.
....█
█...█
.███.

█..█.
█..█.
█..█.
█████
...█.
...█.
...█.

█████
█....
█....
.███.
....█
█...█
.███.

.███.
█...█
█....
████.
█...█
█...█
.███.

█████
....█
....█
...█.
...█.
..█..
..█..

.███.
█...█
█...█
.███.
█...█
█...█
.███.

.███.
█...█
█...█
.████
....█
█...█
.███.

(Diese Schriftart und diese Seite sehen wahrscheinlich besser aus, wenn Sie diesen JavaScipt-Code in Ihrer Browserkonsole oder in der URL-Leiste mit dem Präfix javascript:: ausführen $('#question pre,.answer pre').css('line-height',1).)

Schreiben Sie zwei gleich große rechteckige Textblöcke, einen zur Darstellung der Leerzeichen ( .) in der obigen Schriftart und einen zur Darstellung der ausgefüllten Leerzeichen ( ).

Wenn diese beiden Textblöcke im gleichen 5 × 7-Muster wie eine der obigen Ziffern angeordnet sind, sollte der resultierende große Textblock ein Programm sein, das diese Ziffer auf stdout druckt. Dies sollte für alle 10 Ziffern funktionieren.

Zum Beispiel, wenn Ihr .Textblock war

---
'''

und dein Textblock war

ABC
123

dann das programm

---ABCABCABC---
'''123123123'''
ABC---------ABC
123'''''''''123
ABC---------ABC
123'''''''''123
ABC---------ABC
123'''''''''123
ABC---------ABC
123'''''''''123
ABC---------ABC
123'''''''''123
---ABCABCABC---
'''123123123'''

sollte ausgeben 0. Ebenso das Programm

------ABC------
''''''123''''''
ABCABCABC------
123123123''''''
------ABC------
''''''123''''''
------ABC------
''''''123''''''
------ABC------
''''''123''''''
------ABC------
''''''123''''''
ABCABCABCABCABC
123123123123123

sollte ausgeben 1, und so weiter bis zum programm für 9.

Sie können dieses Stack-Snippet verwenden, um Programme in Ziffernform zu erstellen:

<style>textarea{font-family:monospace;}</style><script>function go(){var t=parseInt(document.getElementById("digit").value[0]);if(isNaN(t))return void alert("Invalid digit.");for(var e=document.getElementById("empty").value.split("\n"),n=document.getElementById("filled").value.split("\n"),l=[],o=0;o<7*e.length;o++){l[o]="";for(var d=0;5>d;d++)l[o]+=font[t][Math.floor(o/e.length)][d]?n[o%n.length]:e[o%e.length]}document.getElementById("output").value=l.join("\n")}font=[[[0,1,1,1,0],[1,0,0,0,1],[1,0,0,0,1],[1,0,0,0,1],[1,0,0,0,1],[1,0,0,0,1],[0,1,1,1,0]],[[0,0,1,0,0],[1,1,1,0,0],[0,0,1,0,0],[0,0,1,0,0],[0,0,1,0,0],[0,0,1,0,0],[1,1,1,1,1]],[[0,1,1,1,0],[1,0,0,0,1],[0,0,0,0,1],[0,0,0,1,0],[0,0,1,0,0],[0,1,0,0,0],[1,1,1,1,1]],[[0,1,1,1,0],[1,0,0,0,1],[0,0,0,0,1],[0,0,1,1,0],[0,0,0,0,1],[1,0,0,0,1],[0,1,1,1,0]],[[1,0,0,1,0],[1,0,0,1,0],[1,0,0,1,0],[1,1,1,1,1],[0,0,0,1,0],[0,0,0,1,0],[0,0,0,1,0]],[[1,1,1,1,1],[1,0,0,0,0],[1,0,0,0,0],[0,1,1,1,0],[0,0,0,0,1],[1,0,0,0,1],[0,1,1,1,0]],[[0,1,1,1,0],[1,0,0,0,1],[1,0,0,0,0],[1,1,1,1,0],[1,0,0,0,1],[1,0,0,0,1],[0,1,1,1,0]],[[1,1,1,1,1],[0,0,0,0,1],[0,0,0,0,1],[0,0,0,1,0],[0,0,0,1,0],[0,0,1,0,0],[0,0,1,0,0]],[[0,1,1,1,0],[1,0,0,0,1],[1,0,0,0,1],[0,1,1,1,0],[1,0,0,0,1],[1,0,0,0,1],[0,1,1,1,0]],[[0,1,1,1,0],[1,0,0,0,1],[1,0,0,0,1],[0,1,1,1,1],[0,0,0,0,1],[1,0,0,0,1],[0,1,1,1,0]]]</script><textarea id='empty' rows='8' cols='32' placeholder='empty space text block...'></textarea><textarea id='filled' rows='8' cols='32' placeholder='filled space text block...'></textarea><br>Digit <input id='digit' type='text' value='0'> <button type='button' onclick='go()'>Generate</button><br><br><textarea id='output' rows='16' cols='64' placeholder='output...' style='background-color: #eee;' readonly></textarea>

Einzelheiten

  • Keines der 10 großen Textblockprogramme sollte Eingaben erfordern. Geben Sie nur die einzelne Ziffer plus einen optionalen abschließenden Zeilenumbruch aus. Ausgabe auf stdout oder eine ähnliche Alternative.
  • Keines der Programme darf seinen eigenen Quellcode lesen oder darauf zugreifen. Behandle dies wie eine strenge Herausforderung für Quine .
  • Die Textblöcke dürfen nicht identisch sein und müssen Dimensionen ungleich Null haben.
  • Die Textblöcke können beliebige Zeichen mit Ausnahme der Zeilenendezeichen enthalten .
  • Die 10 Programme müssen vollwertige Programme sein, die in derselben Sprache geschrieben sind. Sie sind keine REPL- Schnipsel. Optional können Sie allen Zeilen oder keiner Zeile eine nachgestellte Zeile hinzufügen.

Wertung

Ihre Punktzahl ist die Fläche (Breite mal Höhe) eines Ihrer Textblöcke. (Sie haben die gleiche Größe, daher macht es keinen Sinn, beide Blöcke zu zählen.) Die Fläche des Beispiels beträgt 3 x 2, was einer Punktzahl von 6 entspricht.

Die niedrigste Punktzahl gewinnt. Bei Stimmengleichheit gewinnt die Antwort mit der höchsten Stimmenzahl.

Calvins Hobbys
quelle
Sie können Ihren Code erheblich verbessern. var t=parseInt(document.getElementById("digit").value[0]);if(isNaN(t))return void alert("Invalid digit.");kann geschrieben werden als var t=document.getElementById("digit").value[0]/1;if(t!=t)return void alert("Invalid digit.");, was das gleiche ist, aber kürzer. Es gibt noch ein paar Dinge, die Sie verbessern können, aber es sieht großartig aus!
Ismael Miguel
4
@IsmaelMiguel TBH Ich habe es durch einen JS-Minifier geschickt, um es in eine Zeile zu bekommen. Es war nie zum Golfen gedacht.
Calvins Hobbys
Oh, Alter ... Das ist ein bisschen faul ... Bei einer Frage zum Golfen posten Sie einen Code, der nicht zum Golfen gehört ... Aber hey, ich verstehe und sage das nur. Sie müssen nicht folgen, was ich gesagt habe. Aber es ist eine gute Sache.
Ismael Miguel
6
@IsmaelMiguel Ich habe einen unbenutzten Utility- Code gepostet , der vermutlich so gut wie möglich lesbar sein sollte, damit Fehler leichter zu erkennen sind. Aber solange es funktioniert, hat die Codegröße des Stack-Snippets buchstäblich keine Auswirkung auf das Ergebnis der Herausforderung.
Calvins Hobbys
3
text blocks may not be identicalJa wirklich? Ich möchte, dass jemand gegen diese Regel verstößt, indem er zwei identische Codeblöcke gibt, die auf magische Weise verschiedene Ziffern zurückgeben, wenn jede Zahl genau den gleichen Code hat ^^
Falco

Antworten:

13

CJam, 20 18 14 13 12 * 1 = 12

Probieren Sie es online aus: 0 , 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9

Block leeren

];BG*K+ :BD%

Solider Block

];B9+33%:B4/

Erläuterung

Ich habe eine ähnliche Strategie wie die Sp3000-Lösung angewendet , bei der jeder Block eine Multiplikation, eine Addition und (möglicherweise) eine Modulo-Operation für eine Variable ausführt und den Wert zurückspeichert. Um eine optimale Lösung zu finden, habe ich gute alte Gewalt angewendet. Ich habe ein Programm geschrieben, das den Raum aller möglichen Anfangswerte (die Anfangswerte von CJam-Variablen) und viele Millionen möglicher Paare von Transformationsfunktionen durchsucht, sodass die Ausgabe für jede Ziffernform eindeutig ist. Dann habe ich die Ergebnisse nach solchen gefiltert, dass das Endergebnis für Ziffernformen, die in einem leeren Block enden, von denen es 8 gibt, über eine weitere Multiplikations-, Additions- und Modulo-Formel wieder auf das richtige Ergebnis abgebildet werden kann.

Nach ein paar Tagen CPU-Suchzeit ist das beste Ergebnis bis jetzt eine Größe von 12! Diese Lösung beginnt mit einem Wert von 11, die Transformationsfunktion für leere Blöcke ist x * 16 + 20, die Ergebnisfunktion für leere Blöcke ist x % 13, die Transformationsfunktion für feste Blöcke ist (x + 9) % 33und die Ergebnisfunktion für feste Blöcke ist x / 4.

Runer112
quelle
23

> <> (Fisch) , 5 × 10 = 50

Block leeren

   \   !9 
4n;    n/ 
1n;\      
       \  
0n;n7\\\  

Solider Block

   \; n8/ 
     /!/!v
     \  ;6
3n;\ ! /nn
2n;n5<  8;

Dieser Code enthält keine Logik oder Arithmetik und verwendet nur statische Umleitungen des 2D-Befehlszeigers (IP) von> <> mit 'Spiegeln' ( /und \) und zwei 'Pfeilen' ( <und v). Der einzige andere Durchflussregler ist das 'Trampolin' ( !), das durch das nächste Zeichen springt.

Die IP beginnt in der oberen linken Ecke in Richtung Osten. Nach einigen Umleitungen erreicht es eine Zahl, die auf den Stapel geschoben und mit ausgedruckt wird, nund das Programm wird mit beendet ;.

Der Programmablauf

Ein Block "erkennt" den aktuellen Status des Programms daran, an welchem ​​Punkt die IP eingegangen ist, und entscheidet anhand des Status, in welche Richtung der Zeiger ausgegeben werden soll (welcher Block als nächstes ausgeführt werden soll) und an welcher genauen Position der Zeiger sollte links sein (das wird der neue Zustand sein). Natürlich machen die Blöcke keine Logik, das ganze Verhalten kommt von den Redirectors.

randomra
quelle
Ich hatte auf eine Antwort wie diese gehofft. Pure Magie.
EagleV_Attnam
11

CJam, 23 22 19 * 1 = 19

Leerer Block:

];G)B%:G"73860594"=

Solider Block:

];GW*B+3*D%:G    7-

Probieren Sie es online aus .

Ich versuche, mit mathematischen Zufällen und Misserfolgen Glück zu haben, daher hier ein etwas anderer Ansatz für die Zuordnung von Eindeutigkeiten als bei Martins Lösung.

Beginnen Sie mit 16. Leere Blöcke addieren 1 und nehmen Sie Modulo 11. Volle Blöcke multiplizieren mit -1, addieren mit 11, multiplizieren mit 3, dann nehmen Sie Modulo 13. Dies ist eine magische Abbildung 03456789(der Ziffern, die auf einem leeren Block enden) 41753026, auf die wir die Indizierung verwenden richtig machen. 12ordentlich zuzuordnen 89, was wir durch subtrahieren von 7 beheben können.

Sp3000
quelle
7

CJam, 28 27 × 1 = 27

Hier ist ein Anfang.

Block leeren

U):U;                       

Solider Block

];U):UW+:WF%"1302986_7_54"=

Teste es hier. Ich kann Ihnen keinen Permalink mit dem Code geben, da der Code zu lang ist, sodass Sie ihn manuell aus dem Snippet in der Challenge kopieren müssen.

Die Idee ist, die Form wie folgt zu hashen:

  • Für jedes "Pixel" wird ein Zähler inkrementiert U.
  • Addiere für jedes schwarze "Pixel" Ueine laufende Summe W(die bei beginnt -1). Am Ende nehmen wir dieses Modulo 15, das eindeutige Ergebnisse liefert, die zur Indizierung in eine Suchzeichenfolge verwendet werden.
Martin Ender
quelle