Votre tâche consiste à écrire un programme de longueur paire , qui imprime un carré ASCII (décrit ci-dessous), qui augmente sa longueur de côté de 1 unité chaque fois que le code source original est collé au milieu du code actuel.
Il m'est difficile de définir très bien cette tâche. Je vais donc vous donner un exemple:
Disons que votre code initial était
CODE
et qu'il imprimait:0
Ensuite, insérez
CODE
au milieu: votre code devientCOCODEDE
et il devrait imprimer:00 00
Réinsérez
CODE
au milieu: votre code devientCOCOCODEDEDE
et devrait imprimer:000 000 000
Etc. Votre réponse devrait théoriquement fonctionner après n'importe quel nombre d'itérations, mais je comprends si, en raison de limitations de performances langagières, elle ne peut pas fonctionner raisonnablement au-dessus d'un certain seuil.
Certaines règles:
Vous pouvez utiliser n’importe quel code ASCII imprimable (32-127) comme caractère à utiliser pour votre carré. Votre choix doit être constant (vous devez utiliser le même caractère pour chaque itération).
Le carré de sortie initial doit avoir la longueur de côté 1 .
Un carré ascii-art est défini comme une chaîne de N lignes (séparées par N-1 sauts de ligne / nouvelles lignes), chaque ligne contenant N copies du caractère choisi.
Votre sortie ne doit contenir aucun espace supplémentaire, autre qu'un retour à la ligne final.
Vous pouvez utiliser les valeurs par défaut pour les entrées et les sorties (les programmes ou les fonctions sont autorisés, mais pas les extraits).
Le milieu de votre code est défini comme le point où le code source peut être divisé en deux parties, de sorte que les deux soient égales.
Vos réponses seront notées en fonction de la longueur de votre programme d'origine , en octets. Le plus petit nombre d'octets gagne. En cas d'égalité des voix, la réponse soumise précédemment l'emporte.
Vous pouvez utiliser ce programme pour appliquer les insertions sans avoir à le faire à la main.
Réponses:
Pyth , 2 octets
Essayez-le en ligne! Aussi Essayez - le doublé , triplé !
Comment ça marche?
\n
est la commande qui affiche son argument avec une nouvelle ligne de fin, tout en le renvoyant simultanément. Ainsi, chaque fois que vous effectuez une insertion, vous transformez le littéral entier 5 en un nombre contenant N copies de 5 concaténées, et les nouvelles lignes majeures s’assurent essentiellement qu’elle est imprimée le nombre de fois approprié, en la gardant ainsi droite.la source
JavaScript (ES6),
423230 octetsDeuxième itération:
Cela fonctionne en ajoutant un
0
às
chaque fois que la première moitié du code est exécuté et en imprimants
lui-même chaque fois que la seconde moitié est exécutée. Profite de quatre bizarreries de JavaScript:this
. Cela nous permet de fairethis.s
à la place des
.undefined
.[1,2,3] + 4 === "1,2,34"
undefined
est converti en chaîne vide, ce qui signifie que[undefined] + 0 === "0"
.Ensemble, cela signifie que nous pouvons exprimer la première moitié (générer une chaîne de zéros) en seulement 13 octets. Si utiliser
alert
au lieu deconsole.log
est autorisé, nous pouvons économiser 4 octets supplémentaires en raccourcissant la seconde moitié.la source
05AB1E , 2 octets
Essayez-le en ligne!
Réponse de Port of my Pyth .
la source
Python 2 ,
423828 octetsEssayez-le en ligne! . Vous pouvez également essayer les 2ème et 3ème itérations
la source
Python 2 , 22 octets
Essayez-le en ligne!
Doublé:
Notez que la seconde moitié commence par un caractère de nouvelle ligne.
la source
C (gcc) ,
17016896807270 octetsVersion beaucoup plus courte. J'espère toujours pouvoir trouver une solution sans préprocesseur.
Essayez-le en ligne!
Ancienne version de 168 octets:
Essayez-le en ligne!
la source
Python 2 , 30 octets
Essayez-le en ligne! , 2ème et 3ème itération
Cela tient compte du fait que les bools en Python sont essentiellement des noms
False
et qu'ilsTrue
ont été réaffectés dans Python 2.Python 1 , 32 octets
Essayez-le en ligne! , 2ème et 3ème itération
En Python 1 , les chaînes de BUILTIN
exit
etquit
existe pour informer l'utilisateur du shell interactif comment sortir il. La valeur par défaut est"Use Ctrl-D (i.e. EOF) to exit."
.la source
n=False+=1;print'*'*n;
, mais j'oublie toujours que ce n'est pas une fonctionnalité Python ...Charbon de bois , 6 octets
Essayez-le en ligne! Explication:
υ
se termine avec une longueur du nombre de répétitions.la source
Haskell , 68 octets
Essayez-le en ligne une fois , deux fois ou trois fois .
En raison de la paresse de Haskell, une expression comme celle ci-dessus compte comme une fonction qui ne prend aucun argument, comme dans cette question Meta .
la source
brainfuck ,
4434 octets44 barré est toujours régulier 44;
Essayez-le en ligne!
Essayez-le doublé , triplé . Regardez, pas de rembourrage!
Imprime des carrés de
U
. Il se sépare au milieu des 10+
secondes.la source
Ruby, 18 octets
Essayez-le en ligne! Doublé! Triplé!
la source
Brain-Flak , 74 octets
Essayez-le en ligne!
Essayez-le doublé et triplé .
Explication
Le point de rupture se trouve au milieu de la
<>
section "push 10". Casser cela laissera un 5 sur la troisième pile jusqu’à ce que nous atteignions la seconde moitié correspondante, après quoi appuyer sur 10 reprendra là où il s’était arrêté.Bien qu’il soit possible de transmettre une valeur ASCII imprimable (espace) sur 22 octets, la centrale
<>
sera exécutée après le transfert5
. En ajoutant deux octets supplémentaires, j'ai pu déplacer le tout de<>
manière à ce que toute la progression vers le transfert10
soit sur la troisième pile. En prime, cela a également rendu le carré résultant plus esthétique.la source
tinylisp , 112 octets
Essayez-le en ligne! Aussi doublé et quintuple .
L'approche "Construire une chaîne dans la première moitié, l'imprimer dans la seconde moitié" que beaucoup de langues utilisent ne fonctionnera pas dans tinylisp, car il n'y a pas de variables mutables. Au lieu de cela, nous faisons une imbrication sérieuse de code.
Lorsqu'une deuxième copie du code est insérée, elle est placée à l'intérieur du
(q())
, ce qui l'enveloppe dans une liste. Puis(h(t(t(h(t(...))))))
percer dans cette liste à la partie suivante(d N
.(v(...))
l'évalue; puis nous le passons à la fonction non nommée(q((x)(i x(inc x)1)))
, qui incrémente la valeur résultante s'il s'agit d'un nombre et renvoie 1 si c'est la liste vide. Le résultat final de la version imbriquée la plus externe du code est attribué àN
. En substance, nous avons mis en place une étrange sorte de récursivité qui compte le nombre de niveaux de nidification.La seconde moitié du code crée ensuite une chaîne d'
N
astérisques, puis une liste deN
telles chaînes, puis rejoint la liste sur les nouvelles lignes. Le résultat est affiché avec une nouvelle ligne de fin.la source
R , 44 octets
Essayez-le en ligne!
Imprime avec une nouvelle ligne. Le
T=TRUE*TRUE+12
est juste pour couvrir la longueur.Essayez-le doublé et essayez-le triplé .
la source
F=F+1;T=TRUE*TRUE+12#
<newline>write(strrep(1,F),"")
Julia 0.6 , 29 octets
Toutes mes idées étaient plus longues que l’adaptation de la solution python intelligente de xnor.
Devient
Essayez-le en ligne!
la source
SNOBOL4 (CSNOBOL4) ,
130 à68 octetsMaintenant sans commentaires! Voir l' historique d'édition pour une explication de l'ancien algorithme.
Essayez-le en ligne!
Essayez-le doublé et triplé
Explication:
Parce qu'une
END
étiquette est requise et que tout ce qui suit la premièreEND
est ignoré, nous avons deux avantages pour ce défi:X
fois pour lesX
répétitionsCela suggère que nous utilisons la répétition pour la première moitié, puis nous pouvons utiliser une approche d'étiquetage plus "conventionnelle" pour répéter les
X
temps de sortie .La première moitié est
qui, lorsqu'il est répété, incrémente
X
le nombre approprié de fois et crée unARRAY
A
avec des indices de1
àX
et où chaque élément deA
est la chaîne1
répétée plusieursX
fois.Alors peu importe combien de fois le programme est répété, l'interprète ne voit que:
Il s'agit d'un programme SNOBOL typique qui imprime les éléments
A
un à la fois jusqu'à ce que l'index sorte des limites, puis termine le programme.;
est un terminateur de ligne facultatif habituellement réservé à une ligneEVAL
ou à desCODE
instructions qui ramènent parfaitement le nombre d'octets à 68 et marque le point milieu, permettant ainsi l'ajout du code.la source
shortC ,
5644 octets-12 octets: attends duh j'utilise shortC pourquoi ne pas utiliser des trucs C raccourcis
J'aurais utilisé la norme C, mais cela nécessite
}
à la fin une confusion avec la réplication. shortC l'insère implicitement à EOF.la source
Perl 5 , 25 octets
Code de 24 octets + 1 pour
-p
.Sachez que vous ne souhaitez peut-être pas autoriser les drapeaux de ligne de commande. Merci de me prévenir si cela n’est pas valide.
Essayez-le en ligne!
la source
Zsh , 10 octets
Essayez une suite de tests complète en ligne!
... ouais, c'est un peu mieux. Ajoutez à la chaîne N fois, puis imprimez N fois. Il s'avère que ça
<<<foo<<<foo
fonctionne très bien.Zsh , 64 octets
Caractère utilisé:
(espace).
Essayez une suite de tests complète en ligne!
Le milieu se situe entre la deuxième
E
et la nouvelle ligne qui le suit. Un heredoc se termine quand il y a uneE
ligne seule, ce qui se produit au milieu du code.la source
s+=0;<<<$s