Alihkan satu halaman teks


28

EDIT Saya memodifikasi kata-kata aturan untuk membuat beberapa hal yang implisit lebih eksplisit. Saya juga menambahkan beberapa penekanan untuk menjernihkan beberapa poin kebingungan yang tampak, dan secara eksplisit menentukan opsi untuk membuat program mandiri alih-alih fungsi.

Tujuannya di sini adalah untuk membuat suatu fungsi yang mengambil file teks (atau string) dan memindahkannya sehingga garis menjadi kolom dan sebaliknya.

Contoh:

Saya seorang teks.
Ubah posisi saya.
Bisakah kamu melakukannya?

Hasil dalam:

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

Aturan:

  • Anda boleh berasumsi bahwa satu-satunya karakter spasi putih yang digunakan adalah " "dan "\n"dan tidak ada spasi spasi tambahan pada baris apa pun.
  • Anda dapat berasumsi bahwa file tersebut adalah ASCII. Penanda garis akhir mana yang ingin Anda gunakan terserah Anda (CRLF atau LF). Ini harus bekerja dengan benar pada contoh, tetapi juga harus bekerja pada setiap masukan yang memenuhi asumsi di atas.
  • Anda mungkin harus memasukkan spasi (seperti pada contoh) di mana tidak ada untuk menjaga kolom tetap di garis.
  • Hasil Anda tidak boleh memiliki spasi spasi di garis mana pun .
  • Karakter baris baru terakhir (untuk baris terakhir) adalah opsional.
  • Ini harus berupa fungsi atau program yang lengkap. Jika fungsi Anda menerima string, maka itu harus mengembalikan hasilnya sebagai string. Jika menerima nama file, maka Anda mengembalikan nama file tempat Anda menyimpan hasilnya. Anda juga diperbolehkan untuk menulis program lengkap yang menerima input dari STDIN dan mengeluarkan hasil yang benar ke STDOUT; jika Anda melakukan ini, Anda tidak boleh mengeluarkan apa pun ke STDERR.
  • Prosedur terpendek menang, tetapi saya akan membatalkan jawaban yang saya suka.

Berdasarkan aturan, output pada contoh adalah panjang 53 atau 52 byte (untuk LF baris baru) tergantung pada apakah baris baru akhir disertakan atau tidak.

Catatan: Ini bukan persyaratan khusus, tetapi jika fungsi Anda, ketika dijalankan dua kali berturut-turut tidak identik dengan aslinya (baris baru terakhir mungkin berbeda, dan setiap baris kosong di akhir file akan dihapus), maka Anda mungkin melanggar salah satu aturan.


Saya memutuskan untuk menghapus larangan bahasa bawaan.
Tim Seguine

Saya mengedit untuk mengklarifikasi kondisi spasi tambahan.
Tim Seguine

Apakah Anda meminta fungsi? Apakah dapat diterima untuk menerima string dari STDIN dan mencetak output yang benar ke STDOUT?
Justin

@ Quincunx Ya, saya menerima itu sebagai "fungsi". Saya akan mengubah aturan menjadi eksplisit pada titik itu.
Tim Seguine

Fungsi teks transpos tidak dapat menjadi involusi kecuali jika Anda mengizinkan untuk mengekstruksikan. Contoh: "a * c \ ndef \ n" -> TT-> "a * \ ncd \ nef \ n" ~ "a \ ncd \ nef \ n" -> TT-> "acd \ nef \ n", di mana * = ws
Emanuel Landeholm

Jawaban:



4

J ( 31 40)

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

Ini adalah fungsi yang mengambil string, dan mengembalikan string (yaitu vektor karakter dengan linefeeds dimasukkan di tempat yang tepat, dan bukan matriks.)

Sunting: tidak ada spasi spasi di garis mana pun.

Uji:

   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
  ?

Saya harap Anda memperhatikan bahwa saya menghapus larangan untuk built-in.
Tim Seguine

@ Tim: Ya, kalau tidak, saya tidak akan memposting ini.
marinus

Apakah aturan spasi spasi tambahan ditulis dengan tidak jelas? Anda tampaknya memiliki lebih banyak karakter daripada yang saya harapkan.
Tim Seguine

Berapa banyak karakter yang harus saya miliki? Karakter terakhir pada string adalah ?\n.
marinus

1
@Tim: Saya hanya bisa mencapai 44 di APL. Alasan utama adalah bahwa APL tidak menyediakan salah satu cutatau dlbsecara default dan menulis sendiri membutuhkan banyak karakter bahkan dalam 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

