Défi:
Étant donné une liste de chaînes multi-lignes, superposez-les (en haut à gauche) et affichez le résultat.
Exemple:
Entrée: ["aaaa\naaaa\naaaa\naaaa","bb\nbb\nbb","c"]
Sortie:
cbaa
bbaa
bbaa
aaaa
Règles du défi:
- Le format d'entrée est flexible. Vous êtes autorisé à obtenir l'entrée sous la forme d'une liste 2D de lignes (ie
[["aaaa","aaaa","aaaa","aaaa"],["bb","bb","bb"],["c"]]
) ou d'une liste 3D de caractères (ie[[["a","a","a","a"],["a","a","a","a"],["a","a","a","a"],["a","a","a","a"]],[["b","b"],["b","b"],["b","b"]],[["c"]]]
). Vous êtes autorisé à prendre toutes les entrées une par une via STDIN. Etc. - Le format de sortie est strict. Vous pouvez choisir d'imprimer ou de renvoyer la chaîne multiligne. (Si votre langue n'a pas de chaînes, la sortie sous forme de liste 2D de caractères est autorisée comme alternative. Mais uniquement si votre langue n'a pas de chaînes du tout.)
- L'ordre de la liste d'entrées est bien sûr important (mais vous pouvez prendre l'entrée en sens inverse si vous le souhaitez).
- Les entrées ne contiendront que de l'ASCII imprimable dans la plage unicode (
!"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~
). - Les entrées ne seront que des rectangles (donc pas de formes étranges). Cependant, la sortie n'est pas un rectangle nécessaire.
- Les espaces de fin et une seule nouvelle ligne de fin sont autorisés. Espaces de tête et / ou nouvelles lignes non.
Règles générales:
- C'est du code-golf , donc la réponse la plus courte en octets l'emporte.
Ne laissez pas les langues de golf de code vous décourager de publier des réponses avec des langues autres que le golf de code. Essayez de trouver une réponse aussi courte que possible pour «n'importe quel» langage de programmation. - Des règles standard s'appliquent à votre réponse avec des règles d'E / S défaut , vous êtes donc autorisé à utiliser STDIN / STDOUT, des fonctions / méthodes avec les paramètres appropriés et des programmes complets de type retour. Ton appel.
- Failles par défaut sont interdites.
- Si possible, veuillez ajouter un lien avec un test pour votre code (par exemple TIO ).
- De plus, l'ajout d'une explication à votre réponse est fortement recommandé.
Cas de test:
Entrée: ["aaaa\naaaa\naaaa\naaaa","bb\nbb\nbb","c"]
Sortie:
cbaa
bbaa
bbaa
aaaa
Entrée: ["12345\n54321","00\n00\n00\n00","001\n011\n012"]
Sortie:
00145
01121
012
00
Entrée: ["sm\noo\nmr\nee\nt!\nh_\ni_\nn_\ng_","!@#$%^\n&*()_+\nqwerty\nuiopas","this\nis_a\ntest"]
Sortie:
this%^
is_a_+
testty
uiopas
t!
h_
i_
n_
g_
Réponses:
Gelée , 3 octets
Essayez-le en ligne!
Je n'avais pas utilisé Jelly depuis un moment mais je pensais que le défi dans les commentaires était battable. Utilise très directement logique et (
a
) pour effectuer l'opération d'empilement entre chaque élément de l'entrée (/
).Y
est utilisé pour imprimer dans le format requis.la source
ḷ""/Y
avec une liste d'entrée inversée. Je ne savais même pasa
..JavaScript (Node.js) , 24 octets
Sauvegardé 2 octets grâce à @Grimy
Suppose que la chaîne renvoyée est imprimée sur un terminal qui prend en charge les codes d'échappement ANSI . Contient le caractère non imprimable ESC, qui est échappé (sans jeu de mots) comme
\x1B
ci-dessous.Cela ne fonctionne pas sur TIO, mais vous pouvez l' essayer en ligne! pour voir la sortie brute à la place.
Comment?
Les séquences CSI utilisées sont:
ED (Effacer à l'écran):
ESC[2J
où2 signifie "effacer tout l'écran"
CUP (position du curseur):
ESC[H
ce qui signifie "déplace le curseur sur la lignen , colonne m " où n et m sont omis et définis implicitement sur 1 (coin supérieur gauche de l'écran).
Exemple de sortie
la source
;
. En outre, je pense que cela devrait être "JavaScript + terminal" ou quelque chose de similaire qui ne rivalise pas avec JavaScript pur.if the last parameter sub-string(s) is empty, the separator preceding it may be omitted
. Puisqu'il n'y a que deux sous-chaînes, le séparateur précédant la dernière sous-chaîne est le seul, et il peut être omis.\x1B[H
+ est-il nécessaire? N'est-ce pas commencer en haut à gauche par défaut, et vous n'avez qu'à le réinitialiser après chaque entrée (ce que fait la jointure)? Ou commence-t-il initialement ailleurs par défaut, et vous devez explicitement le laisser démarrer à cette position du curseur pour qu'il se réinitialise avec succès à cette position dans la jointure?f=a=>print(`\x1B[H`+a.join`\x1B[H`)
qu'avecf(input_here)
produirait la même sortie queprint(f(input_here))
? Je ne vois donc pas pourquoi vous ne seriez pas autorisé à omettre leprint
et à renvoyer simplement une chaîne.R ,
120,111110107 octetsEssayez-le en ligne!
Une fonction acceptant une liste de matrice de caractères (la saisie 3D est acceptée).
(comme vous pouvez le constater à partir du nombre d'octets, ce n'est pas très facile à faire dans R ...)
la source
array
au lieu dematrix
!ncol
(vous pouvez transposer pour obtenirnrow
).Python 2 , 88 octets
Essayez-le en ligne!
Explication (avec exemple):
Prend une liste 2D en entrée.
D'abord, la liste d'entrée est zippée, pour obtenir les lignes de chaque rectangle d'entrée (
map(None,l)
est la même une plus longue zip):Chacune de ces lignes est ensuite filtrée en
None
s supprimés et zippée à nouveau:C'est une liste de caractères pour chaque position du résultat souhaité. Ces listes sont à nouveau filtrées et la dernière est prise:
Enfin, les listes résultantes sont jointes et imprimées:
la source
R,
10797 octetsNe semble pas fonctionner sur TIO, ce qui pourrait être lié à l'utilisation du
\r
caractère de retour chariot. Cela fonctionne sur mon installation locale de R.Prend l'entrée comme une liste contenant un vecteur de lignes:
Boucles sur les lignes de chaque rectangle, imprimant un retour chariot après chaque, redémarrant la ligne.
Si nous étirons un peu les règles, nous pouvons éliminer la vérification de la longueur de l'entrée et boucler à l'infini, en imprimant une énorme quantité de nouvelles lignes:
R, 85 octets
la source
\r
et bon retour! Juste une note, je pense que cela ne fonctionne que dans les sessions R interactives (quandinteractive()
retourne vrai)rscript
ligne de commande. Je soupçonne que c'est une chose Windows / Linux, car Windows utilise\r\n
pour les nouvelles lignes et Linux\n
.APL (Dyalog Unicode) , 22 octets SBCS
Fonction de préfixe tacite anonyme prenant comme argument la liste des tableaux de caractères 2D. Impressions.
Essayez-le en ligne!
Cela fonctionne en créant un canevas, puis en l'ajoutant à la liste des blocs et en réduisant (pliant) avec une fonction qui place les blocs dans le coin.
↑
mélanger le bloc 2D pour créer un bloc 3D orthogonal, en les remplissant d'espaces au besoin1⌷
prendre la première couche⊂
joindre qui∘
ensuite⌽,
ajouter la liste inversée des blocs(
…)
Appliquez la fonction tacite suivante:{
…}/
Réduisez en utilisant le lambda anonyme suivant:⊢⍵
avec le bon argument comme toile…⍺@(
…)
Modifier avec les éléments de l'argument de gauche, placés aux indices suivants:⍴⍺
la forme de l'argument de gauche⍳
les ɩ ndices d'un tableau de cette forme⊃
divulguer (parce que la réduction incluse pour réduire le rang)la source
Haskell, 66 octets
L' entrée est considérée comme une liste de la liste des chaînes dans l' ordre inverse, par exemple pour le premier test:
[["c"],["bb","bb","bb"],["aaaa","aaaa","aaaa","aaaa"]]
.Essayez-le en ligne!
la source
05AB1E , 12 octets
Port de la solution python de TFeld
2 octets économisés grâce à Grimy
Essayez-le en ligne!
Explication
Version alternative à 14 octets
Essayez-le en ligne!
Explication
la source
--no-lazy
c'est le correctif de toujours utiliser une carte / filtre avec impression pour l'implicitey
, pour enregistrer un octet par rapport àvy...,
:) Je savais que cela fonctionnait dans la version héritée, mais dans la nouvelle version, il produirait également le[...]
. Je ne savais pas que c'était dû au manque de--no-lazy
. ;) Quant à la réponse elle-même, très sympa! Je savais qu'une réduction cumulative était nécessaire, mais je ne pouvais pas vraiment m'en sortir quand je l'ai essayée moi-même. Vous avez l'air si facile ..õζεõK
peut êtreζεðK
,õζõδK
peut êtreζðδK
.Canevas , 5 octets
Essayez-le ici!
Si le chevauchement de
/
+\
→X
,-
+|
→+
, etc. convenait, 2 octets fonctionneraient.la source
Python 2 , 77 octets
Essayez-le en ligne!
la source
PowerShell 6 , console uniquement, 20 octets
basé sur Arnauld réponse . Cela fonctionne uniquement avec la console et ne fonctionne pas sur TIO.
Essayez-le en ligne!
PowerShell , 103 octets
Essayez-le en ligne!
Déroulé:
la source
C # (.NET Core) , 68 + 23 = 91 octets
23 octets pour l'importation,
using C=System.Console;
Ne fonctionne pas dans TIO, car ce n'est pas une console.
Essayez-le en ligne!
la source
Rubis , 67 octets
L'entrée est une liste de lignes. Construit une liste de lignes et écrase tout au long des entrées, puis les joint avec une nouvelle ligne (représentée par la variable
$/
) à la fin pour correspondre à la sortie stricte.Essayez-le en ligne!
la source
C (GCC, MinGW) 138 octets
Suppose que CR place le curseur au début de la ligne actuelle.
Testé avec:
la source
Octave ,
7167 octetsFonction qui prend un tableau de cellules verticales de matrices de caractères et renvoie une matrice de caractères.
Essayez-le en ligne! Ou vérifiez tous les cas de test .
la source
Javascript (navigateur) ,
216208204 octetsMa tentative. Je ne suis pas content de la taille, et il doit certainement y avoir plus à améliorer, mais je ne suis pas très expérimenté au golf.
Quoi qu'il en soit, ce qu'il fait est d'abord de diviser toutes les chaînes, puis d'inverser toutes les chaînes, puis tout en bouclant dans un pad d' opération de réduction toutes les chaînes ensemble. Ensuite, inversez à nouveau toutes les chaînes, puis joignez-les à nouveau avec des nouvelles lignes.
Un merci spécial à Kevin Cruijssen pour m'avoir rappelé que la dernière partie d'une boucle for se produit à la fin et une économie d'octets totale de 8 octets.
la source
('')
peuvent être deux `pour économiser quatre octets :)for(i=0;i<b.length;i++){j=a[i];if(!j)j=b[i];a[i]=b[i].padStart(j.length,j)}
parfor(i=0;i<b.length;a[i]=b[i++].padStart(j.length,j))if(!(j=a[i]))j=b[i];
.j
est d'abord attribué à(j=a[i])
, puis l'instruction if est effectuée avecif(!...)j=b[i];
(où...
est le(j=a[i])
, donc la valeur mise à jour dej
), puis;a[i]=b[i++].padStart(j.length,j))
est effectuée à la fin de l'itération pour la boucle. Vous ne savez pas où se trouve le problème, et cela semble fonctionner?C (gcc) ,
5147 octetsEssayez-le en ligne!
-4 octets grâce au plafond.
Utilise les séquences CSI pour enregistrer / restaurer la position du curseur. Itère simplement sur le tableau de chaînes passé (au même format que
argv
) et imprime<save position>string<restore position>
pour chacun.Cela laisse le curseur en haut à gauche, donc lors de l'exécution sur le terminal, il est important de laisser suffisamment de nouvelles lignes par la suite pour que l'invite n'encombre pas l'entrée.
la source
Japt
-P
, 7 octetsPrend l'entrée comme un tableau de chaînes multi-lignes, produit une seule chaîne multi-lignes.
Essayez-le
la source
Requête T-SQL,
297295 octetsUtiliser ¶ comme séparateur et une variable de table comme entrée.
Essayez-le en ligne
la source
Javascript (navigateur),
129124 octetsMa première tentative de golf de code. J'ai lu les liens donnés dans les règles (failles, règles standard ...), donc j'espère avoir fait quelque chose de mal!
J'ai conservé les entrées telles qu'elles sont dans le premier message (sous forme de tableau plat).
Merci à Kevin Cruijssen d' avoir économisé 5 octets.
Tests:
Afficher l'extrait de code
la source
for(a of o){for(l in a){b=a[l],r[l]=(r[l])?b+r[l].slice(b.length):b}}
peut êtrefor(a of o)for(l in a)b=a[l],r[l]=r[l]?b+r[l].slice(b.length):b;
:)=(r[l])?
laquelle peut être supprimée=r[l]?
:)r
. Sans cela, le résultat du mappage serait renvoyé à la place.Pyth , 18 octets
Essayez-le en ligne!(remarque: le code lui-même n'évalue qu'un seul bloc, le mode suite de tests de l'interpréteur exécute le programme une fois pour chaque ligne d'entrée)
Basé sur la solution Python 2 de TFeld .
Explication:
pour une explication des raisons pour lesquelles l'algorithme lui-même fonctionne, voir la réponse de TFeld.
la source
Fusain , 4 octets
Essayez-le en ligne (verbeux) ou essayez-le en ligne (pur) .
Explication:
Boucle sur la liste d'entrée des chaînes multi-lignes:
Et imprimez la chaîne multi-lignes sans déplacer le curseur:
la source