Transposer une page de texte

28

EDIT J'ai modifié le libellé des règles pour rendre certaines choses implicites plus explicites. J'ai également ajouté une certaine emphase pour dissiper certains points de confusion apparente et défini explicitement l'option de créer un programme autonome au lieu d'une fonction.

Le but ici est de créer une fonction qui prend un fichier texte (ou une chaîne) et le transpose pour que les lignes deviennent des colonnes et vice versa.

Exemple:

Je suis un texte.
Transpose-moi.
Pouvez-vous le faire?

Résulte en:

ITC
 ra
aan
mn
 sy
apo
 ou
ts
eed
xo
tm
.ei
 .t
  ?

Les règles:

  • Vous pouvez supposer que les seuls caractères d'espacement utilisés sont " "et "\n"et qu'il n'y a aucun espace de fin sur aucune ligne.
  • Vous pouvez supposer que le fichier est ASCII. Le marqueur de fin que vous souhaitez utiliser dépend de vous (CRLF ou LF). Il doit fonctionner correctement sur l'exemple, mais il doit également fonctionner sur toute entrée qui satisfait aux hypothèses ci-dessus.
  • Vous devrez peut-être insérer des espaces (comme dans l'exemple) là où il n'y en avait pas afin de maintenir les colonnes en ligne.
  • Votre résultat ne doit avoir aucun espace de fin sur aucune ligne .
  • Le dernier caractère de nouvelle ligne (pour la dernière ligne) est facultatif.
  • Il doit s'agir soit d'une fonction, soit d'un programme complet. Si votre fonction accepte une chaîne, elle doit renvoyer les résultats sous forme de chaîne. S'il accepte un nom de fichier, vous retournez le nom du fichier dans lequel vous avez enregistré le résultat. Vous êtes également autorisé à écrire un programme complet qui accepte les entrées de STDIN et renvoie le résultat correct à STDOUT; si vous procédez ainsi, vous ne devez rien envoyer à STDERR.
  • La procédure la plus courte l'emporte, mais je voterai pour toutes les réponses que j'aime.

Selon les règles, la sortie de l'exemple est longue de 53 ou 52 octets (pour les sauts de ligne LF) selon que le saut de ligne final est inclus ou non.

Remarque: Ce n'est pas une exigence spécifique, mais si votre fonction, lorsqu'elle est exécutée deux fois de suite, n'est pas identique à l'original (la nouvelle ligne finale peut être différente et toutes les lignes vides à la fin du fichier seront supprimées), alors vous êtes enfreignant probablement l' une des règles.

Tim Seguine
la source
J'ai décidé de supprimer l'interdiction des langues intégrées.
Tim Seguine
J'ai édité pour clarifier la condition d'espace blanc arrière.
Tim Seguine du
Demandez-vous une fonction? Est-il acceptable d'accepter une chaîne de STDIN et d'imprimer la sortie correcte sur STDOUT?
Justin
@Quincunx Oui, j'accepte cela comme une "fonction". Je modifierai les règles pour être explicite sur ce point.
Tim Seguine du
La fonction de transposition de texte ne peut pas être une involution sauf si vous autorisez les ws de fin. Exemple: "a * c \ ndef \ n" -> TT-> "a * \ ncd \ nef \ n" ~ "a \ ncd \ nef \ n" -> TT-> "acd \ nef \ n", où * = ws
Emanuel Landeholm

Réponses:

4

J ( 31 40)

f=:3 :';(,&LF@dlb&.|.)&.><"1|:>LF cut y'

Il s'agit d'une fonction qui prend une chaîne et renvoie une chaîne (c'est-à-dire un vecteur de caractères avec des sauts de ligne insérés aux bons endroits, et non une matrice.)

Modifier: aucun espace de fin sur aucune ligne.

Tester:

   f=:3 :';(,&LF@dlb&.|.)&.><"1|:>LF cut y'

   string=:stdin''
I am a text.
Transpose me.
Can you do it?
^D

   $string
42
   $f string
53
   f string
ITC
 ra
aan
mn
 sy
apo
 ou
ts
eed
x o
tm
.ei
 .t
  ?
marinus
la source
J'espère que vous avez remarqué que j'ai supprimé l'interdiction des intégrés.
Tim Seguine
@Tim: Oui, sinon je n'aurais pas posté ça.
marinus
La règle des espaces de fin est-elle écrite de façon peu claire? Vous semblez avoir plus de personnages que prévu.
Tim Seguine du
Combien de caractères dois-je avoir? Les derniers caractères de la chaîne sont ?\n.
marinus
1
@Tim: Je n'ai pu l'obtenir qu'à 44 en APL. La raison principale est que APL ne fournit ni l'un cutni l' autre dlbpar défaut et les écrire moi-même prend un tas de caractères même dans APL.
marinus
4

Ruby 111

Golfé:

def f t;s=t.lines;s.map{|l|l.chomp.ljust(s.map(&:size).max).chars}.transpose.map{|l|l.join.rstrip+?\n}.join;end

Non golfé:

def transpose_text(text)
  max_length = text.lines.map(&:size).max
  text.lines.map do |line|
    line.chomp.ljust(max_length).chars
  end.transpose.map do |chars|
    chars.join.rstrip + "\n"
  end.join
end

Ruby a une fonction de transposition de tableau, donc cela remplit simplement les lignes, les transforme en un tableau de caractères, utilise la fonction de transposition Array # de Ruby, puis transforme le tableau de caractères en lignes.

Pour jouer au golf, il s'agissait simplement d'utiliser des identificateurs à un seul caractère, de supprimer des espaces, d'utiliser un temporaire pour text.lines et de placer le calcul pour max_length en ligne (il n'y a pas de points pour l'efficacité).

Wayne Conrad
la source
Agréable. Vous pouvez supprimer un caractère de plus en le remplaçant "\n"par ?\n.
OI
De plus, le .to_aest superflu. Vous pouvez y gagner 5 autres personnages.
OI
@OI Merci, je te dois six personnages. J'ai interrompu cela au travail, qui utilise 1.9.3. Le to_a est requis en 1.9.3, mais pas en 2.0.
Wayne Conrad
Je vois. Bon à savoir. Considérez-nous même pour m'avoir montré quelques méthodes String dans Ruby que je devrais utiliser plus souvent. À votre santé!
OI
2
Certains des défis du golf de code ont renouvelé mon intérêt pour l'apprentissage du rubis.
Tim Seguine
4

R, 171

function(e){p=strsplit
x=t(plyr::rbind.fill.matrix(lapply(p(p(e,"\n")[[1]],""),t)))
x[is.na(x)]=" "
cat(apply(x,1,function(y)sub(" *$","",paste(y,collapse=""))),sep="\n")}

Exemple d'utilisation:

text <- "I am a text.
Transpose me.
Can you do it?"


(function(e){p=strsplit
x=t(plyr::rbind.fill.matrix(lapply(p(p(e,"\n")[[1]],""),t)))
x[is.na(x)]=" "
cat(apply(x,1,function(y)sub(" *$","",paste(y,collapse=""))),sep="\n")})(text)

ITC
 ra
aan
mn
 sy
apo
 ou
ts
eed
x o
tm
.ei
 .t
  ?

L'espace de fin est supprimé.

Sven Hohenstein
la source
4

Python 2.7 ( 97 79 94 90)

EDIT: Omission de l'exigence de fonction;

Je suis assez sûr que cela sera amélioré puisque je suis en quelque sorte un débutant ici, mais pour commencer;

c=lambda a:'\n'.join(''.join(y or' 'for y in x).rstrip()for x in map(None,*a.split('\n')))

Le code utilise un simple splitpour diviser la chaîne en un vecteur de lignes. Il utilise ensuite mapavec une valeur de fonction as None(la fonction d'unité) et l'opérateur splat pour transposer et remplir le vecteur (fonctionnalité similaire à zip_longestPython3)

Le reste du code mappe simplement Nonevers l'espace, ajuste et réassemble la matrice en une seule chaîne à nouveau.

>>> a = 'I am a text.\nTranspose me.\nCan you do it?'
>>> c(a)                                                                            
'ITC\n ra\naan\nmn\n sy\napo\n ou\nts\need\nx o\ntm\n.ei\n .t\n  ?'
>>> len("""c=lambda a:'\n'.join(''.join(y or' 'for y in x).rstrip()for x in map(None,*a.split('\n')))""")
88
# (+2 since `\n` is considered by `len` to be a single char)
Joachim Isaksson
la source
Pas exactement conforme. Ce devrait être une fonction qui prend une chaîne et retourne une chaîne.
Tim Seguine
@Tim Oui, j'ai raté ça. Fixé maintenant, merci.
Joachim Isaksson
+1 vous semblez être l'entrée python conforme la plus courte pour le moment.
Tim Seguine
Belle utilisation de map. Je continue de chercher un endroit pour utiliser ça ... et vous me battez. ;)
stand le
4

Bash + coreutils + sed, 83

eval paste `sed 's/.*/<(fold -w1<<<"&")/'`|expand -t2|sed 's/\(.\) /\1/g;s/ \+$//'

foldet pastefaire le travail important. Le reste n'est que du formatage.

Accepte les entrées de stdin et les sorties vers stdout:

$ < tr.txt ./transposefile.sh
ITC
 ra
aan
mn
 sy
apo
 ou
ts
eed
x o
tm
.ei
 .t
  ?
$ < tr.txt ./transposefile.sh | ./transposefile.sh
I am a text.
Transpose me.?
Can you do it
$ 
Traumatisme numérique
la source
Vous semblez enfreindre la règle "Votre résultat ne doit pas avoir d'espaces de fin sur aucune ligne."
Tim Seguine
@TimSeguine Oups, j'ai raté celui-là. Je viens de le corriger dans la dernière édition.
Digital Trauma
3

C (278 octets)

Edit: Cela enfreint les règles, car il prend un nom de fichier comme argument mais écrit dans stdout. Je vais le modifier plus tard pour écrire dans un fichier, puis imprimer le nom de fichier sur stdout.

Ceci est mon premier golf de code jamais, alors ayez pitié. Un peu de vieux C. Placez l'entrée test.txtet laissez-la fonctionner!

clang transpose.c -o transpose && ./transpose test.txt

#import <stdio.h>
#import <stdlib.h>
#import <string.h>

#define BUFFER_SIZE 1024

#define MAX(A,B) ((A)>(B)?(A):(B))

int main(int argc, char **argv) {
    char line[BUFFER_SIZE];

    FILE *f; int nLines, maxLen;

    f = fopen(argv[1], "r");
    while(!feof(f) && fgets(line, BUFFER_SIZE, f)) {
        nLines++;
        maxLen = MAX(maxLen, strlen(line));
    }
    fclose(f);

    for (int charPos = 0; charPos < maxLen; charPos++) {
        f = fopen(argv[1], "r");
        for (int linePos = 0; linePos < nLines; linePos++) {
            fgets(line, BUFFER_SIZE, f);
            printf("%c", charPos < strlen(line) && line[charPos] != '\xA' ? line[charPos] : ' ');
        }
        printf("\n");
        fclose(f);
    }

    return 0;
}

En utilisant des noms de variables courts, en supprimant le formatage gratuit, en autorisant les fuites de descripteurs de fichiers et en désactivant tous les avertissements, cela est réduit à 278 octets. (Puisqu'il utilise des importations implicites, il peut ne pas se lier correctement sur tous les systèmes. Fonctionne sur ma machine!)

#import <stdio.h>
int main(int C,char**V){char L[1024];int A,B,D,I,J,*F=fopen(V[1],"r");while(!feof(F)&&fgets(L,1024,F)){A++;D=strlen(L);B=B>D?B:D;}for(I=0;I<B;I++){F=fopen(V[1],"r");for(J=0;J<A;J++)fgets(L,1024,F)&&printf("%c",I<strlen(L)&&L[I]!='\n'?L[I]:' ');printf("\n");}}
wjl
la source
Je pense que vous pouvez profiter de l'implicite intpour raccourcir certaines de vos déclarations, ou est-ce illégal maintenant?
Tim Seguine du
Oui, je l'utilise dans une édition ultérieure pour ne pas importer stdlib.h ou string.h. Si je n'importe pas stdio.h, il segfaults lors de l'exécution.
wjl
Pour votre commentaire d'édition sur les règles: votre autre alternative est d'accepter l'entrée de stdin. Je considérerais cela comme conforme également. Et aussi, je ne peux pas dire d'un coup d'œil: est-ce que cela supprime les espaces blancs des extrémités des lignes dans la version transposée?
Tim Seguine du
Puisque j'ai relu le fichier plusieurs fois pour éviter de le stocker dans la RAM, la lecture depuis stdio serait probablement plus difficile. :) Je ne sais pas quel espace doit être supprimé. En ce moment, je ne pense pas que cela fasse du tout de décapage, malheureusement. Je vais aussi devoir y travailler.
wjl
Vous pouvez déclarer en A,B,D,I,J,*Ftant que variables globales, afin d'éviter les intmots-clés. De même, vous pouvez supprimer intde la maindéclaration et de l' Cargument. Dans C, intest facultatif dans de nombreux endroits.
Konrad Borowski
3

AutoHotkey 210

f(i){
StringSplit,o,i,`n
m:=0
loop % o0 {
a:=A_index
if (t:=Strlen(p:=o%a%))>m
m:=t
StringSplit,l%a%,o%a%
}
loop % m {
a:=A_index,n:=""
loop % o0
n.=(j:=l%A_index%%a%)=""?" ":j
s.=Rtrim(n," ") "`n"
}
return s
}

Tester

text=
(
I am a text.
Transpose me.
Can you do it?
)
msgbox % f(text)
Avi
la source
Je ne peux pas tester celui-ci, mais il semble conforme
Tim Seguine
3

Rubis: 88 caractères

(Publié parce qu'il est plus court que les autres solutions Ruby. Non vérifié si mon code introduit quelque chose de nouveau par rapport à ceux-ci. Si vous avez déjà publié une solution Ruby et que vous pensez que c'est principalement une copie de la vôtre, veuillez commenter et je retirerai ma réponse. )

f=->t{l=t.split$/;r=[""]*m=l.map(&:size).max;l.map{|l|m.times{|i|r[i]+=l[i]||" "}};r*$/}

Exemple d'exécution:

irb(main):001:0> f=->t{l=t.split$/;r=[""]*m=l.map(&:size).max;l.map{|l|m.times{|i|r[i]+=l[i]||" "}};r*$/}
=> #<Proc:0x99a9e68@(irb):1 (lambda)>

irb(main):002:0> sample='I am a text.
irb(main):003:0' Transpose me.
irb(main):004:0' Can you do it?'
=> "I am a text.\nTranspose me.\nCan you do it?"

irb(main):005:0> puts f[sample]
ITC
 ra
aan
mn
 sy
apo
 ou
ts
eed
x o
tm
.ei
 .t
  ?
=> nil

irb(main):006:0> puts f[f[sample]]
I am a text.
Transpose me.
Can you do it?
=> nil
homme au travail
la source
+1 Vous avez mieux joué au golf dans tous les cas.
Tim Seguine
3

Bash, 124 octets

D=`mktemp -d`;split -l1 - $D/;for F in $D/*;do grep -o . $F>$F+
done;paste $D/*+|sed -e's/\([^\t]\)\t/\1/g;s/\t/ /g;s/ *$//'

Il lit l'entrée standard et écrit la sortie standard. Essayez-le:

echo $'I am a text.\nTranspose me.\nCan you do it?' | script.sh

Comment ça marche:

  • splitentrée sur des lignes simples (fichiers dans un répertoire temporaire $D)
  • diviser les lignes en caractères uniques à l'aide de grep(fichiers * +)
  • mise en page côte à côte à l'aide de paste(colonnes séparées par des tabulations)
  • retirer les TAB d'alignement, remplacer les TAB de remplissage par des BLANKs, couper à l'aide de sed

Modifier:

  • -9: Suppression du code de rangement ;rm -r $D(merci Tim)
  • -2: utilisez +au lieu de _comme suffixe et raccourcissez ${F}_à$F+
  • -3: supprimer le préfixe Ldes fichiers de résultats fractionnés
memnon
la source
Aux fins du golf de code, vous ne devez pas nécessairement être gentil et nettoyer après vous-même. Vous pouvez laisser de côté le rmnombre de vos personnages.
Tim Seguine
2

Ruby - 144 caractères

Voici ma première tentative, golfée:

def f t
t.split(?\n).each{|l|l<<' 'until l.size==t.split(?\n).map(&:size).max}.map{|x|x.split('')}.transpose.map{|l|l.join.rstrip}.join(?/n)
end

Pour la sortie, exécutez puts f texttextest une chaîne multi-lignes respectant les règles ci-dessus. La version non golfée est ci-dessous:

def text_transpose(text)
  lines = text.split(?\n)
  maxlen = lines.map(&:size).max
  lines.each { |line| line << ' ' until line.size == maxlen }
       .map  { |line| line.split('') }.transpose
       .map  { |char| char.join.rstrip }.join(?\n)
end

Pour une solution similaire, mais finalement meilleure dans Ruby, consultez le code de Wayne Conrad ci-dessus.

OI
la source
Je n'ai pas remarqué le transposedans votre réponse avant d'écrire la mienne. Il ne me semble pas tout à fait casher d'avoir essentiellement réécrit votre réponse, mais un peu mieux. :(
Wayne Conrad
2
Ça ne me dérange pas du tout. Vous avez trouvé votre code indépendamment et ce n'est pas une course. J'ai certainement appris quelque chose de votre solution. Si vous vous étiez retenu parce que je l'avais utilisé transpose, il est possible qu'une meilleure solution Ruby n'aurait pas fait surface. L'une des choses que j'aime le plus dans la programmation est la volonté de collaborer et de polliniser les idées. Jusqu'à ce que nous nous revoyions, gentil monsieur. À votre santé!
OI
2

PHP 194

function x($a){$a.="\n";$s=strlen($a);$i=0;while($c<$s)if($a{$c}!="\n")$b[$i++].=$a{$c++};else{$c++;for(;$i<$s;$i++)$b[$i].=" ";$i=0;}ksort($b);return rtrim(implode("\n",array_map("trim",$b)));}

Non-golfé:

function x($a) {
    $a.="\n";
    $s=strlen($a);
    $i=0;
    while($c<$s)
        if($a{$c}!="\n")
            $b[$i++].=$a{$c++};
        else{
            $c++;
            for(;$i<$s;$i++)
                $b[$i].=" ";$i=0;
        }
    ksort($b);
    return rtrim(implode("\n",array_map("trim",$b)));
}

C'est ma première tentative de golf, alors soyez gentil! De plus, des conseils / suggestions seraient grandement appréciés!

élixénide
la source
C'est plus court que ma tentative de php. Vous pouvez enregistrer deux personnages en supprimant les "s autour "trim". php donnera un avertissement, mais cela fonctionne très bien.
Tim Seguine
Les avertissements @TimSeguine sont affichés à l'écran, n'est-ce pas? Vous devrez utiliser @pour supprimer les avertissements.
ericw31415
@eric Je n'ai pas été actif depuis un certain temps, donc les opinions ont peut-être changé, mais dans le passé, il était jugé acceptable de produire des données non pertinentes en erreur standard.
Tim Seguine
C'est permis? Si c'est vrai, je ne le savais pas.
ericw31415
2

MATHEMATICA 117 caractères

t = "I am a text.\nTranspose me.\nCan you do it?";

f=(m=Length/@(f=Flatten[Characters/@StringSplit[#,"\n"],{{2},{1}}])//Max;
StringJoin@@@(PadLeft[#,m," "]&/@f)//Column)&
Murta
la source
Je ne peux pas tester celui-ci, pouvez-vous donc vérifier qu'il supprime les espaces de test aux extrémités des lignes? De plus, cela n'apparaît pas (à première vue) pour définir une fonction, ce que les règles exigent.
Tim Seguine
salut @Tim, maintenant c'est une fonction f! .. tks
Murta
2

Perl (92 + 1)

lit stdin et écrit sur stdout. ajouter 1 au score desay

@L=map[grep!/\n/,split//],<>;do{$_=join'',map shift@$_||$",@L;s/ +$//;say}while grep@$_>0,@L
perl chinois goth
la source
2

CJam, 32 25 octets

CJam est plus récent que ce défi, donc cette réponse ne peut pas être acceptée.

Considérablement raccourci par user23013.

qN/_z,f{Se]}z{S+e`);e~N}%

Testez-le ici.

qN/                       "Read input, split into lines.";
   _z,                    "Transpose, get length (find maximum line length).";
      f{Se]}              "Pad each line to that length with spaces.";
            z             "Transpose.";
             {         }% "Map this block onto each line in the result.";
              S+          "Add a space to ensure there's at least one.";
                e`        "Run-length encode.";
                  );      "Discard the trailing run of spaces.";
                    e~    "Run-length decode";
                      N   "Push a newline.";
Martin Ender
la source
Eligible ou non, c'est une excellente réponse tardive. Il semble que la partie la plus difficile de cette réponse était de traiter les espaces de fuite.
Tim Seguine
@TimSeguine En effet. Sans opérateur de découpage intégré, cette opération manuelle dans CJam est étonnamment lourde (la suggestion de l'utilisateur23013 l'a déjà considérablement améliorée).
Martin Ender du
2

Javascript, 103

s=>[...s].map((_,i)=>s.split`
`.map(b=>r+=b[q=b[i]||q,i]||' ',r=q='')&&r.replace(/ *$/,q?`
`:q)).join``

Moins golfé

s=>[...s].map(
     // we need 'i' ranging from 0 to the length of the longest input line
     // so we scan all the input string, that is surely longer
     // but we need to check that after some point the output must be empty
     (_, i) => ( 
       r = '', // the current output row, starts empty
       q = '', // flag to check if we are beyond the longest line
       s.split('\n') // split in rows
       .map( 
         b => ( // for each input row in b
           q = b[i] || q, // if there is a char at position i in b, i goes to q
           r += b[i] || ' ' // add to output the char at position i or a fill space
         )
       ),
       q // if q is still '', we are beyond the longest input line 
       ? r.replace(/ *$/,`\n`) // trim leading space and add newline
       : '' // no output 
     )
   ).join('')

Tester

F=
s=>[...s].map((_,i)=>s.split`
`.map(b=>r+=b[q=b[i]||q,i]||' ',r=q='')&&r.replace(/ *$/,q?`
`:q)).join``

function go() {
  var text=I.value
  var output = F(text)
  O.textContent = output
}

go()
#I { width:50%; height:5em }
<textarea id=I>I am a text.
Transpose me.
Can you do it?</textarea><br>
<button onclick='go()'>Transpose</button>
<pre id=O></pre>

edc65
la source
2

Rétine , 40 octets

P`.+
~L0$`.
L,$.%'vs,$.(x$%=),`.+
m` *$

Essayez-le en ligne!

Basé sur ce programme que j'ai créé pour transposer n'importe quelle taille de rectangle, qui utilise la suggestion de Leo pour transposer un rectangle d'une taille connue.

Edit: Golfé plus et n'a plus d'espaces de fin sur les lignes.

mbomb007
la source
2

Perl 5 , 25 octets

Notez que cela utilise des séquences d'échappement ANSI et en tant que tel ne fonctionne pas sur TIO, vous pouvez cependant le voir en action ici .

$"="[1D";$_="[1;$.H@F"

Explication

Ce code modifie d'abord la valeur du séparateur de liste ( $") en un onglet vertical, suivi de la séquence d'échappement ANSI pour «revenir en arrière 1 colonne» ( \x1b[1D), puis nous définissons la variable imprimée implicitement $_comme une chaîne qui commence par la séquence d'échappement ANSI pour 'commencer l'impression à la colonne de la ligne 1 $.(où se $.trouve la ligne de texte actuelle)' ( \x1b1;$.H) et interpole la liste @F(qui est une liste de tous les caractères de cette ligne, remplie par autosplit ( -a) avec un motif de fractionnement vide ( -F)) qui place le contenu de$" entre chaque élément, en déplaçant le curseur verticalement vers le bas au lieu de continuer la sortie après le caractère précédent.

Essayez-le en ligne!

Dom Hastings
la source
1
Oh mon dieu, la pure horreur! J'aime cela!
Tim Seguine
1

C ++ (243 caractères)

Voici une fonction qui prend et renvoie une chaîne.

J'aurais pu raser quelques dizaines de caractères, mais j'ai décidé de le garder en tant que code non stupide (fonctionne rapidement, se lit bien). Peut-être que j'ai décidé de le faire parce que c'est mon premier golf de code ... Je ne suis pas encore assez hardcore :)

string f(string s){stringstream ss(s);vector<string> v;for(size_t i=0;getline(ss,s);++i){if(v.size() < s.size())v.resize(s.size());for(size_t j=0;j<s.size();++j){v[j].resize(i,' ');v[j].push_back(s[j]);}}s="";for(auto& i:v)s+=i+'\n';return s;}

Avec formatage:

string f(string s)
{
    stringstream ss(s);
    vector<string> v;

    for(size_t i = 0; getline(ss, s); ++i)
    {
        if(v.size() < s.size())
            v.resize(s.size());

        for(size_t j = 0; j < s.size(); ++j)
        {
            v[j].resize(i, ' ');
            v[j].push_back(s[j]);
        }
    }

    s = "";
    for(auto& i : v)
        s += i + '\n';

    return s;
}
David
la source
Je suppose que vous utilisez using namespace std;.
Konrad Borowski
@xfix Pas normalement, mais je l'ai fait pour cela
David
1
Si je suis difficile, je dirais que cela using namespace std;devrait être ajouté au nombre de caractères.
Tim Seguine
1

Python 2.7 - 115 caractères :

bon mot:

>>> a
'I am a text.\nTranspose me.\nCan you do it?'

>>> "".join(["".join(i)+'\n' for i in zip(*[x+" "*(len(max(a.splitlines(), key=len))-len(x)) for x in a.splitlines()])])
'ITC\n ra\naan\nmn \n sy\napo\n ou\nts \need\nx o\ntm \n.ei\n .t\n  ?\n'

et dans une impression plus propre:

>>> print "".join(["".join(i)+'\n' for i in zip(*[x+" "*(len(max(a.splitlines(), key=len))-len(x)) for x in a.splitlines()])])
ITC
 ra
aan
mn 
 sy
apo
 ou
ts 
eed
x o
tm 
.ei
 .t
  ?

en 115 caractères:

>>> len(""""".join(["".join(i)+'\n' for i in zip(*[x+" "*(len(max(a.splitlines(), key=len))-len(x)) for x in a.splitlines()])])""")
115
0x90
la source
Vous ne supprimez pas les espaces de fin sur vos lignes comme les règles l'exigent.
Tim Seguine
En outre, il s'agit en fait de 116 octets, \nest considéré lencomme un seul caractère, mais il en est de deux :)
Joachim Isaksson
1
@JoachimIsaksson sur unix en \nest un. Je dis donc que l'un va bien.
Tim Seguine
@Tim len("\n")affichera 1, bien qu'il s'agisse certainement de 2 caractères distincts dans le code source. L'enregistrement de la source dans un fichier lsaffichera 116. Il suffit de dire que ce lenn'est pas la meilleure façon de mesurer la taille du code en raison du traitement des caractères d'échappement avant la mesure :)
Joachim Isaksson
@JoachimIsaksson oh, désolé d'avoir mal compris votre point.
Tim Seguine
1

GolfScript, 51 caractères

n%.{,}%$-1=" "*:y;{y+y,<}%zip{n\+0{;).32=}do}%((;\+

Ceci est une première tentative; Je soupçonne que cela peut être amélioré. La majeure partie du code est de se conformer aux exigences de suppression de l'espace de remplissage et de fin - sans elles, n%zip n*cela suffirait.

Ps. La version suivante à 46 caractères fera le travail pour l'exemple d'entrée donné, mais se bloquera si une colonne d'entrée est entièrement composée d'espaces:

n%.{,}%$-1=" "*:y;{y+y,<}%zip{0{;).32=}do]}%n*

Je suppose que cela suffit pour le disqualifier, même si le défi ne le dit pas explicitement.

Ilmari Karonen
la source
Votre hypothèse est correcte. Il devrait fonctionner sur n'importe quel texte ASCII selon les hypothèses autorisées dans les règles.
Tim Seguine
1

Schéma / Raquette 113

Le texte:

(define t (list 
    (string->list "I am a text.") 
    (string->list "Transpose me.")
    (string->list "Can you do it?")
))

Sans nouvelles lignes et espaces blancs supplémentaires:

(define s(λ(v x)(if(= x 0)'()(cons(list->string(car v))(s(cdr v)(- x 1))))))(s(apply map list t)(length(car t)))

La version conviviale

(define text (list 
    (string->list "I am a text.") 
    (string->list "Transpose me.")
    (string->list "Can you do it?")
))

(define transpose
    (λ(text length)
        (if (= length 0)
            '()
            (cons (list->string (car text)) (transpose (cdr text) (- length 1)))
)))

(transpose (apply map list text) (length (car text)))
tasegula
la source
1

Haskell

import Data.List
main = interact (unlines . transpose . lines)

C'était si court, j'avais besoin d'ajouter un espace blanc ...

randomusername
la source
Je suis presque sûr que vous pouvez supprimer une partie de l'espace blanc ici. Mais sinon, excellente solution.
Konrad Borowski
3
Cela ne fonctionne pas tout à fait sur mon système. C'est un peu difficile à montrer dans un commentaire, mais si vous l'exécutez deux fois, vous obtenez I am a text..? Transpose met Can you do i.
marinus
Oui, je pense que vous ne remplissez pas les lignes pour garder les colonnes intactes comme le fait l'exemple. Théoriquement, le résultat de l'exécution de la fonction deux fois devrait être la chaîne d'origine (avec éventuellement l'ajout ou la suppression de la nouvelle ligne finale.)
Tim Seguine
1

Python 89 103 caractères

def f(a):return'\n'.join([''.join(i).rstrip()for i in zip(*[j+' '*99 for j in a.split('\n')])]).rstrip()

Je me sens sale. 90 104 caractères pour la version industrielle. : ^)

TrevorM
la source
pas une fonction.
Tim Seguine
@Tim My bad, fixed. Quoi qu'il en soit, ma solution est inférieure à celle de Joachim Isaksson. Je me demande s'il existe un moyen court pour résoudre ce problème avec la récursivité.
TrevorM
1

Mathematica, 95 caractères

f=""<>Riffle[Thread@PadRight@Characters@StringSplit[#,"\n"]//.{0->" ",{x___," "..}:>{x}},"\n"]&
alephalpha
la source
1

K, 56

Cela devrait répondre aux spécifications maintenant.

Accepte une chaîne, renvoie une chaîne.

{`/:{$[" "=*|x;|(+/&\" "=|x)_|x;x]}'x@'/:!max@#:'x:`\:x}

.

k)f:{`/:{$[" "=*|x;|(+/&\" "=|x)_|x;x]}'x@'/:!max@#:'x:`\:x}
k)f"I am a text.\nTranspose me.\nCan you do it?"
"ITC\n ra\naan\nmn\n sy\napo\n ou\nts\need\nx o\ntm\n.ei\n .t\n  ?\n"
k)f f"I am a text.\nTranspose me.\nCan you do it?"
"I am a text.\nTranspose me.\nCan you do it?\n"
tmartin
la source
La sortie semble être un tableau de chaînes?
Tim Seguine
@Tim C'est le cas. Si vous voulez une seule chaîne, ajoutez trois caractères. {`/:x@'/:!max@#:'x:`\:x}pour 26.
tmartin
Vous avez également un problème avec les espaces de fin. Et "S'il accepte un nom de fichier, vous retournez le nom du fichier où vous avez enregistré le résultat." Vous devez renvoyer la sortie de la même manière que vous acceptez l'entrée.
Tim Seguine
@Tim devrait être corrigé maintenant. Tue mon bytecount
tmartin
Je soupçonnais que cela pourrait :(, mais une spécification est une spécification.
Tim Seguine
1

Groovy, 98 caractères

{i->o=[].withDefault{''};i.readLines().each{it.toList().eachWithIndex{c,d->o[d]+=c}};o.join('\n')}

en ligne

non golfé:

{i->
o=[].withDefault{''};//create list with empty string as default value 
i.readLines()
.each{
    it.toList() //split every line to characters
    .eachWithIndex{ 
        c,d->o[d]+=c //append to string from list with right index
    }
};
o.join('\n')}//join list with newlines
}
Krzysztof Atłasik
la source
1

J, 28 26 octets

Sauvegardé 2 octets grâce à frownyfrog

t=.,@:(,&LF"1)@|:@:>@cutLF

Prend une chaîne, renvoie une chaîne. Je ne sais pas s'il existe une version plus courte du verbe de la fonction 'cutopen' que je pourrais utiliser.

Il y a aussi le plus court

t=.|:@:>@cutLF

Mais je ne suis pas sûr qu'il relève des directives de l'OP, car il renvoie un tableau de caractères.

Comment ça marche:

                     cutLF   | Splits the input on new lines and boxes them
                    @        | Composes verbs (as does @:, but they're not equal)
                   >         | Unboxes this, forming an array of the lines
                 @:          |
               |:            | Transposes the array
      (      )@              |
       ,&LF                  | Appends a new line...
           "1                | To each row of the array
    @:                       |
   ,                         | Flatten the result
t=.                          | Assign this verb to t

L'autre version fonctionne de la même façon, mais ne convertit pas le tableau transposé en une chaîne correctement formatée.

Exemples:

NB. Define a multi-line string

    text =: 0 : 0
I am a text.
Transpose me.
Can you do it?
)

    t text
ITC
 ra
aan
mn    NB. There's whitespace after the 'n' here, but I assume it doesn't count as trailing since it's part of the original string
 sy
apo
 ou
ts 
eed
x o
tm 
.ei
 .t
  ?

    t t text
I am a text.     NB. Again, whitespace here, but it's part of the argument of the second 't' (added by the first 't' to keep columns straight)
Transpose me. 
Can you do it?
Bolce Bussiere
la source
J'utiliserais cutLF.
FrownyFrog
1
Enregistrer 1 personnage avec0|:>@cutLF
FrownyFrog
1

Lua ,203 189 octets

t={{}}i=1m=0(...):gsub(".",function(c)n=#t[i]if c=="\n"then i=i+1t[i]={}else t[i][n+1]=c end m=m<=n and n+1or m end)
for x=1,m do for p=1,i do io.write(t[p][x]or" ")end _=m<=x or print()end

Essayez-le en ligne!

J'ai vu une autre solution Lua ici, mais je ne pense pas qu'il y ait un problème avec la publication de 2 solutions dans la même langue. S'il y en a, dites-le moi :)

Visckmart
la source
1
Il n'y a rien de mal à plusieurs réponses dans la même langue. Même des réponses identiques sont autorisées dans une certaine mesure (bien qu'il soit encouragé de vérifier au moins si vous publiez une solution similaire)
Jo King
Malheureusement, votre résultat ne doit avoir aucun espace de fin sur aucune ligne .
Jo King
Mais je ne vois pas d'espaces de fuite à la sortie de mon code. Il n'y a pas d'espaces après la fin de la ligne et pas de ligne vierge à la fin.
Visckmart
La partie qui semble attirer les gens est sur n'importe quelle ligne . Par exemple, cela a un espace supplémentaire sur la deuxième ligne
Jo King
Ohhh maintenant je l'ai! Désolé. J'essaierai de le faire fonctionner dès que j'aurai le temps. Je pense que le problème était qu'il n'y a qu'un seul exemple de test et je pensais que ce serait le test de "stress" hahah Mais ok, merci de me le dire :)
Visckmart