Tidak Terkumpul:

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 memiliki fungsi susunan transpose, jadi ini hanya melapisi garis keluar, mengubahnya menjadi susunan karakter, menggunakan fungsi susunan # Arahan Ruby, lalu mengubah susunan karakter kembali menjadi garis.

Golf itu hanya menggunakan pengidentifikasi satu karakter, menghapus spasi, menggunakan sementara untuk text.lines, dan menempatkan perhitungan untuk inline max_length (tidak ada poin untuk efisiensi).


Bagus. Anda dapat menghapus satu karakter lagi dengan menggantinya "\n"dengan ?\n.
OI

Juga, .to_aitu berlebihan. Anda dapat memperoleh 5 karakter lainnya di sana.
OI

@ OI Terima kasih, saya berutang enam karakter. Saya berlari ini di tempat kerja, yang menggunakan 1.9.3. To_a diperlukan di 1.9.3, tetapi tidak di 2.0.
Wayne Conrad

Saya melihat. Senang mendengarnya. Pertimbangkan kami bahkan untuk menunjukkan kepada saya beberapa metode String di Ruby yang seharusnya saya gunakan lebih sering. Tepuk tangan!
OI

2
Beberapa tantangan kode golf telah memperbarui minat saya dalam belajar ruby.
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")}

Contoh penggunaan:

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
  ?

Ruang kosong trailing dihapus.


4

Python 2.7 ( 97 79 94 90)

EDIT: Kehilangan persyaratan fungsi;

Saya cukup yakin ini akan ditingkatkan sejak saya semacam pemula di sini, tetapi untuk memulai dengan;

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

Kode menggunakan sederhana splituntuk membagi string menjadi vektor baris. Ini kemudian menggunakan mapdengan nilai fungsi sebagai None(fungsi kesatuan) dan operator percikan untuk mengubah dan pad vektor (fungsi yang mirip dengan zip_longestdi Python3)

Sisa kode hanya memetakan Noneruang, memotong dan menyusun kembali matriks ke string tunggal lagi.

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

Tidak sepenuhnya patuh. Seharusnya fungsi take mengambil string dan mengembalikan string.
Tim Seguine

@Tim Ya, melewatkan itu. Tetap sekarang, terima kasih.
Joachim Isaksson

+1 Anda tampaknya entri python terpendek dan terpendek saat ini.
Tim Seguine

Penggunaan yang bagus map. Saya terus mencari tempat untuk menggunakan itu ... dan Anda baru saja mengalahkan saya untuk itu. ;)
boothby

4

Bash + coreutils + sed, 83

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

folddan pastemelakukan pekerjaan penting. Sisanya hanya memformat.

Menerima input dari stdin dan output ke 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
$ 

Anda tampaknya melanggar aturan, "Hasil Anda tidak boleh tertinggal spasi di baris mana pun."
Tim Seguine

@TimSeguine Ups Saya melewatkan yang itu. Saya baru saja memperbaikinya di edit terbaru.
Digital Trauma

3

C (278 byte)

Sunting: Ini benar-benar melanggar aturan, karena mengambil nama file sebagai argumen tetapi menulis ke stdout. Saya akan mengeditnya nanti untuk menulis ke file dan kemudian mencetak nama file ke stdout.

Ini adalah golf kode pertama saya, jadi ampun. Beberapa C. Lama, masukkan input test.txtdan biarkan berjalan!

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

Dengan menggunakan nama variabel pendek, menghapus pemformatan gratis, dan memungkinkan file menangani bocor, dan menonaktifkan semua peringatan ini dikurangi menjadi 278 byte. (Karena ini menggunakan impor implisit, mungkin tidak terhubung dengan benar pada semua sistem. Bekerja pada mesin saya!)

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

Saya pikir Anda dapat mengambil keuntungan dari implisit intuntuk mempersingkat beberapa deklarasi Anda, atau apakah itu ilegal sekarang?
Tim Seguine

Ya, saya menggunakan itu di edit nanti untuk tidak mengimpor stdlib.h atau string.h. Jika saya tidak mengimpor stdio.h, segfaults sedang dijalankan.
wjl

Untuk komentar edit Anda tentang aturan: alternatif Anda yang lain adalah menerima input dari stdin. Saya akan mempertimbangkan penyesuaian itu juga. Dan juga, saya tidak tahu dari pandangan sepintas: apakah itu menghapus spasi dari ujung garis dalam versi transpos?
Tim Seguine

Karena saya membaca ulang file beberapa kali untuk menghindari penyimpanan dalam RAM, membaca dari stdio mungkin akan lebih sulit. :) Saya tidak yakin spasi apa yang harus dilucuti. Sayangnya, saat ini saya rasa tidak ada stripping sama sekali. Saya harus mengerjakannya juga.
wjl

