Eine Textseite transponieren

28

BEARBEITEN Ich habe den Wortlaut der Regeln geändert, um einige Dinge, die implizit waren, deutlicher zu machen. Ich habe auch einige Akzente gesetzt, um einige offensichtliche Unklarheiten zu beseitigen, und die Option, ein eigenständiges Programm anstelle einer Funktion zu erstellen, explizit definiert.

Das Ziel hier ist es, eine Funktion zu erstellen, die eine Textdatei (oder einen String) aufnimmt und so transponiert, dass Zeilen zu Spalten werden und umgekehrt.

Beispiel:

Ich bin ein text
Transponiere mich.
Kannst du es machen?

Ergebnisse in:

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

Die Regeln:

  • Sie dürfen davon ausgehen, dass nur Leerzeichen verwendet werden " "und "\n"in keiner Zeile ein Leerzeichen nachgestellt ist.
  • Sie können davon ausgehen, dass die Datei ASCII ist. Welchen Endzeilenmarker Sie verwenden möchten, liegt bei Ihnen (CRLF oder LF). Es muss im Beispiel korrekt funktionieren, aber es sollte auch bei jeder Eingabe funktionieren , die die obigen Annahmen erfüllt.
  • Möglicherweise müssen Sie Leerzeichen (wie im Beispiel) einfügen, wenn keine vorhanden sind, damit die Spalten in einer Linie bleiben.
  • Ihr Ergebnis darf in keiner Zeile ein nachgestelltes Leerzeichen enthalten .
  • Das letzte Zeilenumbruchzeichen (für die letzte Zeile) ist optional.
  • Es sollte entweder eine Funktion oder ein vollständiges Programm sein. Wenn Ihre Funktion eine Zeichenfolge akzeptiert, sollte sie die Ergebnisse als Zeichenfolge zurückgeben. Wenn ein Dateiname akzeptiert wird, geben Sie den Namen der Datei zurück, in der Sie das Ergebnis gespeichert haben. Sie dürfen außerdem ein vollständiges Programm schreiben , das Eingaben von STDIN akzeptiert und das richtige Ergebnis an STDOUT ausgibt. wenn Sie dies tun, müssen Sie nicht ausgegeben , etwas zu STDERR.
  • Das kürzeste Verfahren gewinnt, aber ich stimme jeder Antwort zu, die ich mag.

Basierend auf den Regeln ist die Ausgabe im Beispiel entweder 53 oder 52 Byte lang (für LF-Zeilenumbrüche), je nachdem, ob der letzte Zeilenumbruch enthalten ist oder nicht.

Hinweis: Dies ist keine spezielle Anforderung, aber wenn Ihre Funktion beim zweimaligen Ausführen nacheinander nicht mit der ursprünglichen Funktion identisch ist (die letzte Zeile kann abweichen und alle leeren Zeilen am Ende der Datei werden gelöscht), sind Sie es wahrscheinlich gegen eine der Regeln verstoßen.

Tim Seguine
quelle
Ich habe beschlossen, das Verbot von Spracheinbauten aufzuheben.
Tim Seguine
Ich habe bearbeitet, um die Bedingung für nachfolgende Leerzeichen zu klären.
Tim Seguine
Fragen Sie nach einer Funktion? Ist es akzeptabel, eine Zeichenfolge von STDIN zu akzeptieren und die korrekte Ausgabe an STDOUT zu drucken?
Justin
@ Quincunx Ja, ich akzeptiere das als "Funktion". Ich werde die Regeln dahingehend ändern, dass sie in diesem Punkt explizit sind.
Tim Seguine
Die Texttransponierungsfunktion kann nur dann eine Umkehrung sein, wenn Sie das nachfolgende ws zulassen. Beispiel: "a * c \ ndef \ n" -> TT-> "a * \ ncd \ nef \ n" ~ "a \ ncd \ nef \ n" -> TT-> "acd \ nef \ n", wobei * = ws
Emanuel Landeholm

Antworten:

2

Japt , 6 Bytes

y mx1R

Probieren Sie
es zweimal aus - gibt die ursprüngliche Zeichenfolge zurück


Erläuterung

y

Transponieren Sie die Eingabe

m  R

Karte über jede Linie

x1

Nach rechts schneiden

Zottelig
quelle
4

J ( 31 40)

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

