Étant donné une liste d'au moins deux mots (composée uniquement de lettres minuscules), construisez et affichez une échelle ASCII des mots en alternant la direction d'écriture d'abord à droite, puis à gauche, par rapport à la direction initiale de gauche à droite. .
Lorsque vous avez terminé d'écrire un mot, changez de direction et commencez ensuite à écrire le mot suivant.
Si votre langue ne prend pas en charge les listes de mots, ou si cela vous convient mieux, vous pouvez prendre l'entrée comme une chaîne de mots, séparés par un seul espace.
Les espaces blancs avant et arrière sont autorisés.
["hello", "world"]
ou "hello world"
hello
w
o
r
l
d
Ici, nous commençons par écrire hello
et lorsque nous arrivons au mot suivant (ou dans le cas de l'entrée sous forme de chaîne - un espace est trouvé), nous changeons la direction relative vers la droite et continuons à écrireworld
Cas de test:
["another", "test", "string"] or "another test string" ->
another
t
e
s
tstring
["programming", "puzzles", "and", "code", "golf"] or "programming puzzles and code golf" ->
programming
p
u
z
z
l
e
sand
c
o
d
egolf
["a", "single", "a"] or "a single a" ->
a
s
i
n
g
l
ea
Critères gagnants
Le code le plus court en octets dans chaque langue gagne. Ne vous laissez pas décourager par les langues du golf!
Réponses:
Fusain , 9 octets
Essayez-le en ligne! Le lien est vers la version détaillée du code. Explication: Fonctionne en dessinant le texte à l'envers, en transposant la toile après chaque mot. 10 octets pour l'entrée de chaîne:
Essayez-le en ligne! Le lien est vers la version détaillée du code. Explication: dessine le texte en arrière, transposant le canevas pour les espaces.
la source
C (gcc) ,
947874 octets-4 de Johan du Toit
Essayez-le en ligne!
Imprime l'échelle, un caractère (de l'entrée) à la fois. Prend une chaîne de mots séparés par des espaces.
la source
*s==32
en*s<33
pour enregistrer un octet.05AB1E ,
1916 octets-3 octets grâce à @Emigna .
Essayez-le en ligne.
Explication générale:
Tout comme @Emigna réponse 05AB1E de (assurez - vous de le upvote btw !!), j'utilise la toile builtin
Λ
.Les options que j'utilise sont cependant différentes (c'est pourquoi ma réponse est plus longue ..):
b
(les chaînes à imprimer): je laisse inchangée la première chaîne de la liste et j'ajoute le caractère de fin à chaque chaîne suivante de la liste. Par exemple["abc","def","ghi","jklmno"]
deviendrait["abc","cdef","fghi","ijklmno"]
.a
(la taille des lignes): Ce serait égal à ces chaînes, donc[3,4,4,7]
avec l'exemple ci-dessus.c
(la direction dans laquelle imprimer):,[2,4]
qui correspondrait à[→,↓,→,↓,→,↓,...]
Ainsi, l'exemple ci-dessus procéderait pas à pas comme suit:
abc
en direction2
/→
.cdef
dans la direction4
/↓
(où le premier caractère chevauche le dernier caractère, c'est pourquoi nous avons dû modifier la liste comme ceci)fghi
dans la direction2
/ à→
nouveau (également avec chevauchement des caractères de fin / de début)ijklmno
dans la direction4
/ à↓
nouveau (également avec chevauchement)Explication du code:
la source
€θ¨õšsøJ
.€θ¨õšsøJ
areõIvy«¤})
,õUεXì¤U}
etε¯Jθ줈}
(les deux dernières nécessitent--no-lazy
). Malheureusement, ce sont tous de la même longueur. Ce serait beaucoup plus facile si l'une des variables par défaut était""
...""
... " Recherchez -vousõ
, ou voulez-vous dire siX
/Y
/ l'®
aurait été""
? Btw, joli 13 byter dans le commentaire de la réponse d'Emigna. Assez différent du mien et de son tbh, avec les directions[→,↙,↓,↗]
que vous avez utilisées.õ
n'est pas une variable. Oui, je veux dire une variable par défaut""
. Je le fais littéralementõU
au début de l'un des extraits, donc si X (ou toute autre variable) par défaut""
, cela économiserait trivialement deux octets. Merci! Oui, ↙↗ est un peu nouveau, mais j'ai eu l'idée d'intercaler les vraies écritures avec des écritures factices de longueur 2 de la réponse d'Emigna.05AB1E ,
1413 octets1 octet enregistré grâce à Grimy
Essayez-le en ligne!
Explication
la source
€Y¦
pourrait être2.ý
(pas qu'il sauverait des octets ici). Et c'est la première fois que je vois le nouveau comportement de€
par rapport à la carte régulière utile..ý
utilisé auparavant mais je ne me suis jamais utilisé donc je n'y ai pas pensé.€
est la carte habituelle pour moi et je l'ai souvent utilisée, l'autre est la "nouvelle" carte;)Canevas ,
17121110 octetsEssayez-le ici!
Explication:
la source
JavaScript (ES8),
91 7977 octetsPrend l'entrée comme un tableau de mots.
Essayez-le en ligne!
Commenté
la source
p
pour garder une trace des fins de ligne est très intelligente +1Python 2 , 82 octets
Essayez-le en ligne!
la source
brainfuck , 57 octets
Essayez-le en ligne!
Prend l'entrée en tant que chaînes séparées par NUL. Notez que cela utilise EOF comme 0 et cessera de fonctionner lorsque l'échelle dépasse 256 espaces.
Explication:
la source
.
à la ligne 3 (de la version commentée)? J'essayais de jouer avec l'entrée sur TIO. Sur Mac, je suis passé du clavier à la saisie de texte Unicode et j'ai essayé de créer de nouvelles limites de mots en tapantoption+0000
mais cela n'a pas fonctionné. Une idée pourquoi pas?-
au lieu de.
pour l'explication. Pour ajouter des octets NUL dans TIO, je recommande d'utiliser la console et d'exécuter une commande comme$('#input').value = $('#input').value.replace(/\s/g,"\0");
. Je ne sais pas pourquoi votre chemin n'a pas fonctionnéJavaScript, 62 octets
Essayez-le en ligne!
Merci Rick Hitchcock , 2 octets enregistrés.
JavaScript, 65 octets
Essayez-le en ligne!
la source
t
para
, puis en supprimantt=
Aheui (ésotope) ,
490458455 octetsEssayez-le en ligne!
Légèrement joué en utilisant des caractères pleine largeur (2 octets) au lieu du coréen (3 octets).
Explication
Aheui est un esolang de type befunge. Voici le code avec la couleur :? 1 partie vérifie si le caractère actuel est un espace ou non.
? 2 parties vérifient si les mots ont été écrits de droite à gauche ou de haut en bas.
? La partie 3 est la condition de rupture de la boucle qui tape les espaces.
? 4 parties vérifient si le caractère actuel est en fin de ligne (-1).
La partie rouge est l'initialisation de la pile. Aheui utilise des piles (de
Nothing
àㅎ
: 28 piles) pour stocker la valeur.La partie orange prend input (
뱋
) et vérifie s'il s'agit d'espace, en soustrayant avec32
(code ascii de l'espace).La partie verte ajoute 1 à la pile qui stocke la valeur de la longueur de l'espace, si vous écrivez de droite à gauche.
La partie violette est une boucle pour l'impression des espaces, si vous écrivez de haut en bas.
Vérification de la partie grise si le caractère actuel est
-1
, en en ajoutant un au caractère actuel.La partie bleue imprime le caractère actuel et se prépare pour le caractère suivant.
la source
Japt
-P
, 15 octetsEssayez-le
la source
bash, 119 caractères
Cela utilise des séquences de contrôle ANSI pour déplacer le curseur - ici, j'utilise uniquement la sauvegarde
\e7
et la restauration\e8
; mais la restauration doit être préfixée avec\n
pour faire défiler la sortie si elle est déjà en bas du terminal. Pour une raison quelconque, cela ne fonctionne pas si vous n'êtes pas déjà au bas du terminal. * haussement d'épaules *Le caractère actuel
$c
est isolé en tant que sous-chaîne à un seul caractère de la chaîne d'entrée$w
, en utilisant l'for
index de boucle$i
comme index dans la chaîne.La seule vraie astuce que j'utilise ici est celle
[ -z $c ]
qui retourneratrue
, c'est-à-dire que la chaîne est vide, quand$c
est un espace, car il n'est pas cité. Dans l'utilisation correcte de bash, vous devez citer la chaîne en cours de test-z
pour éviter exactement cette situation. Cela nous permet d'inverser l'indicateur de direction$d
entre1
et0
, qui est ensuite utilisé comme index dans le tableau de séquence de contrôle ANSI,X
sur la prochaine valeur non spatiale de$c
.Je serais intéressé de voir quelque chose qui utilise
printf "%${x}s" $c
.Oh ça alors ajoutons un espace. Je ne vois pas où je suis ...
la source
Perl 6 , 65 octets
Essayez-le en ligne!
Bloc de code anonyme qui prend une liste de mots et s'imprime directement sur STDOUT.
Explication
la source
Fusain , 19 octets
Entrée sous forme de liste de chaînes
Essayez-le en ligne (verbeux) ou essayez-le en ligne (pur)
Explication:
Boucle dans la gamme
[0, input-length)
:Si l'indice est impair:
Imprimez la chaîne à l'index
i
vers le bas:Et puis déplacez le curseur une fois vers le coin supérieur droit:
Sinon (l'indice est pair):
Imprimez la chaîne à l'index
i
dans la bonne direction:Et puis déplacez une fois le curseur vers le bas à gauche:
la source
Python 2 ,
8988 octetsEssayez-le en ligne!
la source
C # (Visual C # Interactive Compiler) , 122 octets
Essayez-le en ligne!
la source
J ,
474543 octetsEssayez-le en ligne!
J'ai trouvé une approche différente et amusante ...
J'ai commencé à jouer avec les pads gauche et les zips avec des gérondes cycliques et ainsi de suite, mais j'ai réalisé qu'il serait plus facile de calculer simplement la position de chaque lettre (cela se résume à une somme de scan du tableau correctement choisi) et d'appliquer la modification
}
à un blanc toile sur l'entrée rasée.La solution est gérée presque entièrement par Amend
}
:; ( single verb that does all the work ) ]
fourche globale;
la partie gauche rase l'entrée, c'est-à-dire met toutes les lettres dans une chaîne contiguë]
la partie droite est l'entrée elle-même(stuff)}
nous utilisons le formulaire gérondif de amende}
, qui se compose de trois partiesv0`v1`v2
.v0
nous donne les "nouvelles valeurs", qui est le raze (c'est-à-dire tous les caractères de l'entrée en une seule chaîne), nous utilisons donc[
.v2
nous donne la valeur de départ, que nous transformons. nous voulons simplement une toile vierge d'espaces aux dimensions nécessaires.([ ' '"0/ [)
nous en donne une de taille(all chars)x(all chars)
.v1
sélectionne les positions dans lesquelles nous mettrons nos caractères de remplacement. C'est le nœud de la logique ...0 0
en haut à gauche, nous remarquons que chaque nouveau caractère est soit 1 à droite de la position précédente (c.-à-d.prev + 0 1
) Ou un en bas (c.-àprev + 1 0
-d.). En effet, nous répétons les anciens «len de mot 1», puis les derniers «len de mot 2», et ainsi de suite. Nous allons donc simplement créer la séquence correcte de ces mouvements, puis les numériser, et nous aurons nos positions, que nous encadrerons ensuite parce que c'est comme ça que Amend fonctionne. Ce qui suit n'est que la mécanique de cette idée ...([: <@(+/)\ #&> # # $ 1 - e.@0 1)
#:@1 2
Crée d' abord la matrice constante0 1;1 0
.# $
puis l'étend pour qu'il ait autant de lignes que l'entrée. par exemple, si l'entrée contient 3 mots, elle produira0 1;1 0;0 1
.#&> #
la partie gauche de celui-ci est un tableau des longueurs des mots d'entrée et#
est copie, donc elle copie0 1
"len de mot 1" fois, puis1 0
"len de mot 2 fois", etc.[: <@(+/)\
fait la somme et la boîte de numérisation.la source
T-SQL, 185 octets
Essayez-le en ligne
la source
Rétine , 51 octets
Essayez-le en ligne!
Une approche assez simple qui marque tous les autres mots et applique ensuite la transformation directement.
Explication
Nous marquons tous les autres mots avec un point-virgule en faisant correspondre chaque mot, mais en appliquant uniquement le remplacement aux correspondances (qui sont indexées zéro) à partir de la correspondance 1, puis 3 et ainsi de suite.
+(m
définit certaines propriétés pour les étapes suivantes. Le plus commence une boucle "pendant que ce groupe d'étapes change quelque chose", et le crochet ouvert indique que le plus doit s'appliquer à toutes les étapes suivantes jusqu'à ce qu'il y ait un crochet étroit devant un backtick (qui est toutes les étapes de ce cas). Lem
juste indique à l'expression régulière de traiter^
comme correspondant également depuis le début des lignes au lieu du début de la chaîne.Le regex réel est assez simple. Nous faisons simplement correspondre la quantité appropriée de choses avant le premier point-virgule, puis utilisons la
*
syntaxe de remplacement de Retina pour insérer le nombre correct d'espaces.Cette étape est appliquée après la dernière pour supprimer les points-virgules et les espaces à la fin des mots que nous avons modifiés en vertical.
la source
Retina 0.8.2 , 58 octets
Essayez-le en ligne! Le lien inclut des cas de test. Solution alternative, également 58 octets:
Essayez-le en ligne! Le lien inclut des cas de test.
Je n'utilise pas délibérément Retina 1 ici, donc je ne reçois pas d'opérations sur des mots alternatifs gratuitement; au lieu de cela, j'ai deux approches. La première approche se divise sur toutes les lettres en mots alternés en comptant les espaces précédents, tandis que la deuxième approche remplace les espaces alternatifs par des retours à la ligne, puis utilise les espaces restants pour l'aider à diviser les mots alternatifs en lettres. Chaque approche doit ensuite joindre la dernière lettre verticale au mot horizontal suivant, bien que le code soit différent car ils divisent les mots de différentes manières. L'étape finale des deux approches remplit ensuite chaque ligne jusqu'à ce que son premier caractère non spatial soit aligné sous le dernier caractère de la ligne précédente.
Notez que je ne suppose pas que les mots ne sont que des lettres parce que je n'ai pas à le faire.
la source
PowerShell ,
101 8983 octets-12 octets grâce à mazzy .
Essayez-le en ligne!
la source
& $b @p
(chaque mot comme argument), 3) utiliser une forme plus courte pournew line
constante. voir 3,4 ligne dans cet exemplefoo
. voir le code .Given a list of at least two words...
PowerShell ,
7465 octetsEssayez-le en ligne!
la source
R , 126 octets
Essayez-le en ligne!
la source
T-SQL, 289 octets
Cela s'exécute sur SQL Server 2016 et d'autres versions.
@ contient la liste délimitée par des espaces. @I suit la position d'index dans la chaîne. @S suit le nombre total d'espaces à mettre en retrait à partir de la gauche. @B suit l'axe sur lequel la chaîne est alignée au point @I.
Le nombre d'octets inclut la liste d'exemples minimale. Le script parcourt la liste, caractère par caractère, et modifie la chaîne afin qu'elle s'affiche selon les exigences. Lorsque la fin de la chaîne est atteinte, la chaîne est imprimée.
la source
JavaScript (Node.js) , 75 octets
Essayez-le en ligne!
Explication et non golfé
la source
Stax , 12 octets
Exécuter et déboguer
la source
Gelée , 21 octets
Essayez-le en ligne!
Un programme complet prenant l'entrée en tant que liste de chaînes et sortant implicitement pour sortir de l'échelle de mots.
la source
C (gcc) ,
9387 octetsMerci à gastropner pour les suggestions.
Cette version prend un tableau de chaînes terminées par un pointeur NULL.
Essayez-le en ligne!
la source
Brain-Flak , 152 octets
Essayez-le en ligne!
Je soupçonne que cela peut être plus court en combinant les deux boucles pour les mots pairs et impairs.
la source
J,
3533 octetsIl s'agit d'un verbe qui prend l'entrée en une seule chaîne avec les mots séparés par des espaces. Par exemple, vous pouvez l'appeler comme ceci:
La sortie est une matrice de lettres et d'espaces, que l'interprète sort avec des sauts de ligne selon les besoins. Chaque ligne sera remplie d'espaces afin qu'ils aient exactement la même longueur.
Il y a un léger problème avec le code: cela ne fonctionnera pas si l'entrée a plus de 98 mots. Si vous souhaitez autoriser une entrée plus longue, remplacez le
_98
dans le code par_998
pour autoriser jusqu'à 998 mots, etc.Permettez-moi d'expliquer comment cela fonctionne à travers quelques exemples.
Supposons que nous ayons une matrice de lettres et d'espaces que nous imaginons être une sortie partielle pour certains mots, en commençant par un mot horizontal.
Comment pourrions-nous ajouter un nouveau mot avant cela, verticalement? Ce n'est pas difficile: il suffit de transformer le nouveau mot en une matrice de lettres à une colonne avec le verbe
,.
, puis d'ajouter la sortie à cette matrice à une seule colonne. (Le verbe,.
est pratique car il se comporte comme une fonction d'identité si vous l'appliquez à une matrice que nous utilisons pour le golf.)Maintenant, nous ne pouvons pas simplement répéter cette façon de ajouter un mot tel quel, car nous n'obtiendrions que des mots verticaux. Mais si nous transposons la matrice de sortie entre chaque étape, alors chaque autre mot sera horizontal.
Notre première tentative de solution consiste donc à mettre chaque mot dans une matrice à une colonne, puis à les plier en les ajoutant et en les transposant entre eux.
Mais il y a un gros problème avec ça. Cela place la première lettre du mot suivant avant de tourner à angle droit, mais la spécification nécessite de tourner avant de mettre la première lettre, donc la sortie devrait être quelque chose comme ceci à la place:
La façon dont nous y parvenons consiste à inverser la chaîne d'entrée entière, comme dans
puis utilisez la procédure ci-dessus pour construire le zig-zag mais en ne tournant qu'après la première lettre de chaque mot:
Retournez ensuite la sortie:
Mais maintenant, nous avons encore un autre problème. Si l'entrée a un nombre impair de mots, alors la sortie aura le premier mot vertical, alors que la spécification dit que le premier mot doit être horizontal. Pour résoudre ce problème, ma solution remplit la liste de mots à exactement 98 mots, en ajoutant des mots vides, car cela ne change pas la sortie.
la source