Anda dapat mendeklarasikan A,B,D,I,J,*Fsebagai variabel global, untuk menghindari intkata kunci. Demikian pula, Anda dapat menghapus intdari maindeklarasi, dan Cargumen. In C, intopsional di banyak tempat.
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
}

Uji

text=
(
I am a text.
Transpose me.
Can you do it?
)
msgbox % f(text)

Saya tidak bisa menguji yang ini, tapi kelihatannya sesuai
Tim Seguine

3

Ruby: 88 karakter

(Diposting karena lebih pendek daripada solusi Ruby lainnya. Tidak memeriksa apakah kode saya memperkenalkan sesuatu yang baru dibandingkan dengan itu. Jika Anda sudah memposting solusi Ruby dan Anda merasa ini sebagian besar merupakan salinan Anda, silakan komentar dan saya akan membatalkan jawaban saya. )

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

Contoh dijalankan:

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

+1 Anda bermain golf lebih baik dalam hal apa pun.
Tim Seguine

3

Bash, 124 byte

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

Bunyinya input standar dan tulis output standar. Cobalah:

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

Bagaimana itu bekerja:

  • splitmasukan ke dalam satu baris (file dalam direktori sementara $D)
  • pisahkan garis menjadi karakter tunggal menggunakan grep(file * +)
  • tata letak karakter berdampingan menggunakan paste(kolom yang dipisahkan TAB)
  • menghapus TAB penyelarasan, ganti TAB pengisi dengan BLANKs, trim menggunakan sed

Edit:

  • -9: Menghapus kode rapi ;rm -r $D(terima kasih Tim)
  • -2: gunakan +alih-alih _sebagai suffix dan disingkat ${F}_menjadi$F+
  • -3: menghapus awalan Ldari file hasil split

Untuk keperluan golf kode, Anda tidak harus bersikap baik dan bersih setelah diri sendiri. Anda dapat meninggalkan rmbit dari jumlah karakter Anda.
Tim Seguine

2

Ruby - 144 karakter

Inilah upaya pertama saya, bermain golf:

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

Untuk output, jalankan di puts f textmana textstring multi-line mematuhi aturan di atas. Versi ungolfed di bawah:

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

Untuk solusi yang serupa, tetapi pada akhirnya lebih baik di Ruby, lihat kode Wayne Conrad di atas.


Saya tidak memperhatikan transposejawaban Anda sebelum saya menulis jawaban saya. Rasanya tidak terlalu halal bagi saya untuk menulis ulang jawaban Anda, hanya sedikit lebih baik. :(
Wayne Conrad

2
Saya tidak keberatan sama sekali. Anda datang dengan kode Anda secara independen dan itu bukan perlombaan. Saya pasti belajar sesuatu dari solusi Anda. Jika Anda menahan diri karena saya menggunakan transpose, mungkin solusi Ruby yang lebih baik tidak akan muncul. Salah satu hal yang paling saya sukai tentang pemrograman adalah kemauan untuk berkolaborasi dan menyerbu ide-ide. Sampai kita bertemu lagi, Tuan yang baik hati. Tepuk tangan!
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)));
}

Ini adalah upaya golf pertama saya, jadi harap baik hati! Juga, tips / saran akan sangat dihargai!


Ini lebih pendek dari upaya php saya. Anda dapat menyimpan dua karakter dengan menghilangkan "sekitar "trim". php akan memberikan peringatan, tetapi berfungsi dengan baik.
Tim Seguine

@TimSeguine Peringatan akan ditampilkan di layar kan? Anda harus menggunakan @untuk menekan peringatan.
ericw31415

@ eric Saya belum aktif dalam beberapa saat sehingga pendapat mungkin telah berubah, tetapi di masa lalu dianggap dapat diterima untuk mengeluarkan data yang tidak relevan ke kesalahan standar.
Tim Seguine

Diizinkan? Jika itu benar, maka saya tidak tahu itu.
ericw31415

2

MATHEMATICA 117 chars

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

Saya tidak dapat menguji yang ini, jadi dapatkah Anda memverifikasi bahwa menghapus spasi putih di ujung garis? Juga ini tidak muncul (pada pandangan pertama) untuk mendefinisikan suatu fungsi, yang memerlukan aturan.
Tim Seguine

hai @Tim, sekarang ini adalah fungsi f! .. tks
Murta

2

Perl (92 + 1)

membaca stdin dan menulis ke stdout. menambahkan 1 pada skor untuksay

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

2

