Écrivez un bloc de texte rectangulaire qui, lorsqu'il est disposé dans un tapis de Sierpinski , en utilisant des blocs d'espaces de même taille pour les parties vides, crée un programme qui affiche le numéro d'itération du tapis.
Par exemple, si votre bloc de texte est
TXT
BLK
puis lancer le programme
TXTTXTTXT
BLKBLKBLK
TXT TXT
BLK BLK
TXTTXTTXT
BLKBLKBLK
devrait sortir 1
car la forme du programme représente la première itération du tapis de Sierpinski.
De même, en cours d'exécution
TXTTXTTXTTXTTXTTXTTXTTXTTXT
BLKBLKBLKBLKBLKBLKBLKBLKBLK
TXT TXTTXT TXTTXT TXT
BLK BLKBLK BLKBLK BLK
TXTTXTTXTTXTTXTTXTTXTTXTTXT
BLKBLKBLKBLKBLKBLKBLKBLKBLK
TXTTXTTXT TXTTXTTXT
BLKBLKBLK BLKBLKBLK
TXT TXT TXT TXT
BLK BLK BLK BLK
TXTTXTTXT TXTTXTTXT
BLKBLKBLK BLKBLKBLK
TXTTXTTXTTXTTXTTXTTXTTXTTXT
BLKBLKBLKBLKBLKBLKBLKBLKBLK
TXT TXTTXT TXTTXT TXT
BLK BLKBLK BLKBLK BLK
TXTTXTTXTTXTTXTTXTTXTTXTTXT
BLKBLKBLKBLKBLKBLKBLKBLKBLK
devrait produire 2 car il s’agit de la deuxième itération du tapis de Sierpinski.
Exécuter le bloc de texte tel quel
TXT
BLK
devrait sortir 0
car il peut être considéré comme l'itération zéro.
Cela devrait fonctionner pour toutes les itérations ultérieures. (Du moins théoriquement, en supposant que l'ordinateur ait la mémoire et tout.)
Détails
- Les programmes ne peuvent pas lire ou accéder aux informations concernant leur code source. Traitez cela comme un défi quine strict.
- La sortie passe à stdout ou à une alternative similaire. N'affiche que le numéro et une nouvelle ligne de fin optionnelle. Il n'y a pas d'entrée.
- Le bloc de texte peut contenir des caractères qui ne sont pas considérés comme des fins de ligne . Le bloc de texte peut contenir des espaces.
- "L'espace vide" dans le tapis doit être entièrement composé de caractères d'espace .
- Vous pouvez éventuellement supposer que tous les programmes ont une nouvelle ligne.
Vous pouvez utiliser cet extrait de pile pour générer un tapis pour un bloc de texte donné à n'importe quelle itération:
<style>#o,#i{font-family:monospace;}</style><script>function c(e){e=e.split("\n");for(var n=new Array(3*e.length),t=0;t<n.length;t++){var l=t%e.length;n[t]=e[l]+(t>=e.length&&t<2*e.length?e[l].replace(/./g," "):e[l])+e[l]}return n.join("\n")}function f(){for(i=document.getElementById("i").value,n=parseInt(document.getElementById("n").value);n>0;)i=c(i),n--;document.getElementById("o").value=i}</script><textarea id='i'placeholder='code block...'rows='8'cols='32'></textarea><br>Iterations <input id='n'type='text' value='1'><br><br><button type='button'onclick='f()'>Generate</button><br><br><textarea id='o'placeholder='output...'rows='8'cols='32'style='background-color:#eee'readonly></textarea>
Notation
La soumission dont le bloc de texte initial est le plus petit par zone (largeur multipliée par la hauteur) est le gagnant. L' TXT\nBLK
exemple est 3 par 2 pour un score de 6. (Fondamentalement, le code le plus court gagne, d'où le tag code-golf.)
Tiebreaker va à la soumission qui utilise le moins de caractères distincts dans son bloc de texte. S'il y a toujours égalité, répondez posté en premier gagne.
la source
Perl, 30 (15 × 2)
Tout d’abord, je vais affirmer que 10 itérations est une limite raisonnable, pas 2 32 . Après 10 itérations, un programme composé de N octets aura été étendu à ( N × 3 20 ) octets (plus les sauts de ligne), soit plus de 3 gigaoctets, même pour N = 1. Une architecture 32 bits serait totalement incapable de gérer 11 itérations. (Et évidemment, il n’ya pas assez de particules dans l’univers pour 2 32 itérations).
Alors voici ma solution:
Cela fonctionne en incrémentant la variable
$n
dans la première ligne et en calculant son logarithme à chaque étape. La deuxième ligne affiche la partie entière de ce logarithme et se ferme.Un simple logarithme à la base e (2,718 ..) est suffisamment proche pour donner des résultats corrects pour les 10 premières itérations.
la source
Golfscript, 9 * 2 = 18
(Notez que la première ligne comporte des espaces pour le rendre rectangulaire)
Je ne pouvais pas trouver de fonction de journalisation pour Golfscript, donc
base
je devais le faire.Golfscript commence par une chaîne vide, il
0+
suffit donc d' augmenter la longueur de la chaîne de 1 (par coersion). Au moment où la première ligne est terminée, la pile aura une chaîne de longueur3^n
, que nous prenons la base de journal 3 avant de super comment.n
est alors automatiquement imprimé.la source
,
sur la deuxième ligne. Première ligne0or)
:; deuxième ligne3base,(}
. L'autre cible évidente est(
la deuxième ligne. Ceci est plus compliqué, mais peut également être supprimé en remplaçant la première ligne par1+~abs(
un rectangle 7 * 2.C, 12x8 = 96
Inspiré par @ciamej, je l'ai réduit. Il utilise cette astuce de division par 3, plus la réalisation que le tapis convertit efficacement une boucle if en une boucle while.
Le code a été testé sur gcc / Ubuntu pour des itérations jusqu’à 3.
Solution précédente: C, 11x12
Pas un gagnant de taille, mais bon, c'est C.
Il trouve log2 du nombre de blocs par bitshifting, puis utilise des nombres magiques et une troncature int pour estimer log3. Le calcul devrait fonctionner jusqu'à 26 itérations (un nombre de 42 bits).
la source
CJam, 9 octets
L’idée d’utiliser
]
provient d’Optimizer, mais elle utilise une méthode très différente pour compter.Essayez-le en ligne
Comment ça fonctionne:
Deux autres solutions à 9 octets
la source
Python 2, 15 * 3 = 45
Une autre implémentation de l'idée de nombre-première-ligne-puis-log-trois-et-sortie. Peut probablement encore être joué au golf un peu plus.
la source
bc, 2 * 16 + 1 = 33
Le +1 supplémentaire dans le score est parce que l'
-l
option bc est requise:la source
Golfscript, 7 * 2 = 14
Ceci s’inspire de la réponse de Sp3000 , et en particulier de la volonté d’optimiser la longue seconde ligne.
3base,
est aussi court qu’un logarithme en base 3 deviendra GS, et le super commentaire}
est clairement optimal.Ce qui est requis pour la première ligne consiste à mapper la chaîne vide
''
du stdin initial sur 0, puis à mapper chaque entier non négatif à son successeur. De cette façon, nous terminons la première ligne avec3^n - 1
sur la pile et3base,
ne nécessitons aucune décrémentation.la source
C, 13x8
la source
Perl, 76
Je sais qu’il n’ya probablement pas beaucoup d’intérêt à publier ceci car il a déjà été complètement battu, mais voici ma solution actuelle de toute façon.
la source
> <> (Poisson), 12 * 3 = 36
Une solution plus simple> <>:
Nous courons d’abord la rangée supérieure des blocs supérieurs.
'v'00p
se placev
à la toute première position de l’ensemble du programme en dirigeant le pointeur du programme vers le bas lorsqu’il revient au début après avoir atteint la fin de la ligne. Avant que chaque bloc pousse 0 et la longueur de la pile + 1 sur elle. (pile sera0 2 0 4 0 6 ...
)Sur la première moitié de la seconde et de la troisième, nous comptons le nombre de fois où nous pouvons diviser l’élément supérieur de la pile avant d’obtenir 2 (nous le stockons dans l’élément deuxième à supérieur).
À la fin, nous sortons le deuxième au dernier élément de la pile.
la source
Lua, 3 * 17 = 51
Même stratégie que la plupart des gens:
la source
PHP, 22 × 2 = 44
27 × 2 = 54Juste une autre prise sur count-log3-out. Pas très petit, mais mon premier golf;)
la source