Conversion de n chaînes de longueur m en m chaînes de longueur n

16

Écrivez un programme qui, étant donné un nombre quelconque de chaînes de longueur «m», renvoie un nombre de chaînes «m» de longueur «m», avec cette condition:

Chaque nouvelle chaîne doit contenir les lettres du même index que les autres chaînes

Par exemple, la première chaîne de sortie doit contenir la première lettre de toutes les chaînes d'entrée, la deuxième chaîne de sortie doit contenir la deuxième lettre de toutes les chaînes d'entrée, etc.

Exemples (les chiffres sous les lettres sont les index des chaînes):

input: "car", "dog", "man", "yay"
        012    012    012    012
output: "cdmy", "aoaa", "rgny"
         0000    1111    2222

input: "money", "taken", "trust"
        01234    01234    01234
output: "mtt", "oar", "nku", "ees", "ynt"
         000    111    222    333    444

Supposons que l'entrée est correcte à chaque fois

Le code des octets les plus courts gagne!

Éditer:

Étant donné qu'il existe de nombreux langages de programmation et qu'il pourrait y avoir de nombreuses solutions possibles pour chacun d'eux, je publierai la solution la plus courte pour chaque langage de programmation et l'utilisateur qui l'a fourni. Continuez à coder!

Rééditer:

Grâce à l'utilisateur Dennis, j'ai inséré un extrait pour les classements.

Entrez le nom ici
la source
2
Nous avons un extrait de classement que vous pouvez ajouter à votre corps de question. Pas besoin de le faire à la main.
Dennis
Je suis désolé, je ne savais pas que ça s'appelait "transposition"
Entrez le nom ici le
6
Je ne pense pas que ces défis soient des doublons, en raison des différences impliquant une transposition irrégulière et une manipulation étrange des espaces blancs dans l'autre question. Bien que dans certaines langues, les réponses puissent être très similaires, je pense que dans la plupart des cas, elles seront suffisamment différentes pour que cela ne soit pas un doublon.
FryAmTheEggman
Related , Related
FlipTack

Réponses:

21

Pyth, 1 octet

C

Essayez-le ici

Une autre transposition intégrée

Bleu
la source
5
Comment est-ce possible?!
DavidC
Vous plaisantez sûrement!
Vincent
Pyth est le nouveau Mathematica!
Loovjo
9

Python, 36 29 octets

zip(*s) renvoie une liste de tuples de chaque caractère, transposée.

lambda s:map(''.join,zip(*s))

Essayez-le en ligne

mbomb007
la source
La sortie indique "cdmy", "aoaa", "rgny", qui est une liste ["cdmy", "aoaa", "rgny"]ou un tuple("cdmy", "aoaa", "rgny")
mbomb007
map(''.join,zip(*s))fonctionne également pour la conversion de chaînes (Python 2 uniquement), et pour Python 3, [*map(''.join,zip(*s))]afaik fonctionne
Value Ink
@ KevinLau-notKenny map(''.join,zip(*s))est également valable pour Python 3 - nous autorisons les itérateurs / générateurs à la place des listes par défaut.
Mego
7

MATL , 1 octet

!

Essayez-le en ligne!

Prend l'entrée implicitement, transpose, affiche la sortie implicitement.

Luis Mendo
la source
7

PowerShell v2 +, 66 54 octets

param($n)for($x=0;$n[0][$x];$x++){-join($n|%{$_[$x]})}

Yo ... non map, non zip, non transpose, etc., donc nous pouvons rouler les nôtres. Gros accessoires à @DarthTwon pour le golf de 12 octets.

Prend l'entrée $n, établit une forboucle. L'initialisation est définie $xsur 0, le test consiste à savoir si nous avons encore des lettres dans notre mot $n[0][$x]et nous incrémentons $x++chaque itération.

À l'intérieur de la boucle, nous prenons notre tableau de chaînes, le canalisons vers une boucle intérieure qui crache le caractère approprié de chaque mot. Cela est encapsulé dans un -joinpour former une chaîne, et cette chaîne est laissée sur le pipeline. À la fin de l'exécution, les chaînes du pipeline sont implicitement imprimées.

