Comment les cordes sont tordues
L'algorithme de torsion est très simple. Chaque colonne est décalée vers le bas par son index (col 0 descend 0, col 1 se déplace 1, ...). Le décalage de colonne se déplace vers le haut. Cela fonctionne comme ceci:
aaaa
bbbb
cccc
Devient:
a
ba
cba
----
cba
cb
c
Avec tout sous la ligne enveloppant vers le haut. Exemple réel:
Original:
\\\\\\\\\\\\
............
............
............
Twisted:
\...\...\...
.\...\...\..
..\...\...\.
...\...\...\
Contribution
L'entrée est soit un tableau de chaînes, soit une chaîne de plusieurs lignes. Toutes les lignes ont la même longueur.
Sortie
La chaîne torsadée, sortie multi-ligne vers sortie standard (ou alternative la plus proche).
Exemples:
( >
indique l'entrée, l'espace de fin est important)
>Hello, world!
>I am another
>string to be
>twisted!
Hwrmoe oo br!
Ieii ,dttr e
s lsna !ohl
ttaltgnw ed
>\\\\\\\\\\\\
>............
>............
>............
\...\...\...
.\...\...\..
..\...\...\.
...\...\...\
>abcdefg
>.......
a.c.e.g
.b.d.f.
>abcdefghij
>..........
>..........
a..d..g..j
.b..e..h..
..c..f..i.
>\\\\.....././
>...../.......
>........././.
>..../.^\\....
\.........../
.\....^..../.
..\../.\../..
...\/...\/...
>cdeab
>deabc
>eabcd
>abcde
cbbbb
ddccc
eeedd
aaaae
>aeimquy37
>bfjnrvz48
>cgkosw159
>dhlptx260
ahknqx147
beloru258
cfipsvy69
dgjmtwz30
>abcdefghi
>jklmnopqr
>stuvwxyz1
>234567890
a3ume7yqi
jb4vnf8zr
skc5wog91
2tld6xph0
Réponses:
Brachylog , 5 octets
Essayez-le en ligne!
Obtient une entrée sous forme de tableau de colonnes (ce qui semble correspondre aux spécifications de la question).
iᵇ
- Pour chaque élément du tableau, associez-le à son index (basé sur 0)ᵐ
- mappez ce prédicat à chaque élément du résultat:↻₎
- permutez (la colonne) de façon circulaire du montant spécifié comme dernier élément (l'index)Extension facile à une version qui accepte une seule chaîne multiligne:
13 octets
Essayez-le en ligne!
la source
Pyth, 11
Essayez-le ici
la source
APL (Dyalog) , 7 octets
A besoin
⎕io←0
Essayez-le en ligne!
⍬⍋⍉
obtient la plage de 0 au nombre de colonnes⊖
revers verticalement⊖⊖⍨⍬⍋⍉
rotation (verticalement) le (verticalement) inversé par entrée0,1..
⊖
inverse que, et le retourner.la source
Rétine ,
1111019287 octetsLe nombre d'octets suppose un codage ISO 8859-1.
Woo, l'a résolu dans une seule substitution d'expression régulière. :) (Il y a de fortes chances qu'il y ait une solution plus courte en utilisant plusieurs, mais où est le plaisir là-dedans ...)
Essayez-le en ligne!
Explication
Cela nécessite une connaissance de base des groupes d'équilibrage . En bref, la saveur regex de .NET vous permet de capturer plusieurs fois avec un seul groupe, en poussant toutes les captures sur une pile. Cette pile peut également être extraite, ce qui nous permet de l'utiliser pour compter les choses à l'intérieur de l'expression régulière.
Cela pousse une capture sur les deux groupes
1
et2
pour chaque personnage devant le match (dans la ligne actuelle). Autrement dit, il compte la position horizontale du match.Le reste est dans une impasse:
Nous faisons correspondre chaque ligne et la poussons également sur le groupe
1
, de sorte que le groupe1
est maintenant la somme de la position horizontale et verticale (où cette dernière est comptée à partir du bas ). Cela marque essentiellement les diagonales de la grille avec des valeurs croissantes à partir du coin inférieur gauche. Cela.*
déplace alors simplement le curseur du moteur à la fin de la chaîne.Nous passons maintenant à un lookbehind, qui est mis en correspondance de droite à gauche dans .NET:
Cela fera apparaître à plusieurs reprises exactement les
H
captures du groupe1
(oùH
est la hauteur de l'entrée). Le but de cela est de prendre le groupe moduloH
. Ensuite, le groupe1
contient la ligne (comptée à partir du bas) à partir de laquelle choisir le nouveau caractère dans la colonne actuelle.Encore un coup d'œil, partant de nouveau à droite.
(?<-1>.+¶)*.+
utilise maintenant le groupe1
pour trouver la ligne à partir de laquelle choisir le nouveau personnage, puis le trouve la colonne préanalyse correcte en utilisant le groupe2
.Le caractère souhaité est capturé en groupe
3
et réécrit par la substitution.la source
$+
air utile ... surtout si vous ne voulez faire qu'une seule substitution: ^)$+
est en fait assez inutile ... sa description sur MSDN semble beaucoup plus utile qu'elle ne l'est parce qu'elle implique que(a)|(b)
->$+$+
doublerait tous lesa
s etb
s mais à la place elle supprime tous lesa
s, car elle se réfère simplement au dernier groupe syntaxiquement . Cela signifie que c'est juste un moyen d'éviter de compter tous les groupes si vous êtes trop paresseux (comme moi). Pour le golf, cela n'économise que des octets lorsque vous avez plus de 9 groupes, ce qui est probablement assez rare au départ.Regex.Replace
pour Retina, mais je n'ai pas encore réussi à l'implémenter).CJam, 13 octets
Testez-le ici.
Explication
la source
TeaScript, 10 octets
Grâce à la syntaxe extrêmement concise de TeaScript 3, ceci est vraiment court: D
Serait plus court d'un octet si la boucle Sigma n'était pas boguée
Essayez-le en ligne
Explication
la source
Python 3, 164 octets
Pas la meilleure réponse de loin, mais la première en Python ...
la source
)
]
''.join(l)for l in....
MATLAB,
9236 octetsEn supposant que la chaîne d'entrée
s
est déjà sous la forme d'un tableau / d'une matrice de caractères 2D, par exempleExplication: parcourez les colonnes de la matrice. Pour chaque colonne, effectuez un décalage circulaire de ses éléments par le nombre de caractères égal à l'index de la colonne (-1 en raison de l'indexation MATLAB).
la source
Brachylog , 96 octets
Cela attend une liste de chaînes de codes de caractères en entrée et sans sortie, par exemple
brachylog_main([`aaaa`,`bbbb`,`cccc`],_).
C'est une réponse ridiculement longue, et il existe probablement un moyen beaucoup plus court de le faire.
Explication
la source
JavaScript,
9289 octets3 octets de réduction merci @Neil .
Afficher l'extrait de code
la source
replace
:m.replace(/./g,(n,j)=>z[((l=z.length)*j+i-j)%l][j])
.[...m].map(
tout le chemin jusqu'au premier inclus.join
.Python 2, 115 octets
Merci à la merveille d'avoir
zip
réussi à ramener cela à une seule ligne. Voyez-le en action ici .la source
MATL , 18
21octetsL'entrée est de la forme
Essayez-le en ligne!
Comment ça marche :
la source
F #, 105 octets
Mon premier coup de couteau (seul un
\n
personnage est requis):Usage:
la source
JavaScript (ES6), 73 octets
Explication
Tester
Afficher l'extrait de code
la source
Japt, 29 octets
Testez-le en ligne!
Comment ça marche
la source
Haskell, 81 octets
réimplémentation de l'exemple CJam, bien que l'inverse, la carte et l'énumération fassent partie de mapAccumR, le snd supprime l'accumulateur puisque nous n'en avons plus besoin, l'inversion n'est qu'un effet secondaire du pli droit.
la source
Haskell, 65 octets
Exemple d'utilisation:
g ["1111","2222","3333"]
->["1321","2132","3213"]
.la source
MATL , 9 octets
Essayez-le en ligne!
Assez similaire dans son noyau à la réponse MATL existante de Luis Mendo , mais plus court en utilisant des fonctionnalités qui n'étaient probablement pas dans le langage à ce stade: 1.
"
itère automatiquement dans les colonnes d'une matrice maintenant, donc pas de travail coûteux de construction d'index de colonne et d'indexation en eux ( c'est le biggie), 2.&h
comme une façon abrégée de direN$h
, et 3. fin de boucle implicite si]
n'est pas spécifié.Alternativement, pour le même bytecount:
Essayez-le sur MATL Online
la source
C (clang) , 114 octets
Fonctionne dans GCC sous MinGW. Le GCC de TIO est confus en utilisant
strlen
l'expression init de la première boucle for.Essayez-le en ligne!
la source