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.
quelle
var t=parseInt(document.getElementById("digit").value[0]);if(isNaN(t))return void alert("Invalid digit.");
kann geschrieben werden alsvar 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!text blocks may not be identical
Ja 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 ^^Antworten:
CJam,
2018141312 * 1 = 12Probieren Sie es online aus: 0 , 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9
Block leeren
Solider Block
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 istx * 16 + 20
, die Ergebnisfunktion für leere Blöcke istx % 13
, die Transformationsfunktion für feste Blöcke ist(x + 9) % 33
und die Ergebnisfunktion für feste Blöcke istx / 4
.quelle
> <> (Fisch) , 5 × 10 = 50
Block leeren
Solider Block
Dieser Code enthält keine Logik oder Arithmetik und verwendet nur statische Umleitungen des 2D-Befehlszeigers (IP) von> <> mit 'Spiegeln' (
/
und\
) und zwei 'Pfeilen' (<
undv
). 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,
n
und 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.
quelle
CJam,
232219 * 1 = 19Leerer Block:
Solider Block:
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.12
ordentlich zuzuordnen89
, was wir durch subtrahieren von 7 beheben können.quelle
CJam,
2827 × 1 = 27Hier ist ein Anfang.
Block leeren
Solider Block
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:
U
.U
eine laufende SummeW
(die bei beginnt-1
). Am Ende nehmen wir dieses Modulo15
, das eindeutige Ergebnisse liefert, die zur Indizierung in eine Suchzeichenfolge verwendet werden.quelle