Pure Sourcery - Programmes de mise en forme qui produisent les chiffres de 0 à 9

21

Voici une police pixélisée 5 par 7 pour les chiffres de 0 à 9:

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

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

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

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

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

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

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

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

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

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

(Cette police et cette page sera probablement mieux si vous exécutez ce code dans votre navigateur JavaScript console ou dans la barre d'URL préfixé par javascript:: $('#question pre,.answer pre').css('line-height',1).)

Écrivez deux blocs de texte rectangulaires de taille égale, un pour représenter les espaces vides ( .) dans la police ci-dessus, et un pour représenter les espaces remplis ( ).

Lorsque ces deux blocs de texte sont disposés dans le même motif 5 × 7 que l'un des chiffres ci-dessus, le grand bloc de texte résultant doit être un programme qui imprime ce chiffre sur stdout. Cela devrait fonctionner pour les 10 chiffres.

Par exemple, si votre .bloc de texte était

---
'''

et votre bloc de texte était

ABC
123

puis le programme

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

devrait sortir 0. De même, le programme

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

devrait sortir 1, et ainsi de suite jusqu'au programme pour 9.

Vous pouvez utiliser cet extrait de pile pour créer des programmes en forme de chiffres:

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

Détails

  • Aucun des 10 grands programmes de blocs de texte ne doit être saisi. N'émettez que le chiffre unique plus une nouvelle ligne de fin facultative. Sortie vers stdout ou une alternative similaire.
  • Aucun programme ne peut lire ou accéder à son propre code source. Traitez cela comme un défi de quine strict .
  • Les blocs de texte peuvent ne pas être identiques et doivent avoir des dimensions différentes de zéro.
  • Les blocs de texte peuvent contenir n'importe quel caractère à l'exception des terminateurs de ligne .
  • Les 10 programmes doivent être des programmes à part entière écrits dans la même langue, ils ne sont pas des extraits REPL . Vous pouvez éventuellement ajouter une nouvelle ligne de fin à chacun d'eux ou à aucun d'entre eux.

Notation

Votre score est l'aire (largeur fois hauteur) de l'un de vos blocs de texte. (Ils sont de la même taille, il est donc inutile de compter les deux blocs.) La zone de l'exemple est de 3 par 2, pour un score de 6.

Le score le plus bas l'emporte. En cas d'égalité, la réponse la plus votée l'emporte.

Loisirs de Calvin
la source
Sur votre code, vous pouvez l'améliorer beaucoup. var t=parseInt(document.getElementById("digit").value[0]);if(isNaN(t))return void alert("Invalid digit.");peut être écrit comme var t=document.getElementById("digit").value[0]/1;if(t!=t)return void alert("Invalid digit.");, qui est le même mais plus court. Il y a quelques autres choses que vous pouvez améliorer, mais ça a l'air super!
Ismael Miguel
4
@IsmaelMiguel TBH Je l'ai mis à travers un minifier JS pour le mettre sur une seule ligne. Il n'a jamais été conçu pour être joué au golf.
Calvin's Hobbies
Oh, mec ... C'est un peu paresseux ... Dans une question sur le golf, vous postez un code non-golfé ... Mais bon, je comprends et je dis juste cela. Vous n'êtes pas obligé de suivre ce que j'ai dit. Mais c'est une bonne chose à faire.
Ismael Miguel
6
@IsmaelMiguel J'ai publié du code utilitaire non golfé , qui devrait sans doute être aussi lisible que possible afin que les bogues soient plus faciles à repérer. Mais vraiment, tant que cela fonctionne, la taille du code de l'extrait de pile n'a littéralement aucune incidence sur l'issue du défi.
Calvin's Hobbies
3
text blocks may not be identicalvraiment? Je veux voir quelqu'un enfreindre cette règle, en donnant deux blocs de code identiques, qui retournent comme par magie des chiffres différents, lorsque chaque numéro est exactement le même code ^^
Falco

Réponses:

13

CJam, 20 18 14 13 12 * 1 = 12

Essayez-le en ligne: 0 , 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9

Bloc vide

];BG*K+ :BD%

Bloc solide

];B9+33%:B4/

Explication

J'ai utilisé une stratégie similaire à la solution de Sp3000 , telle que chaque bloc effectue une multiplication, une addition et (éventuellement) une opération modulo sur une variable et enregistre la valeur. Pour trouver une solution optimale, j'ai utilisé une bonne vieille force brute. J'ai écrit un programme qui recherche l'espace de toutes les valeurs initiales possibles (les valeurs initiales des variables CJam) et plusieurs millions de paires de fonctions de transformation possibles de sorte que la sortie pour chaque forme de chiffre soit unique. Ensuite, j'ai filtré les résultats pour ceux de sorte que le résultat final pour les formulaires numériques se terminant par un bloc vide, dont il y a 8, puisse être mappé vers le résultat correct via une autre formule de multiplication, d'addition et de modulo.

Après quelques jours de temps CPU de recherche, le meilleur résultat jusqu'à présent est tombé à une taille de 12! Cette solution commence par une valeur de 11, la fonction de transformation de bloc vide est x * 16 + 20, la fonction de résultat de bloc vide est x % 13, la fonction de transformation de bloc solide est (x + 9) % 33et la fonction de résultat de bloc solide est x / 4.

Runer112
la source
23

> <> (Poisson) , 5 * 10 = 50

Bloc vide

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

Bloc solide

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

Ce code ne contient aucune logique ou arithmétique n'utilise que des redirections statiques du pointeur d'instruction 2D (IP) de> <> avec des «miroirs» ( /et \) et deux «flèches» ( <et v). Le seul autre contrôleur de débit est le «trampoline» ( !) qui passe à travers le caractère suivant.

L'IP commence à partir du coin supérieur gauche en direction de l'est. Après quelques redirections, il atteint un nombre, il est poussé sur la pile et imprimé avec net le programme se termine avec ;.

Le déroulement du programme

Un bloc «reconnaît» l'état actuel du programme du fait que quel point l'IP est entré et en fonction de l'état, il décide dans quelle direction il doit laisser sortir le pointeur (quel bloc doit être exécuté ensuite) et dans quelle position exacte le pointeur doit être laissé (qui sera le nouvel état). Bien sûr, les blocs ne font aucune logique, tout ce comportement provient des redirecteurs.

randomra
la source
J'espérais une réponse comme celle-ci. Magie pure.
EagleV_Attnam
11

CJam, 23 22 19 * 1 = 19

Bloc vide:

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

Bloc solide:

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

Essayez-le en ligne .

J'essaie d'avoir de la chance avec les coïncidences mathématiques et l'échec, alors voici une approche légèrement différente de la cartographie d'unicité de la solution de Martin.

Commencez par 16. Les blocs vides ajoutent 1 et prennent modulo 11. Les blocs solides se multiplient par -1, ajoutent 11, multiplient par 3 puis prennent modulo 13. Cela mappe comme par magie 03456789(les chiffres qui se terminent sur un bloc vide) 41753026, auxquels nous utilisons l'indexation pour avoir raison. 12correspond parfaitement à 89ce que nous pouvons corriger en soustrayant 7.

Sp3000
la source
7

CJam, 28 27 x 1 = 27

Voici un début.

Bloc vide

U):U;                       

Bloc solide

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

Testez-le ici. Je ne peux pas vous donner un permalien avec le code, car le code est trop long, vous devrez donc le copier manuellement à partir de l'extrait du défi.

L'idée est de hacher la forme comme suit:

  • Pour chaque "pixel" incrémenter un compteur U.
  • Pour chaque "pixel" noir, ajoutez Uà un total cumulé W(qui commence à -1). À la fin, nous prenons ce modulo 15, qui donne des résultats uniques, qui sont utilisés pour indexer dans une chaîne de recherche.
Martin Ender
la source