PS C:\Tools\Scripts\golfing> .\convert-n-strings.ps1 "Darth","-Twon","Rocks"
D-R
aTo
rwc
tok
hns
AdmBorkBork
la source
1
Bien, c'est le genre de réponses que je voulais voir;) C'est une écriture trop simple ,plutôt que de penser à la réponse
Entrez le nom ici
En utilisant une boucle while peut encore réduire cette baisse: param($n)$x=0;while($n[0][$x]){-join($n|%{$_[$x]});$x++}. Et aucune erreur ici: D
ThePoShWolf
@DarthTwon Excellent. Ou, utilisez une forboucle pour deux autres. ;-)
AdmBorkBork
Hmm ... J'ai essayé ça, mais pas après avoir vraiment réduit ma whileboucle. Bon travail monsieur!
ThePoShWolf
Pouvez-vous utiliser Linq dans Powershell?
aloisdg passe à codidact.com
7

Vim, 37 36 frappes

Toutes les autres réponses sont ennuyeuses et utilisent des fonctions ennuyeuses d'un seul octet. Voici une réponse hacky qui fait le tout manuellement, dans quelque chose qui n'est même pas un langage de programmation:

Gmaqqgg:s/./&<cr>d<C-v>`aGo<esc>pvGgJ@qq@q`adgg

Explication:

G                                   "move to the end of this line
     ma                             "And leave mark 'a' here
       qq                           "Start recording in register 'q'
         gg                         "Move to the beginning
           :s/./&<cr>               "Assert that there is atleast one character on this line
                      d             "Delete
                       <C-v>        "Blockwise
                            `a      "Until mark 'a'

    G                               "Move to the end of the buffer
     o<esc>                         "Open a newline below us
           p                        "And paste what we deleted
            vG                      "Visually select everything until the end
              gJ                    "And join these without spaces
                @q                  "Call macro 'q'. The first time, this will do nothing,
                                    "The second time, it will cause recursion.
                  q                 "Stop recording
                   @q               "Call macro 'q' to start it all

Maintenant, tout va bien, mais le tampon a du texte supplémentaire. Nous devons donc:

`a                              "Move to mark 'a'
  dgg                           "And delete everything until the first line
DJMcMayhem
la source
5

CJam, 6 5 octets

1 octet enregistré grâce à Luis Mendo.

qS%zp

Essayez-le en ligne!

q      e# Get all input
 S%    e# Split it on spaces
   z   e# Take the transpose
    p  e# Print it as an array
Chat d'affaires
la source
4

Pyke, 1 octet

,

Essayez-le ici!

Transposer.

Bleu
la source
1
Oh ... Je ne pensais pas que cela aurait été aussi simple: /
Entrez le nom ici le
1
Ouais, je n'arrive pas à trouver de doublon en cherchant 60 secondes
Blue
4

Rétine , 45 43 octets

Le nombre d'octets suppose un codage ISO 8859-1.

O$#`.(?<=(.+))|¶
$.1
!`(?<=(¶)+.*)(?<-1>.)+

Le saut de ligne de tête est significatif. L'entrée et la sortie sont des listes terminées par saut de ligne de chaînes ASCII imprimables (notez que les deux ont un seul saut de ligne de fin).

Essayez-le en ligne!

Je savais depuis un moment que la transposition de blocs rectangulaires serait une douleur dans la rétine (alors que la transposition de carrés n'est pas trop mal), mais je n'ai jamais vraiment essayé. La première solution était en effet un énorme 110 octets de long, mais après plusieurs changements substantiels dans l'approche, les 45 octets résultants ne sont de loin pas aussi mauvais que je le pensais (mais quand même ...). L'explication suivra demain.

Explication

Étape 1: trier

O$#`.(?<=(.+))|¶
$.1

Cela fait le travail principal de réordonner les caractères dans l'entrée, mais cela finit par gâcher la séparation en lignes. Fait intéressant, si nous supprimons le , nous obtenons le code requis pour transposer une entrée carrée.

Les étapes de tri (indiquées par le O) fonctionnent comme ceci: elles trouvent toutes les correspondances de l'expression rationnelle donnée (la chose après le `), puis trient ces correspondances et les réinsèrent dans les endroits où les correspondances ont été trouvées. En fait, cette expression régulière correspond à chaque caractère: les sauts de ligne non via l' .(?<=(.*))alternative et les sauts de ligne via le . Par conséquent, il trie tous les caractères de l'entrée. La partie la plus intéressante est ce qu'ils sont classés par .

L' $option active un mode de "tri par", où chaque correspondance est remplacée par le modèle de substitution sur la deuxième ligne, qui est ensuite utilisé pour comparer les correspondances. De plus, le #paramètre indique à Retina de convertir le résultat de la substitution en un entier et de comparer ces entiers (au lieu de les traiter comme des chaînes).