Dies ist eine Funktion , die einen String annimmt, und gibt eine Zeichenfolge (dh ein Zeichenvektor mit Zeilenvorschübe an den richtigen Stellen eingesetzt ist , und nicht eine Matrix.)

Bearbeiten: Kein abschließendes Leerzeichen in einer Zeile.

Prüfung:

   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
quelle
Ich hoffe, Sie haben bemerkt, dass ich das Verbot für eingebaute Geräte aufgehoben habe.
Tim Seguine
@Tim: Ja, sonst hätte ich das nicht gepostet.
Marinus
Ist die nachfolgende Whitespace-Regel unklar geschrieben? Sie scheinen mehr Charaktere zu haben, als ich erwartet hatte.
Tim Seguine
Wie viele Zeichen soll ich haben? Die letzten Zeichen in der Zeichenfolge sind ?\n.
marinus
1
@ Tim: Ich konnte es in APL nur auf 44 bringen. Der Hauptgrund dafür ist, dass APL keine cutoder dlbstandardmäßig keine bereitstellt und das Schreiben selbst auch in APL eine Reihe von Zeichen erfordert.
Marinus
4

Rubin 111

Golf gespielt:

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

Ungolfed:

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 verfügt über eine Array-Transponierungsfunktion. Auf diese Weise werden die Zeilen einfach aufgefüllt, in ein Array von Zeichen umgewandelt, die Array-Transponierungsfunktion von Ruby verwendet und das Array von Zeichen wieder in Zeilen umgewandelt.

Beim Golfen wurden lediglich Einzelzeichen-IDs verwendet, Leerzeichen entfernt, eine temporäre Zeile für text.lines verwendet und die Berechnung für max_length inline gestellt (es gibt keine Punkte für die Effizienz).

Wayne Conrad
quelle
Nett. Sie können ein weiteres Zeichen Streifen aus durch den Ersatz "\n"mit ?\n.
OI
Auch das .to_aist überflüssig. Sie können dort weitere 5 Zeichen gewinnen.
OI
@OI Danke, ich schulde dir sechs Charaktere. Ich habe dies bei der Arbeit, die 1.9.3 verwendet, abgebrochen. Das to_a ist in 1.9.3 erforderlich, jedoch nicht in 2.0.
Wayne Conrad
Aha. Gut zu wissen. Betrachten Sie uns auch, um mir einige String-Methoden in Ruby zu zeigen, die ich häufiger verwenden sollte. Prost!
OI
2
Einige der Code-Golf-Herausforderungen haben mein Interesse am Erlernen von Ruby geweckt.
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")}

Anwendungsbeispiel:

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
  ?

Das nachfolgende Leerzeichen wird entfernt.

Sven Hohenstein
quelle
4

Python 2.7 ( 97 79 94 90)

BEARBEITEN: Verpasste die Funktionsanforderung;

Ich bin mir ziemlich sicher, dass dies verbessert wird, da ich hier ein Anfänger bin, aber zunächst einmal;

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

Der Code verwendet eine einfache split, um die Zeichenfolge in einen Vektor von Zeilen aufzuteilen. Anschließend wird mapmit einem Funktionswert wie None(der Einheitsfunktion) und dem Splat-Operator der Vektor transponiert und aufgefüllt (ähnliche Funktionalität wie zip_longestin Python3).

Der Rest des Codes ist nur Nonedem Leerzeichen zugeordnet, schneidet die Matrix ab und setzt sie wieder zu einer einzelnen Zeichenfolge zusammen.

>>> 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
quelle
Nicht genau konform. Es sollte eine Funktion sein, die einen String nimmt und einen String zurückgibt.
Tim Seguine
@ Tim Ja, das habe ich verpasst. Jetzt behoben, danke.
Joachim Isaksson
+1 Sie scheinen momentan der kürzeste kompatible Python-Eintrag zu sein.
Tim Seguine
Gute Verwendung von map. Ich bin immer auf der Suche nach einem Ort, an dem ich das nutzen kann ... und du hast mich einfach geschlagen. ;)
Stand
4

Bash + Coreutils + Sed, 83

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

foldund pasteerledige die wichtige Arbeit. Der Rest ist nur die Formatierung.