CJam, 32 25 byte

CJam lebih baru dari tantangan ini, jadi jawaban ini tidak memenuhi syarat untuk diterima.

Sangat disingkat oleh user23013.

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

Uji di sini.

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.";

Layak atau tidak, itu adalah jawaban yang sangat terlambat. Sepertinya bagian tersulit untuk jawaban ini adalah berurusan dengan spasi tambahan.
Tim Seguine

@TimSeguine Memang. Tanpa operator pemangkasan bawaan, melakukan hal ini secara manual di CJam ternyata sangat merepotkan (saran user23013 telah meningkatkannya secara signifikan).
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``

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

Uji

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>


2

Retina , 40 byte

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

Cobalah online!

Berdasarkan program ini yang saya buat untuk mengubah ukuran persegi panjang, yang menggunakan saran Leo untuk mentransposisi persegi panjang dengan ukuran yang diketahui.

Sunting: Golf lebih banyak dan tidak lagi memiliki spasi tambahan pada garis.


2

Perl 5 , 25 byte

Perhatikan bahwa ini menggunakan urutan pelarian ANSI dan karena itu tidak berfungsi pada TIO, namun Anda dapat melihatnya beraksi di sini .

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

Penjelasan

Kode ini pertama-tama mengubah nilai pemisah daftar ( $") menjadi tab vertikal, diikuti oleh urutan pelarian ANSI untuk 'mundur 1 kolom' ( \x1b[1D), kemudian kami menetapkan variabel yang dicetak secara implisit $_menjadi string yang dimulai dengan urutan keluar ANSI untuk 'mulai mencetak pada kolom baris 1 $.(di mana $.baris teks saat ini)' ( \x1b1;$.H) dan menginterpolasi daftar @F(yang merupakan daftar semua karakter pada baris itu, diisi oleh autosplit ( -a) dengan pola split kosong ( -F)) yang menempatkan konten $"di antara setiap item, memindahkan kursor secara vertikal ke bawah alih-alih melanjutkan output setelah karakter sebelumnya.

Cobalah online!


1
Ya Tuhan, kengerian belaka! Aku menyukainya!
Tim Seguine

1

C ++ (243 karakter)

Inilah fungsi yang mengambil dan mengembalikan string.

Saya bisa mencukur beberapa lusin karakter, tetapi memutuskan untuk menyimpannya sebagai kode yang tidak bodoh (berjalan cepat, berbunyi oke). Mungkin saya hanya memutuskan untuk melakukan itu karena ini adalah golf kode pertama saya ... Saya belum cukup 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;}

Dengan pemformatan:

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

Saya menganggap Anda menggunakan using namespace std;.
Konrad Borowski

@ Memperbaiki Tidak normal, tapi saya lakukan untuk ini
David

1
Jika saya pilih-pilih, saya akan mengatakan using namespace std;harus ditambahkan ke jumlah karakter.
Tim Seguine

1

Python 2.7 - 115 karakter :

oneliner:

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

dan dalam pencetakan yang lebih bersih:

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

dalam 115 karakter:

>>> len(""""".join(["".join(i)+'\n' for i in zip(*[x+" "*(len(max(a.splitlines(), key=len))-len(x)) for x in a.splitlines()])])""")
115

Anda tidak menghapus spasi spasi di baris Anda seperti yang disyaratkan aturan.
Tim Seguine

Juga, sebenarnya 116 byte, \ndianggap lensebagai satu karakter, tetapi dua :)
Joachim Isaksson

1
@ JoachimIsaksson di unix \nadalah satu. Jadi saya katakan seseorang baik-baik saja.
Tim Seguine

@Tim len("\n")akan menampilkan 1, meskipun tentu saja 2 karakter terpisah dalam kode sumber. Menyimpan sumber ke file akan membuat lstampilan 116. Hanya mengatakan itu lenbukan cara terbaik untuk mengukur ukuran kode karena karakter melarikan diri sedang diproses sebelum mengukur :)
Joachim Isaksson

@ JoachimIsaksson oh, maaf saya salah paham maksud Anda.
Tim Seguine

1

GolfScript, 51 karakter

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

Ini adalah upaya pertama; Saya kira itu bisa diperbaiki. Sebagian besar kode adalah untuk memenuhi persyaratan penghapusan ruang padding dan trailing - tanpa mereka, hanya n%zip n*akan cukup.

Ps. Pengikut 46-karakter akan melakukan pekerjaan untuk input sampel yang diberikan, tetapi akan macet jika ada kolom input yang seluruhnya terdiri dari spasi:

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