Donc, finalement, nous devons examiner l'expression rationnelle et la substitution. Si les premières correspondances alternatives (c'est-à-dire que nous avons fait correspondre n'importe quel caractère dans l'une des lignes), le (?<=(.*))capture tout dans ce groupe jusqu'à ce caractère sur cette ligne 1. Le $.1dans le modèle de substitution le remplace par la longueur du groupe 1. Par conséquent, le premier caractère de chaque chaîne devient 1, le second devient 2, le troisième devient3 et ainsi de suite. Il devrait être clair maintenant comment cela transpose une entrée carrée: tous les premiers caractères des lignes viennent en premier et se retrouvent tous dans la ligne la plus haute, puis tous les seconds caractères se retrouvent dans la deuxième ligne et ainsi de suite. Mais pour ces entrées rectangulaires, nous faisons également correspondre les sauts de ligne. Depuis le groupe1n'est pas utilisé dans ce cas, la substitution est vide, mais aux fins de l' #option, cela est considéré 0. Cela signifie que tous les sauts de ligne sont triés vers l'avant.

Alors maintenant, nous avons les caractères dans le premier ordre (premier caractère de chaque chaîne, deuxième caractère de chaque chaîne, etc.) et tous les sauts de ligne au début.

Étape 2: Match

!`(?<=(¶)+.*)(?<-1>.)+

Nous devons maintenant diviser les caractères en lignes de la bonne longueur. Cette longueur correspond au nombre de lignes dans l'entrée d'origine, qui correspond au nombre de sauts de ligne que nous avons au début de la chaîne.

Le fractionnement se fait ici à l'aide d'une étape de correspondance, qui trouve simplement toutes les correspondances de l'expression régulière donnée et utilise l' !option pour imprimer ces correspondances (la valeur par défaut serait de les compter à la place). Le but de l'expression régulière est donc de faire correspondre une ligne à la fois.

Nous commençons par «compter» le nombre avec le lookbehind (?<=(¶)*.*). Il génère une capture en groupe 1pour chaque saut de ligne à l'avant.

Ensuite, pour chacune de ces captures, nous associons un seul caractère avec (?<-1>.)+.

Martin Ender
la source
4

code machine x86, 19 octets

En hex:

fc89d35651a401dee2fb91aa595e464a75f1c3

Entrée:: ECX# de chaînes (n) EDX,: longueur de chaîne individuelle (m) ESI,: tableau de chaînes d'entrée,: EDItampon de sortie recevant un tableau de chaînes. Le tableau est présumé être défini comme char src[n][m+1]pour l'entrée et char dst[m][n+1]pour la sortie, et toutes les chaînes sont terminées par NULL.

0:  fc                  cld
1:  89 d3               mov ebx,edx   ;EDX is the counter for the outer loop
_outer:
3:  56                  push esi
4:  51                  push ecx
_inner:
5:  a4                  movsb         ;[EDI++]=[ESI++]
6:  01 de               add esi,ebx   ;Same char, next string
8:  e2 fb               loop _inner   ;--ECX==0 => break
a:  91                  xchg eax,ecx  ;EAX=0
b:  aa                  stosb         ;NULL-terminate just completed string
c:  59                  pop ecx
d:  5e                  pop esi       ;First string,
e:  46                  inc esi       ;...next char
f:  4a                  dec edx
10: 75 f1               jnz _outer
12: c3                  ret
meden
la source
3

Brachylog , 5 octets

z:ca.

Attend une liste de chaînes en entrée, par exemple run_from_atom('z:ca.',["money":"taken":"trust"],Output).

Explication

z       Zip the strings in the Input list
 :ca.   output is the application of concatenation to each element of the zip
Fatalize
la source
3

05AB1E, 3 octets

ø€J

Expliqué

     # implicit input, eg: ['car', 'dog', 'man', 'yay']
ø    # zip, producing [['c', 'd', 'm', 'y'], ['a', 'o', 'a', 'a'], ['r', 'g', 'n', 'y']]
 €J  # map join, resulting in ['cdmy', 'aoaa', 'rgny']

Essayez-le en ligne

Emigna
la source
2

CJam , 3 octets

{z}

Il s'agit d'un bloc de code (équivalent à une fonction; autorisé par défaut ) qui attend l'entrée sur la pile et laisse la sortie sur la pile.

Essayez-le en ligne!

Luis Mendo
la source
Sûr de ça?
DJMcMayhem
1
@Drgreeneggsandironman Eh bien, la réponse avec plus de votes dit que la valeur par défaut devrait être "programmes ou fonctions"
Luis Mendo
2

JavaScript ES6, 48 46 octets

a=>[...a[0]].map((n,x)=>a.map(a=>a[x]).join``)

Je me sens exclu, nous n'avons pas de fonction zip intégrée. Merci nicael d'avoir signalé mon erreur de type.

Usage

(a=>[...a[0]].map((n,x)=>a.map(a=>a[x])))(["asd","dsa"]); //or whatever is above, might change due to edits

Retour

["ad","ss","da"]
charbon de bois
la source
Exception: TypeError: un [0] .map n'est pas une fonction
edc65
1
Vous en avez besoin [...a[0]].map, car ce a[0]n'est pas un tableau.
nicael
@nicael merci. foiré les types. cela prouve pourquoi je ne devrais pas jouer au golf si tôt le matin.
charredgrass
@nicael Je les ai édités .joinpour résoudre ce problème.
charredgrass
1
join`` au lieu d' join('')enregistrer 2 octets. Downvote rétracté
edc65
2

Utilitaires Bash + BSD, 27

sed s/./\&:/g|rs -c: -g0 -T

E / S via des chaînes séparées par des sauts de ligne STDIN / STDOUT.

Vous devrez peut-être installer rsavec sudo apt install rsou similaire. Fonctionne prêt à l'emploi sur OS X.

L' -Toption de faire rsle gros du travail de la transposition. Le reste est juste un formatage:

  • La sedcommande insère simplement :après chaque caractère
  • -c:spécifie que les colonnes d'entrée sont :séparées
  • -g0 spécifie que les colonnes de sortie ont une séparation de largeur nulle

Si ma lecture de la rspage de manuel est correcte, alors ce qui suit devrait fonctionner pour un score de 12, mais malheureusement cela ne fonctionne pas - voir la note ci-dessous:

rs -E -g0 -T

Exemple de sortie:

$ printf "%s\n" car dog man yay |sed s/./\&:/g|rs -c: -g0 -T
cdmy
aoaa
rgny
$

Si l'entrée est censée être entièrement ASCII imprimable, le :peut être remplacé par un caractère non imprimable, par exemple 0x7 BEL.


Remarque

Je voulais comprendre pourquoi je ne pouvais pas obtenir l' -Eoption de travailler et de me débarrasser du sedprétraitement. J'ai trouvé le rscode source ici . Comme vous pouvez le voir, donner cette option définit le ONEPERCHARdrapeau. Cependant, il n'y a rien dans le code qui vérifie réellement l'état de cet indicateur. Je pense donc que nous pouvons dire que même si cette option est documentée, elle n'est pas mise en œuvre.

En fait, cette option est documentée dans la rspage de manuel Linux :

-E Considérez chaque caractère d'entrée comme une entrée de tableau.

mais pas la version OS X.

Digital Trauma
la source
2

PHP, 82 bytes

function f($a){foreach($a as$s)foreach(str_split($s)as$i=>$c)$y[$i].=$c;return$y;}

takes and returns an array of strings

break down

function f($a)
{
    foreach($a as$s)                    // loop through array $a
        foreach(str_split($s)as$i=>$c)  // split string to array, loop through characters
            $y[$i].=$c;                 // append character to $i-th result string
    return$y;
}

examples

$samples=[
    ["asd","dsa"], ["ad","ss","da"],
    ["car", "dog", "man", "yay"], ["cdmy", "aoaa", "rgny"],
    ["money", "taken", "trust"], ["mtt", "oar", "nku", "ees", "ynt"]
];
echo '<pre>';
while ($samples)
{
    echo '<b>in:</b> ';         print_r($x=array_shift($samples));
    echo '<b>out:</b> ';        print_r(f($x));
    echo '<b>expected:</b> ';   print_r(array_shift($samples));
    echo '<hr>';
}
Titus
la source
2

APL, 3 bytes

↓⍉↑

takes the input strings and turns them into a char matrix. transposes the matrix. splits back the rows of the resulting matrix into strings.

lstefano
la source
1

Mathematica, 26 bytes

""<>#&/@(Characters@#)&

Anonymous function. Takes a string list as input and returns a string list as output. The Unicode character is U+F3C7, representing \[Transpose]. Works by converting to a character matrix, transposing, and converting back to a string list. If the input/output format was stretched, then a simple 5-byte transpose would work:

#&
LegionMammal978
la source
+1 you beat me to the punch! (But I wasn't able to use the Transpose symbol.) By the way, why doesn't the T show up on screen? (It is there when I copy your code to Mathematica).
DavidC
@DavidC The Unicode character is in the Private Use Area, which is marked as a section for proprietary characters and is therefore neither officially assigned a glyph nor rendered at all in most fonts. Mathematica's font just happens to render this character as a supserscript T and interpret it as a \[Transpose].
LegionMammal978
@DavidC Why don't they use ?
Adám
@Adám IDK, you'd have to ask Wolfram Research about that, not me
LegionMammal978
@LegionMammal978 Nah, I'm happy as long as I have APL's obvious .
Adám
1

MATLAB / Octave, 4 bytes

@(x)x'

This defines an anonymous function. Input format is ['car'; 'dog'; 'man'; 'yay'].

Try it here.

Luis Mendo
la source
What format is the input for this solution? I don't think it will work with the way Matlab handles strings if you try to input them in a Matlabby way, e.g. f = @(x)x', f([{'abcd'},{'abcd'},{'abcd'}]) outputs ans = 'abcd' 'abcd' 'abcd'
sintax
@sintax Input format should be a 2D char array, as in the example linked in the answer. You are using a cell array of strings (obtained by concatenating singleton cell arrays). It should be: f(['abcd';'abcd';'abcd']). I've edited the answer to specify the input format
Luis Mendo
1

Haskell, 41 bytes

f l=zipWith($)[map(!!n)|n<-[0..]]$l<$l!!0

Or with a bit more air:

f l = zipWith ($) [map (!! n) | n <- [0..]] $
                  l <$ (l !! 0)

The second list is the list of words repeated “the length of a word” time. On each list of words, we select the n-th letter of each word, giving the result.

villou24
la source
1
There's no need for a full program, because "program" means "program or function", so a function is enough. You can pass and return a list of strings and therefore omit wordsand unwords. Further, map(\_->l)(l!!0) is l<*l!!0, so it boils down to \l->zipWith($)[map(!!n)|n<-[0..]]$l<$l!!0.
nimi
Oh, good thanks :) I'm updating.
villou24
Oops, typo: it's l<$l!!0 (first time wrong, second time right), but you got it right anyway.
nimi
1

Common Lisp, 62 bytes

(lambda(s)(apply'map'list(lambda(&rest x)(coerce x'string))s))

The map function takes a result type (here list), a function f to apply and one or more sequences s1, ..., sn. All sequences are iterated in parallel. For each tuple of elements (e1,...,en) taken from those sequences, we call (f e1 ... en) and the result is accumulated in a sequence of the desired type.

We take a list of strings, say ("car" "dog" "man" "yay"), and use apply to call map. We have to do this so that the input list is used as more arguments to map. More precisely, this:

(apply #'map 'list fn '("car" "dog" "man" "yay"))

... is equivalent to:

(map 'list f "car" "dog" "man" "yay")

And since strings are sequences, we iterate in parallel over all first characters, then all second characters, etc... For example, the first iteration calls f as follows:

(f #\c #\d #\m #\y)

The anonymous lambda takes the list of arguments given to it and coerces it back to a string.

coredump
la source
1

Perl, 91 bytes

So lengthy one..

$l=<>;$p=index($l," ")+1;@i=split//,$l;for$a(0..$p-1){print$i[$a+$_*$p]for(0..$p);print" "}

Try it here!

Swadhikar C
la source
0

Ruby, 46 bytes

Probably the first time that "Ruby strings aren't Enumerables" is actually biting me hard since I had to map the strings into arrays before processing. (Normally having to use String#chars isn't enough of a byte loss to matter, but since I need to map them, it stings a lot more)

->s{s.map!(&:chars).shift.zip(*s).map &:join}
Value Ink
la source
0

Clojure, 68 bytes

#(map(fn[g](reduce(fn[a b](str a(nth b g)))""%))(range(count(% 0))))

Maps a function which is just reduce (goes on elements of the list one by one and joins nth character of the string) on the range from 0 to length of the first string.

See it online: https://ideone.com/pwhZ8e

cliffroot
la source
0

C#, 53 bytes

t=>t[0].Select((_,i)=>t.Aggregate("",(a,b)=>a+b[i]));

C# lambda (Func) where the output is IList<string> and the output is IEnumerable<string>. I dont know how work zip in other language but I can't find a way to use the C#'s one here. Aggregate fit the need well. No transpose in C#, there is one in Excel but I wont use it.

Try it online!

aloisdg moving to codidact.com
la source