Akzeptiert Eingaben von stdin und Ausgaben von 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
$ 
Digitales Trauma
quelle
Sie verstoßen anscheinend gegen die Regel "Ihr Ergebnis darf in keiner Zeile ein nachgestelltes Leerzeichen enthalten."
Tim Seguine
@TimSeguine Ups, das habe ich verpasst. Ich habe es gerade in der letzten Bearbeitung behoben.
Digital Trauma
3

C (278 Bytes)

Bearbeiten: Dies verstößt gegen die Regeln, da ein Dateiname als Argument verwendet wird, aber in stdout geschrieben wird. Ich bearbeite es später, um in eine Datei zu schreiben und dann den Dateinamen auf stdout zu drucken.

Dies ist mein erster Code Golf überhaupt, also erbarme dich. Irgendein schlichtes altes C. Gib die Eingabe ein test.txtund lass sie laufen!

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;
}

Durch die Verwendung kurzer Variablennamen, das Entfernen unbegründeter Formatierungen, das Zulassen von Leckstellen bei Dateihandles und das Deaktivieren aller Warnungen wird dies auf 278 Byte reduziert. (Da implizite Importe verwendet werden, ist die Verknüpfung möglicherweise nicht auf allen Systemen ordnungsgemäß. Funktioniert auf meinem Computer!)

#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
quelle
Ich denke, Sie können implizite Vorteile nutzen int, um einige Ihrer Erklärungen zu verkürzen, oder ist das jetzt illegal?
Tim Seguine
Ja, ich benutze das in einer späteren Bearbeitung, um stdlib.h oder string.h nicht zu importieren. Wenn ich stdio.h nicht importiere, läuft es standardmäßig.
WJL
Um Ihre Kommentare zu den Regeln zu bearbeiten: Ihre andere Alternative besteht darin, Eingaben von stdin zu akzeptieren. Ich würde das auch als konform ansehen. Und ich kann es auch nicht mit einem flüchtigen Blick sagen: Entfernt es in der transponierten Version Leerzeichen von den Zeilenenden?
Tim Seguine
Da ich die Datei mehrmals neu gelesen habe, um ein Speichern im RAM zu vermeiden, wäre das Lesen von stdio wahrscheinlich schwieriger. :) Ich bin mir nicht sicher, welches Leerzeichen entfernt werden soll. Im Moment denke ich, dass es leider überhaupt kein Strippen macht. Daran muss ich auch arbeiten.
WJL
Sie können A,B,D,I,J,*Fals globale Variablen deklarieren , um intSchlüsselwörter zu vermeiden . Ebenso können Sie intaus mainDeklaration und CArgument entfernen . In C, intist an vielen Stellen optional.
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
}

Prüfung

text=
(
I am a text.
Transpose me.
Can you do it?
)
msgbox % f(text)
Avi
quelle
Ich kann dieses nicht testen, aber es sieht konform aus
Tim Seguine
3

Ruby: 88 Zeichen

(Wird veröffentlicht, weil es kürzer ist als die anderen Ruby-Lösungen. Wird nicht überprüft, ob mein Code im Vergleich zu diesen neue Funktionen bietet. Wenn Sie bereits eine Ruby-Lösung veröffentlicht haben und der Meinung sind, dass dies hauptsächlich eine Kopie von Ihnen ist, kommentieren Sie dies bitte und ich werde meine Antwort zurückziehen. )

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

Probelauf:

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
Mann bei der Arbeit
quelle
+1 Sie haben es auf jeden Fall besser gespielt.
Tim Seguine
3

Bash, 124 Bytes

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/ *$//'

Es liest die Standardeingabe und schreibt die Standardausgabe. Versuch es:

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

Wie es funktioniert:

  • split Eingabe in einzelne Zeilen (Dateien im temporären Verzeichnis $D )
  • Zeilen in einzelne Zeichen aufteilen mit grep (Dateien * +)
  • Layout-Zeichen nebeneinander mit paste (durch Tabulatoren getrennten Spalten)
  • Ausrichtungs-TABs entfernen, Füll-TABs durch BLANKs ersetzen und mit zuschneiden sed

Bearbeiten:

  • -9: Aufräumcode entfernt ;rm -r $D (danke Tim)
  • -2: +statt _als Suffix verwenden und kürzen${F}_ zu$F+
  • -3: Präfix Laus geteilten Ergebnisdateien entfernen
memnon
quelle
Für Code-Golf muss man nicht unbedingt nett sein und aufräumen. Sie können das rmBit von Ihrer Zeichenanzahl weglassen.
Tim Seguine
2

