Pour ce défi, une courtepointe art ASCII sera un bloc de texte de 24 caractères de large et 18 lignes de haut, contenant les caractères =-<>/\
dans un motif semblable à une courtepointe qui est horizontalement et verticalement symétrique.
Exemple de courtepointe:
========================
------------------------
//\\//\\\//\/\\///\\//\\
<<><<>>>>><<>><<<<<>><>>
/\\/\\\\/\/\/\/\////\//\
------------------------
/\/////\\///\\\//\\\\\/\
\///\/\/\\\\////\/\/\\\/
\///\/\/\\\\////\/\/\\\/
/\\\/\/\////\\\\/\/\///\
/\\\/\/\////\\\\/\/\///\
\/\\\\\//\\\///\\/////\/
------------------------
\//\////\/\/\/\/\\\\/\\/
<<><<>>>>><<>><<<<<>><>>
\\//\\///\\/\//\\\//\\//
------------------------
========================
Toutes les courtepointes ont la même forme:
- Ils sont toujours 24 par 18.
- La ligne du haut (ligne 1) et la ligne du bas (ligne 18) sont
=
tout au long. - Les lignes 2, 6, 13 et 17 sont
-
tout le chemin à travers. - Les lignes 4 et 15 sont le même motif aléatoire symétrique horizontalement de
<
et>
. - Toutes les autres lignes (3, 5, 7, 8, 9, 10, 11, 12, 14, 16) sont remplies
/
et\
d'une manière complètement aléatoire de telle sorte que la courtepointe entière reste horizontalement et verticalement symétrique .
Notez que lorsque vous pliez la courtepointe exactement en deux, verticalement ou horizontalement, les formes des caractères correspondent exactement. Ne confondez pas cela avec les personnages eux-mêmes qui correspondent. par exemple, la ligne 3 et la ligne 16 ne sont pas identiques, ce sont des images miroir verticales.
Défi
Écrivez un programme ou une fonction qui imprimera ou retournera une courtepointe art ASCII aléatoire.
En raison des nombreuses lignes codées en dur et de la symétrie, le seul véritable caractère aléatoire provient des 12 premiers caractères des lignes 3, 4, 5, 7, 8, 9:
- Les 12 premiers caractères de la ligne 4 doivent pouvoir être n'importe quelle chaîne de longueur 12 des caractères
<
et>
. - Les 12 premiers caractères des lignes 3, 5, 7, 8, 9 doivent pouvoir être n'importe quelle chaîne de 12 caractères
/
et\
(indépendamment les uns des autres). - Ces chaînes aléatoires sont ensuite reflétées en conséquence pour créer l'intégralité de la courtepointe.
La réponse la plus courte en octets l'emporte. Tiebreaker est un post antérieur.
Vous pouvez utiliser des générateurs de nombres pseudo-aléatoires. (Non, vous n'avez pas besoin de prouver que les 12 caractères de <>
ou /\
peuvent être générés avec le PRNG de votre langue.)
La sortie peut éventuellement contenir une nouvelle ligne de fin, mais pas d'espaces de fin ni d'autres caractères en plus de ce qui est nécessaire pour la courtepointe.
Réponses:
CJam,
61605855545251 octetsRaccourci un peu avec l'aide de Sp3000 et Optimizer.
Testez-le ici.
Explication
Comme d'habitude avec ces défis d'art ASCII symétriques, je génère un quadrant, puis je l'étends au maximum par deux opérations de mise en miroir appropriées.
Pour cette explication, je devrais commencer par la fonction
F
, que je définis quelque part en cours de route, car elle est utilisée à trois endroits pour trois choses différentes:Cela attend un entier en haut de la pile et une chaîne en dessous. Son but est d'inverser la chaîne et également d'échanger certains caractères, pour obtenir la bonne mise en miroir. L'entier est soit
1
ou3
et indique si (1
) les crochets et les barres obliques doivent être échangés ou (3
) seuls les crochets doivent être échangés. Voici comment cela fonctionne:Maintenant, pour le reste du code:
Les deux moitiés et cette seule nouvelle ligne sont ensuite imprimées automatiquement à la fin du programme.
la source
Python 3,
257229192185 185176149143 octetsAvec l'aide de @xnor, nous avons enfin rattrapé JS!
Exemple de sortie:
Explication
(Légèrement obsolète, sera mis à jour plus tard)
"444046402"
code les lignes, chaque chiffre faisant référence à l'index de départ de la sous-chaîne de 2 caractères appropriée de'--==\/<>'
. Chaque ligne individuelle est construite à l'envers via le brassage répété des deux caractères (en utilisantsample(...,2)
, car ilrandom.shuffle
est malheureusement en place) et la jonction de chaînes.Un exemple simplifié de ce à quoi pourrait ressembler l'extension pour la quatrième ligne:
ce qui donnerait
><>><><<><
:La courtepointe globale est également construite à l'envers, car la construction commence avec les 9ème / 10ème rangées, en travaillant vers l'extérieur. Pour ce faire, nous commençons par une liste vide
L
, que nous ajoutons des lignes au recto et au verso au fur et à mesureLa
n<"5"
condition est de vérifier si nous avons une ligne composée><
, auquel cas nous ajoutons une ligne identique à l'arrière, sinon son inverse.Enfin,
*_,=
est de forcer l'évaluation demap
sorte que l'impression se produise, et c'est juste un moyen plus court de le faireprint("\n".join(L))
.Pendant longtemps j'ai eu la fonction
qui prend une chaîne et convertit
/\><
en\/<>
respectivement, mais j'ai finalement réussi à m'en débarrasser :)la source
Python 2, 300 octets
Ce programme utilise
join, lambda, replace, sample, import
et d'autres fonctions détaillées, il ne gagnera donc pas de prix de golf.Le code avant que le golfeur automatique ne s'en empare:
Un exemple de sortie:
la source
APL (
5358)Ce n'est pas tout à fait aussi symétrique que je pensais qu'il était, malheureusement. La correction m'a coûté 5 caractères et maintenant je suis hors course.
Explication:
L←+,3-⌽
: L est une fonction qui retourne son argument suivi de 3 - l'inverse de son argumentL{L?12⍴2}¨⍳9
: générer 9 lignes de 12 valeurs aléatoires à partir de [1,2] plus leur inverse, puis l'inverse de ces 9 lignes732451451260688⊤⍨18/8
: générer la liste0 2 4 6 4 2 4 4 4 4 4 4 2 4 _7_ 4 2 0
(c'est là que se trouve la fichue asymétrie)+
: pour chaque ligne, ajoutez le nombre correspondant à chaque valeur↑
: format comme matrice'==--/\<><'[
...]
: pour chacun des nombres de la matrice, sélectionnez le caractère de la chaîne à cette positionSortie:
la source
<>
lignes ne sont pas symétriques verticalement lorsque vous utilisez également votre table de swap pour créer le miroir vertical. (Merci d'avoir publié la sortie btw, permet de déterminer si APL fonctionne beaucoup plus facilement; p)<
à la fin de la chaîne et en incrémentant la deuxième ligne une fois de plus, la remplaçant ainsi deux fois). Je n'ai même pas eu à abandonner le tout, même s'il ne gagnera plus maintenant. (Peut-être que la prochaine fois je ne devrais pas poster la sortie: P)PHP,
408,407,402,387, 379 octetsJe ne suis pas un bon golfeur, mais ce problème semblait amusant, donc je l'ai essayé.
Code non golfé
La version non golfée a un petit bonus: vous pouvez lui passer un entier à la graine
rand()
et obtenir la même courtepointe à chaque fois pour une graine:Cela se traduit, par exemple, par cette belle couette tissée à la main:
Edit : Il s'avère que ma première version n'a pas renvoyé une courtepointe correcte. Je l'ai donc corrigé. Assez drôle, la correction est encore plus courte.
la source
['/','<','\\','>','a','b']
peut être remplacé par['/','<','\\','>',a,b]
(remarquez les guillemets manquants autoura
etb
),@$s
peut être remplacé par$s
, vous pouvez stockerstr_repeat('-',12)
etstr_repeat('=',12)
dans des variables / constantes globales,for($b=8;$b>=0;$b--)
peut être remplacé parfor($b=9;$b--;)
,str_repeat
et les fonctions répétées peuvent être raccourcies en donnant leur nom à une variable globale (par exempleglobal$R,$V;$R=str_repeat;$V=strrev;$V($R('=',12))
:) et newlines (\n
) peuvent être remplacés par une chaîne de plusieurs lignes.strrev
inchangé, supprimé 1 espace et quelques petits changements.<>><><
lignes) soient identiques.JavaScript (ES6) 169
195 201Modifier 6 octets enregistrés thx @nderscore. Attention, la nouvelle ligne à l'intérieur des guillemets est importante et comptée.
Édition de ligne simplifiée Edit2 , pas besoin de
reverse
etconcat
Exécutez l'extrait de code pour tester (dans Firefox)
la source
z
. Déplacer la définition de l'Q
intérieur de l'Math.random
appel. Remplacez'\n'
par la chaîne de modèle de nouvelle ligne.|0
la conversion d'entiers n'est pas nécessaire, car les valeurs seront xor-ed plus tard.for(_ of-z+z)
que cela signifie?z
n'est pas numérique donc -z est NaN (pas un nombre) NaN converti en chaîne est "NaN" et 3 caractères + 9 caractères sont 12.Ruby,
162155J'aime celui-ci car il m'a fait apprendre à abuser des barres obliques inverses dans les littéraux de chaîne et
String#tr
. Le code n'est pas terriblement intelligent autrement, juste compact.la source
/
ina
et aub
. Le premiertr
peut probablement aussi se passer de parenthèses. Des chaînes de caractères uniques comme'='
peuvent être écrites?=
. Et.join
peut être remplacé par*
.join
synonyme me font gagner 6 octets. Je ne peux pas supprimer les parenthèsesx+x.reverse.tr(a,b)
car+
a priorité sur,
cependant. Je n'échappe pas non plus réellement aux barres obliques dans mes chaînes - je n'arrive pas à échapper à une barre oblique inverse dans chacune. Une seconde\
est nécessaire enb
raison de la façon dont lestr
travaux, bien que je me rends compte maintenant le premier\
ena
est superflu, donc il y a un autre octet.Pyth, 57
59 61Merci beaucoup à @Jakube d'avoir proposé ces versions de 57 octets.
Algorithme très similaire à celui de Martin. (Révisé) Explication à venir.
Essayez-le en ligne
Explication:
la source
"<>"
par-GK
J"\<>/"K"\/"L+b_mXdK_Kbjbym+d_XdJ_JmsmOk12[\=\-K-JKK\-KKK
ou réduireJ"\<>/"K"\/"jbu++HGXHK_Km+d_XdJ_JmsmOk12[KKK\-K-JKK\-\=)Y
J,
5654 octetsUsage:
1 octet grâce à @FUZxxl.
Explication à venir.
Essayez-le en ligne ici.
la source
5 1 3 1 5 1 1 1
par(3(2})8$5,3#1)
.Python
295287227 octetsPas génial mais je le posterai quand même:
Si vous voulez une explication, demandez-moi.
la source
=
et-
end
.Javascript ( ES7 projet )
174168146Inspiration tirée de @ edc65
Edit: Merci à edc65 pour quelques idées pour optimiser la construction des lignes.
Démonstration: ( Firefox uniquement )
Commenté:
la source
Pharo 4, 236
ou formaté normalement:
Explication:
La chaîne
s:='====----/\/\/<><<>'
avec le blocf:=[:c|s at:(s indexOf:c)+i]
sont ici à la fois pour lancer les caractères et pour inverser les motifs ...Pour i = 1, il effectue une réversion horizontale (
/
<->\
,<
<->>
).Pour i = 3, il effectue une réversion verticale (
/
<->\
)Pour i = 1 ou 2 atRandom, il lance parmi
/
ou\
,<
ou>
'=-/</-///'
code le type de caractèrec
qui alimentera le blocf
pour les 9 premières lignes.#() , '=-/</-///'
est une astuce de concaténation pour transformer la chaîne en tableau et ainsi collecter en tableau.Le reste est une simple concaténation après application de la symétrie horizontale / verticale.
la source
Squeak 4.X, 247
Ou formaté:
Explications:
s:='==--/\<>'.
encode évidemment les quatre paires possibles.r:=(1<<108)atRandom.
lancer 108 bits (dans un LargeInteger) pour 9 lignes * 12 colonnes (nous jetons les == et - inutilement mais les performances ne sont pas notre problème).h:=''
est la chaîne où nous allons concaténer (peintre Schlemiel car un Stream serait trop coûteux en caractères).(16to:0by:-2),(0to:16by:2)do:[:i|
itère sur les lignes (* 2)(11to:0by:-1),(0to:11) do:[:j|
itère sur les colonnes28266
est un nombre magique codant la paire à utiliser sur les 9 premières lignes.Il s'agit du modèle de bits
00 01 10 11 10 01 10 10 10
, où 00 code «==», 01 «-», 10 «/ \» et 11 «<>».101
est un nombre magique codant la réversion horizontale et verticale.C'est le motif binaire
0000 0000 0110 1010
, codant quand inverser (1) ou non (0) le premier (0) ou le deuxième (1) caractère de chaque paire '==' '-' '/ \' et '<>', pour la symétrie verticale et la symétrie horizontale.n:=3 bitAnd: 28266>>i
donne le codage de la paire de caractères pour la ligne i / 2 (0 pour '==', 1 pour '-', 2 pour '/ \' et 3 pour '<>').(r-1 bitAt: 6*i+j+1)
choisissez le bit aléatoire pour la colonne i / 2 de la colonne j (1 est le rang du bit le plus bas, nous avons donc un tirage aléatoire +1, k dans l'intervalle [1, k], nous avons donc un -1).(101 bitAt: 3-n*4+m+p)
choisissez le bit d'inversion: (3-n) * 4 est le décalage pour le groupe de 4 bits correspondant au code de paire n, m est le décalage de réversion vertical (0 pour les 9 premiers, 2 pour les 9 dernières lignes), p est le décalage de réversion horizontal (0 pour les 12 premières, 1 pour les 12 dernières colonnes) +1 car le rang de bits faible est 1.bitXor:
effectue la réversion (il répond à un décalage 0 ou 1), ets at:2*n+1+bitXor_offset
choisissez le bon caractère dans s.Mais
(A>>a)+(B>>b) bitAnd: 1
coûte moins d'octets(A bitAt:a+1)bitXor:(B bitAt:b+1)
qu'ainsi le bitXor a été réécrit et le décalage +1 sur p a disparu ...h,#[13]
est un laid grincement, nous pouvons concaténer une chaîne avec un ByteArray (contenant du code pour le retour chariot).la source