Saya berasumsi itu cukup untuk mendiskualifikasi, bahkan jika tantangannya tidak secara eksplisit mengatakannya.


Asumsi Anda benar. Ini harus bekerja pada teks ASCII apa pun di bawah asumsi yang diizinkan dalam aturan.
Tim Seguine

1

Skema / Raket 113

Teks:

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

Tanpa garis baru dan spasi ekstra putih:

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

Versi ramah pengguna

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

1

Haskell

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

Itu sangat singkat, saya perlu menambahkan ruang putih ...


Saya hampir yakin Anda bisa menghapus sebagian spasi di sini. Namun sebaliknya, solusi hebat.
Konrad Borowski

3
Ini tidak bekerja pada sistem saya. Agak sulit untuk ditampilkan dalam komentar, tetapi jika Anda menjalankannya dua kali, Anda akan mendapatkannya I am a text..? Transpose met Can you do i.
marinus

Ya, saya berpikir mungkin Anda tidak mengisi garis untuk menjaga kolom tetap utuh seperti contohnya. Secara teoretis, hasil menjalankan fungsi dua kali harus menjadi string asli (dengan kemungkinan penambahan atau penghapusan baris baru akhir.)
Tim Seguine

1

Python 89 103 karakter

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

Saya merasa kotor. 90 104 karakter untuk versi kekuatan industri. : ^)


bukan fungsi.
Tim Seguine

@Tim My bad, fix. Pokoknya solusi saya lebih rendah daripada Joachim Isaksson. Saya ingin tahu apakah ada cara singkat untuk menyelesaikan masalah ini dengan rekursi.
TrevorM

1

Mathematica, 95 karakter

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

1

K, 56

Ini harus memenuhi spesifikasi sekarang.

Menerima string, mengembalikan string.

{`/:{$[" "=*|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"

Outputnya tampak seperti array string?
Tim Seguine

@Tim Itu. Jika Anda ingin satu string kemudian tambahkan tiga karakter. {`/:x@'/:!max@#:'x:`\:x}untuk 26.
tmartin

Anda juga memiliki masalah dengan spasi spasi tambahan. Dan "Jika ia menerima nama file, maka Anda mengembalikan nama file tempat Anda menyimpan hasilnya." Anda harus mengembalikan output dengan cara yang sama seperti Anda menerima input.
Tim Seguine

@ Tim harus diperbaiki sekarang. Bunuh bytecount saya
tmartin

Saya menduga itu mungkin :(, tapi spec adalah spec.
Tim Seguine

1

Groovy, 98 karakter

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

on line

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
}


1

J, 28 26 Bytes

Disimpan 2 byte berkat frownyfrog

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

Mengambil string, mengembalikan string. Saya tidak yakin jika ada versi pendek dari 'cutopen' fungsi kata kerja yang bisa saya gunakan.

Ada juga yang lebih pendek

t=.|:@:>@cutLF

Tapi saya tidak yakin itu termasuk dalam pedoman OP, karena mengembalikan array karakter.

Bagaimana itu bekerja:

                     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

Versi lain berfungsi sama, tetapi tidak mengonversi array yang dialihkan ke string yang diformat dengan benar.

Contoh:

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?

Saya akan menggunakan cutLF.
FrownyFrog

1
Simpan 1 karakter dengan0|:>@cutLF
FrownyFrog

1

Lua ,203 189 byte

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

Cobalah online!

Saya melihat solusi Lua lain di sini, tapi saya rasa tidak ada masalah dengan memposting 2 solusi pada bahasa yang sama. Jika ada, beri tahu saya :)


1
Tidak ada yang salah dengan beberapa jawaban dalam bahasa yang sama. Bahkan jawaban yang identik diizinkan sampai batas tertentu (meskipun dianjurkan untuk setidaknya memeriksa apakah Anda memposting solusi yang serupa)
Jo King

Sayangnya, hasil Anda tidak boleh memiliki spasi tambahan di baris mana pun .
Jo King

Tapi saya tidak bisa melihat spasi spasi putih pada output kode saya. Tidak ada spasi setelah garis berakhir dan tidak ada garis kosong di ujungnya.
Visckmart

Bagian yang tampaknya menangkap orang adalah di jalur mana pun . mis. Ini memiliki ruang kosong tambahan pada baris kedua
Jo King

Ohhh sekarang aku mengerti! Maaf. Saya akan mencoba membuatnya bekerja segera setelah saya punya waktu. Saya pikir masalahnya adalah hanya ada 1 contoh tes dan saya pikir itu akan menjadi tes "stres" hahah Tapi ok, terima kasih sudah memberi tahu saya :)
Visckmart
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.