Ruby - 144 Zeichen

Hier ist mein erster Versuch, Golf zu spielen:

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

Führen Sie für die Ausgabe aus, puts f textwo textsich eine mehrzeilige Zeichenfolge befindet, die den obigen Regeln entspricht. Die ungolfed Version ist unten:

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

Eine ähnliche, aber letztendlich bessere Lösung in Ruby finden Sie im obigen Code von Wayne Conrad.

OI
quelle
Ich habe das transposein deiner Antwort nicht bemerkt , bevor ich meine geschrieben habe. Es scheint mir nicht ganz koscher zu sein, Ihre Antwort grundlegend umgeschrieben zu haben, nur ein bisschen besser. :(
Wayne Conrad
2
Ich habe überhaupt nichts dagegen. Sie haben Ihren Code unabhängig erfunden und es ist kein Rennen. Ich habe definitiv etwas aus Ihrer Lösung gelernt. Hätten Sie sich zurückgehalten, weil ich verwendet habe transpose, wäre möglicherweise keine bessere Ruby-Lösung aufgetaucht. Eines der Dinge, die ich an der Programmierung am meisten liebe, ist die Bereitschaft zur Zusammenarbeit und zur gegenseitigen Abstimmung von Ideen. Bis wir uns wiedersehen, mein Herr. Prost!
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)));}

Nicht golfen:

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)));
}

Dies ist mein erster Golfversuch, seien Sie also bitte nett! Auch Tipps / Vorschläge wären sehr dankbar!

Elixenid
quelle
Es ist kürzer als mein PHP-Versuch. Sie können zwei Zeichen speichern, indem Sie die herumliegenden "s entfernen "trim". PHP wird eine Warnung geben, aber es funktioniert gut.
Tim Seguine
@TimSeguine Warnungen werden auf dem Bildschirm ausgegeben, aber richtig? Sie müssen verwenden @, um Warnungen zu unterdrücken.
ericw31415
@eric Ich war eine Weile nicht aktiv, daher haben sich die Meinungen möglicherweise geändert, aber in der Vergangenheit wurde es als akzeptabel erachtet, irrelevante Daten als Standardfehler auszugeben.
Tim Seguine
Es ist erlaubt? Wenn das stimmt, dann wusste ich das nicht.
ericw31415
2

MATHEMATICA 117 Zeichen

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
quelle
Ich kann diesen nicht testen. Können Sie also überprüfen, ob er tralige Leerzeichen an den Zeilenenden entfernt? Auch dies scheint (auf den ersten Blick) keine Funktion zu definieren, die die Regeln erfordern.
Tim Seguine
hi @ Tim, jetzt ist es eine Funktion f! .. tks
Murta
2

Perl (92 + 1)

liest stdin und schreibt an stdout. Hinzufügen von 1 zur Punktzahl fürsay

@L=map[grep!/\n/,split//],<>;do{$_=join'',map shift@$_||$",@L;s/ +$//;say}while grep@$_>0,@L
chinesischer Perl Goth
quelle
2

CJam, 32 25 Bytes

CJam ist neuer als diese Herausforderung, daher kann diese Antwort nicht akzeptiert werden.

Deutlich verkürzt durch user23013.

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

Teste es hier.

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
quelle
Zulässig oder nicht, es ist eine sehr späte Antwort. Der schwierigste Teil für diese Antwort schien der Umgang mit den nachgestellten Leerzeichen zu sein.
Tim Seguine
@ TimSeguine In der Tat. Ohne einen eingebauten Trimmoperator ist es überraschend umständlich, dies manuell in CJam zu tun (der Vorschlag von user23013 hat dies bereits erheblich verbessert).
Martin Ender
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``

Weniger golfen

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('')

Prüfung

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
quelle
2

Perl 5 , 25 Bytes

Beachten Sie, dass dies ANSI-Escape-Sequenzen verwendet und daher auf TIO nicht funktioniert. Sie können es jedoch hier in Aktion sehen .

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

Erläuterung

Dieser Code ändert zuerst den Wert von list separator ( $") in einen vertikalen Tabulator, gefolgt von der ANSI-Escape-Sequenz für '1 Spalte zurückgehen' ( \x1b[1D). Anschließend setzen wir die implizit gedruckte Variable $_auf eine Zeichenfolge, die mit der ANSI-Escape-Sequenz beginnt für 'Drucken in Zeile 1 Spalte beginnen $.(wo $.ist die aktuelle Textzeile)' ( \x1b1;$.H) und interpoliert die Liste @F(die eine Liste aller Zeichen in dieser Zeile ist, die mit Autosplit ( -a) mit einem leeren Aufteilungsmuster ( -F) gefüllt ist ) was setzt den Inhalt von$" zwischen die einzelnen Elemente eingefügt, wobei der Cursor vertikal nach unten bewegt wird, anstatt die Ausgabe nach dem vorherigen Zeichen fortzusetzen.

Probieren Sie es online!

Dom Hastings
quelle
1
Oh mein Gott, das pure Grauen! Ich liebe es!
Tim Seguine
1

C ++ (243 Zeichen)

Hier ist eine Funktion, die eine Zeichenfolge akzeptiert und zurückgibt.

Ich hätte ein paar Dutzend Zeichen rasieren können, aber ich habe beschlossen, es als nicht-dummen Code zu behalten (läuft schnell, liest sich in Ordnung). Vielleicht habe ich mich nur dafür entschieden, weil dies mein erster Code Golf ist ... ich bin noch nicht hardcore genug :)

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;}

Mit Formatierung:

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
quelle
Ich nehme an, Sie verwenden using namespace std;.
Konrad Borowski
@ xfix Normalerweise nicht, aber ich habe es getan
David
1
Wenn ich wählerisch bin, würde ich sagen, using namespace std;sollte die Anzahl der Zeichen hinzugefügt werden.
Tim Seguine
1

Python 2.7 - 115 Zeichen :

Einzeiler:

>>> 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'

und in einem saubereren Druck:

>>> 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
  ?

in 115 Zeichen:

>>> 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
quelle
Sie entfernen nicht das nachgestellte Leerzeichen in Ihren Zeilen, wie es die Regeln erfordern.
Tim Seguine
Außerdem sind es tatsächlich 116 Bytes, \ndie als leneinzelnes Zeichen betrachtet werden, aber es sind zwei :)
Joachim Isaksson
1
@JoachimIsaksson unter Unix \nist einer. Also ich sage eins ist in Ordnung.
Tim Seguine
@Tim len("\n")zeigt 1 an, obwohl es sich im Quellcode sicherlich um 2 separate Zeichen handelt. Das Speichern der Quelle in einer Datei führt zur lsAnzeige 116. Nur zu sagen, dass dies lennicht der beste Weg ist, die Codegröße zu messen, da Escape-Zeichen vor dem Messen verarbeitet werden :)
Joachim Isaksson,
@JoachimIsaksson oh, sorry, ich habe deinen Standpunkt falsch verstanden.
Tim Seguine
1

GolfScript, 51 Zeichen

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

Dies ist ein erster Versuch; Ich vermute, es kann verbessert werden. Der größte Teil des Codes besteht darin, die Anforderungen für die Entfernung von Auffüll- und Leerzeichen zu erfüllen - ohne sie n%zip n*würde es nur ausreichen.

Ps. Folgende 46- stellige Version erledigt die Aufgabe für die angegebene Beispieleingabe, stürzt jedoch ab, wenn eine Eingabespalte vollständig aus Leerzeichen besteht:

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

Ich gehe davon aus, dass dies ausreicht, um das Spiel zu disqualifizieren, auch wenn die Herausforderung dies nicht ausdrücklich angibt.

Ilmari Karonen
quelle
Ihre Annahme ist richtig. Es sollte mit jedem ASCII-Text unter den in den Regeln zulässigen Voraussetzungen funktionieren.
Tim Seguine
1

Schema / Schläger 113

Der Text:

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

Ohne neue Zeilen und zusätzliche Leerzeichen:

(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)))

Die benutzerfreundliche Version

(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
quelle
1

Haskell

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

Es war so kurz, ich musste in Leerzeichen hinzufügen ...

zufälliger Benutzername
quelle
Ich bin mir fast sicher, dass Sie hier etwas Leerzeichen entfernen können. Aber sonst tolle Lösung.
Konrad Borowski
3
Das funktioniert auf meinem System nicht ganz. Es ist ein bisschen schwer in einem Kommentar zu zeigen, aber wenn Sie es zweimal ausführen, erhalten Sie I am a text..? Transpose met Can you do i.
Marinus
Ja, ich denke, Sie füllen die Zeilen nicht auf, um die Spalten intakt zu halten, wie im Beispiel. Theoretisch sollte das Ergebnis der zweimaligen Ausführung der Funktion die ursprüngliche Zeichenfolge sein (möglicherweise mit dem Hinzufügen oder Entfernen der letzten neuen Zeile.)
Tim Seguine
1

Python 89 103 Zeichen

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

Ich fühle mich dreckig. 90 104 Zeichen für Industriestärkenversion. : ^)

TrevorM
quelle
keine Funktion.
Tim Seguine
@ Tim Mein schlechtes, behoben. Auf jeden Fall ist meine Lösung Joachim Isaksson unterlegen. Ich frage mich, ob es einen kurzen Weg gibt, um dieses Problem mit Rekursion zu lösen.
TrevorM
1

Mathematica, 95 Zeichen

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

K, 56

Dies sollte die Spezifikation jetzt erfüllen.

Akzeptiert eine Zeichenfolge und gibt eine Zeichenfolge zurück.

{`/:{$[" "=*|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
quelle
Die Ausgabe scheint ein Array von Zeichenfolgen zu sein?
Tim Seguine
@ Tim Es ist. Wenn Sie eine einzelne Zeichenfolge möchten, fügen Sie drei Zeichen hinzu. {`/:x@'/:!max@#:'x:`\:x}für 26.
tmartin
Sie haben auch ein Problem mit nachgestellten Leerzeichen. Und "Wenn ein Dateiname akzeptiert wird, geben Sie den Namen der Datei zurück, in der Sie das Ergebnis gespeichert haben." Sie müssen die Ausgabe auf die gleiche Weise zurückgeben, wie Sie die Eingabe akzeptieren.
Tim Seguine
@Tim sollte jetzt behoben sein. Tötet meinen bytecount
tmartin
Ich vermutete, es könnte :(, aber eine Spezifikation ist eine Spezifikation.
Tim Seguine
1

Groovig, 98 Zeichen

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

online

ungolfed:

{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
quelle
1

J 28 26 Bytes

2 Bytes dank frownyfrog gespeichert

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

Nimmt einen String, gibt einen String zurück. Ich bin nicht sicher , ob es eine kürzere Version der ‚cutopen‘ Funktion Verb , dass ich verwenden könnte.

Es gibt auch die kürzeren

t=.|:@:>@cutLF

Ich bin mir jedoch nicht sicher, ob es unter die Richtlinien des OP fällt, da es eine Reihe von Zeichen zurückgibt.

Wie es funktioniert:

                     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

Die andere Version funktioniert genauso, konvertiert das transponierte Array jedoch nicht in eine korrekt formatierte Zeichenfolge.

Beispiele:

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
quelle
Ich würde verwenden cutLF.
FrownyFrog
1
Speichern Sie 1 Zeichen mit0|:>@cutLF
FrownyFrog
1

Lua ,203 189 Bytes

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

Probieren Sie es online!

Ich habe hier eine andere Lua-Lösung gesehen, aber ich glaube nicht, dass es ein Problem gibt, zwei Lösungen in derselben Sprache zu veröffentlichen. Wenn ja, sag es mir :)

Visckmart
quelle
1
An mehreren Antworten in derselben Sprache ist nichts auszusetzen. Bis zu einem gewissen Grad sind sogar identische Antworten zulässig (es wird jedoch empfohlen, zumindest zu prüfen, ob Sie eine ähnliche Lösung veröffentlichen).
Jo King
Leider darf Ihr Ergebnis in keiner Zeile ein abschließendes Leerzeichen enthalten .
Jo King
In der Ausgabe meines Codes werden jedoch keine nachgestellten Leerzeichen angezeigt. Es gibt keine Leerzeichen nach dem Zeilenende und keine Leerzeichen am Ende.
Visckmart
Der Teil, der die Leute aufzufangen scheint, ist in jeder Zeile . zB Dies hat zusätzliche Leerzeichen in der zweiten Zeile
Jo King
Ohhh jetzt habe ich es verstanden! Es tut uns leid. Ich werde versuchen, es zum Laufen zu bringen, sobald ich Zeit habe. Ich denke, das Problem war, dass es nur einen Beispieltest gibt und ich dachte, das wäre der "Stresstest". Hahah Aber ok, danke, dass du es mir erzählt hast :)
Visckmart