Metnin sayfasını çevir


28

EDIT Bazı şeyleri daha açık hale getirmek için kuralların ifadesini değiştirdim. Ayrıca, görünürdeki karışıklığın bazı noktalarını temizlemek için biraz vurgu ekledim ve bir işlev yerine bağımsız bir program yapma seçeneğini açıkça tanımladım.

Buradaki amaç, bir metin dosyası (veya dize) alan ve satırları sütunlar veya tersi olacak şekilde dönüştüren bir işlev yapmaktır.

Örnek:

Ben bir mesajım
Transpoze et beni.
Bunu yapabilirmisin?

Sonuçlar:

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

Kurallar:

  • Sen kullanılan tek boşluk karakterler olduğunu varsayın izin verilir " "ve "\n"herhangi bir hat üzerinde hiçbir sondaki boşluk bulunmadığını söyledi.
  • Dosyanın ASCII olduğunu varsayabilirsiniz. Hangi bitiş çizgisini kullanmak istediğiniz size bağlıdır (CRLF veya LF). Örnekte doğru çalışması gerekir, ancak yukarıdaki varsayımları karşılayan herhangi bir girdi üzerinde de çalışması gerekir .
  • Sütunları aynı hizada tutmak için boşlukların (örnekte olduğu gibi) bulunmaması gerekebilir.
  • Sonucun olmamalıdır sonlarındaki boşluk var herhangi satırda .
  • Son satırsonu karakteri (son satır için) isteğe bağlıdır.
  • Bir işlev veya tam bir program olmalıdır. Eğer fonksiyonunuz bir string kabul ederse, sonuçları string olarak döndürmelidir. Bir dosya adını kabul ederse, sonucu kaydettiğiniz dosyanın adını döndürürsünüz. Ayrıca , STDIN'den girdi kabul eden ve doğru sonucu STDOUT'a veren tam bir program yazmanıza izin verilir ; Bunu yaparsanız, STDERR'ye hiçbir şey vermemelisiniz .
  • En kısa prosedür kazanır, ancak sevdiğim herhangi bir cevabı iptal edeceğim.

Kurallara dayanarak, örnekteki çıktı, son satırın eklenip eklenmemesine bağlı olarak 53 veya 52 bayt uzunluğundadır (LF yeni satırları için).

Not: Bu özel bir gereklilik değildir, ancak işleviniz art arda iki kez çalıştırıldığında orijinali ile aynı değilse (son satırsonu farklı olabilir ve dosyanın sonundaki boş satırlar silinir), o zaman Muhtemelen kurallardan birini çiğniyor.


Dil yapıları yasağını kaldırmaya karar verdim.
Tim Seguine

Sondaki boşluk durumunu netleştirmek için düzenleme yaptım.
Tim Seguine

Bir işlev mi arıyorsunuz? Bir dizgiyi STDIN'den kabul etmek ve doğru çıktıyı STDOUT'a yazdırmak kabul edilebilir mi?
Justin

@Quincunx Evet, bunu bir "işlev" olarak kabul ediyorum. Bu noktada açık olması gereken kuralları değiştireceğim.
Tim Seguine

Metin devri işlevi, w'nin izini sürene izin vermediğiniz sürece bir çözüm olamaz. Örnek: "a * c \ ndef \ n" -> TT-> "a * \ ncd \ nef \ n" ~ "a \ ncd \ nef \ n" -> TT-> "acd \ nef \ n" * = ws
Emanuel Landeholm

Yanıtlar:



4

J ( 31 40)

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

Bu, bir dizgeyi alan ve bir dizge döndüren bir işlevdir (yani doğru yerlere doğru beslenen satır beslemeli bir karakter vektörüdür , matris değil).

Düzenleme: herhangi bir satırda izleyen boşluk yok

Ölçek:

   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
  ?

İnşallah yerleşiklerin yasaklarını kaldırmışımdır.
Tim Seguine,

@Tim: Evet, aksi halde bunu göndermezdim.
marinus

İzleyen boşluk boşluğu kuralı belirsizce yazılıyor mu? Beklediğimden daha çok karakterin var.
Tim Seguine,

Kaç karakterim olmalı? Dize üzerindeki son karakterler ?\n.
marinus

1
@Tim: APL'de sadece 44'e ulaşabiliyordum. Bunun ana nedeni APL'nin ya varsayılan olarak ya cutda dlbvarsayılan olarak sağlamaması ve kendimin yazmasının APL'de bile bir sürü karakter almasıdır.
marinus,

4

Ruby 111

golfed:

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'nin bir dizi transpoze işlevi vardır, bu nedenle bu satırları basitleştirir, karakter dizisine dönüştürür, Ruby'nin Array # transpose işlevini kullanır, ardından karakter dizisini tekrar satırlara dönüştürür.

Golf oynamak sadece tek karakterli tanımlayıcılar kullanmak, boşlukları kaldırmak, text.lines için geçici kullanmak ve max_length inline için hesaplama yapmaktı (verimlilik için puan yok).


Güzel. Sen değiştirerek bir daha karakteri şerit olabilir "\n"ile ?\n.
OI

Ayrıca, .to_agereksiz. Orada 5 karakter daha kazanabilirsin.
OI

@OI Teşekkürler, size altı karakter borçluyum. Bunu 1.9.3 kullanan işte kestim. To_a 1.9.3'te gereklidir, ancak 2.0'da değildir.
Wayne Conrad

Anlıyorum. Bilmek güzel. Ruby'de birkaç String yöntemi gösterdiğim için bile bizi düşünün. Daha sık kullanmam gerekir. Şerefe!
OI

2
Koddaki bazı zorluklar, yakut öğrenmeye olan ilgimi arttırdı.
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")}

Kullanım örneği:

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
  ?

İzleyen beyaz boşluk kaldırıldı.


4

Python 2.7 ( 97 79 94 90)

EDIT: fonksiyon gereksinimi cevapsız;

Burada bir tür acemi olduğum için bunun daha iyi olacağından oldukça eminim;

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

Kod split, dizgiyi bir satır vektörüne bölmek için basit bir yöntem kullanır . Daha sonra (birlik fonksiyonu) mapgibi bir fonksiyon değerine Noneve vektörü ( zip_longestPython3'teki ile benzer işlevsellik) dönüştürmek ve doldurmak için uyarıcı operatörüyle birlikte kullanır .

Kodun geri kalanı sadece Noneuzayla eşleşir, matrisi yeniden tek bir dizeye yeniden düzenler ve yeniden birleştirir.

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

Tam olarak uyumlu değil. Bir işlev almak bir dize alır ve bir dize döndürür olmalıdır.
Tim Seguine

@Tim Evet, bunu kaçırdım. Şimdi düzeltildi, teşekkürler.
Joachim Isaksson,

+1 şu anda en kısa uyumlu python girişi gibi görünüyorsunuz.
Tim Seguine

Güzel kullanımı map. Bunu kullanacak bir yer aramaya devam ediyorum ... ve sen sadece beni yendin. ;)
26'da

4

Bash + coreutils + sed, 83

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

foldve pasteönemli işleri yapın. Gerisi sadece biçimleniyor.

Stdin'den girdi ve stdout'a çıktı kabul eder:

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

Kuralı çiğniyormuş gibi görünüyorsunuz "Sonuçlarınız hiçbir satırda boşluk bırakmamalıdır."
Tim Seguine

@TimSeguine Oops Bunu kaçırdım. Sadece en son düzenlemede düzelttim.
Dijital Travma

3

C (278 bayt)

Düzenleme: Bu aslında kurallara aykırıdır, çünkü dosya ismini argüman olarak alır, fakat stdout'a yazar. Daha sonra bir dosyaya yazıp sonra dosya adını stdout'a yazdırarak düzenlerim.

Bu benim ilk kod golf, şimdi merhamet olsun. Bazı düz eski C. Girişi yerleştirin test.txtve çalışmasına izin verin!

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

Kısa değişken adları kullanarak, gereksiz biçimlendirmeyi kaldırma ve dosya tanıtıcılarının sızmasına izin verme ve tüm uyarıları devre dışı bırakma, bu, 278 bayta düşürülür. (Bu, dolaylı içe aktarma kullandığından, tüm sistemlerde düzgün bağlantı kurmayabilir. Makinemde çalışıyor!)

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

intBazı bildirimlerinizi kısaltmak için örtülü olarak yararlanabileceğinizi düşünüyorum , yoksa bu yasadışı mı?
Tim Seguine

Evet, bunu stdlib.h veya string.h dosyasını içe aktarmamak için daha sonraki bir düzenlemede kullanıyorum. Stdio.h dosyasını içe aktarmazsam çalıştırmada segfaults.
wjl

Kurallar hakkındaki düzenleme yorumunuza: diğer alternatifiniz stdin'den girdiyi kabul etmektir. Ben de buna uygun olduğunu düşünürdüm. Ve ayrıca, el yazısı yönünden de bir şey söyleyemem: transpozit versiyonundaki boşlukların satırlarından boşluk bırakıyor mu?
Tim Seguine,

RAM'de saklamaktan kaçınmak için dosyayı birkaç kez yeniden okuduğum için, stdio'dan okumak muhtemelen daha zor olacaktır. :) Hangi boşlukların elimden alınması gerektiğinden emin değilim. Şu anda ne yazık ki herhangi bir sıyırma yaptığını sanmıyorum. Bunun üzerinde de çalışmak zorunda kalacağım.
wjl

Anahtar kelimeyi A,B,D,I,J,*Fönlemek için genel değişkenler olarak ilan edebilirsiniz int. Benzer bir şekilde, kaldırabilir intgelen mainbeyanı ve Cargüman. In C, intbirçok yerde isteğe bağlıdır.
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
}

Ölçek

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

Bunu test edemiyorum, ama uyumlu görünüyor
Tim Seguine

3

Yakut: 88 karakter

(Diğer Ruby çözümlerinden daha kısa olduğu için gönderildi. Kodumun bunlarla karşılaştırıldığında yeni bir şey getirip göstermediğini kontrol etmedim. Eğer daha önce bir Ruby çözümü yayınladıysanız ve bunun çoğunlukla sizin bir kopyası olduğunu düşünüyorsanız, lütfen yorum yapın ve cevabımı emekli edeceğim. )

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

Örnek çalışma:

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 Her durumda daha iyi golf oynadın.
Tim Seguine

3

Bash, 124 bayt

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

Standart girişi okur ve standart çıktı yazar. Dene:

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

Nasıl çalışır:

  • splittek satırlara giriş (geçici dizindeki dosyalar $D)
  • kullanarak satırları tek karakterlere ayırma grep(dosya * +)
  • Mizanpaj karakterlerini yan yana kullanarak paste(TAB ayrılmış sütunlar)
  • hizalama TAB'lerini çıkarın, dolgu TAB'lerini BLANK'larla değiştirin, sed

Düzenle:

  • -9: Düzenli düzenleme kodu kaldırıldı ;rm -r $D(teşekkürler Tim)
  • -2: kullanım +yerine _olarak eki ve kısaltması ${F}_için$F+
  • -3: Lbölünmüş sonuç dosyalarından öneki kaldır

Kod golf için, mutlaka kendinizden sonra iyi ve temiz olmak zorunda değilsiniz. rmKarakter sayınızdan bit bırakabilirsiniz .
Tim Seguine

2

Yakut - 144 karakter

İşte benim ilk girişim, 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

Çıktı için, yukarıdaki kurallara uygun çok satırlı bir dizgenin puts f textolduğu yerde çalıştırın text. Ungolfed versiyonu aşağıdadır:

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

Ruby'de benzer ancak sonuçta daha iyi bir çözüm için, Wayne Conrad'ın yukarıdaki kodunu inceleyin.


transposeCevabımı yazmadan önce cevabını fark etmedim . Cevabınızı esasen yeniden yazmam, biraz daha iyi bir şey değil. :(
Wayne Conrad

2
Hiç umrumda değil. Bağımsız olarak kodunuzla geldiniz ve bu bir yarış değil. Çözümünüzden kesinlikle bir şey öğrendim. Geride transposekalsaydın kullandım , daha iyi bir Ruby çözümü ortaya çıkmazdı. Programlama konusunda en çok sevdiğim şeylerden biri, fikir birliği ve çapraz bir araya gelme isteği. Tekrar görüşene kadar kibar efendim. Şerefe!
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)));}

Sigara golfed:

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

Bu benim ilk golf denemem, lütfen nazik ol! Ayrıca, ipuçları / öneriler çok takdir edilecektir!


Benim php denememden daha kısa. Sen kurtulmak gitting tarafından iki karakter kaydedebilirsiniz "etrafında s "trim". php bir uyarı verecektir, ancak gayet iyi çalışıyor.
Tim Seguine

@TimSeguine Yine de ekranda uyarılar çıktı? @Uyarıları bastırmak için kullanmanız gerekecek .
ericw31415

@eric Ben bir süredir aktif olamadım, bu yüzden görüşler değişmiş olabilirdi, fakat geçmişte alakasız verileri standart hataya çıkarmak kabul edilebilirdi.
Tim Seguine

Serbesttir? Eğer bu doğruysa, bunu bilmiyordum.
ericw31415,

2

MATHEMATICA 117 karakter

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

Bunu test edemiyorum, bu yüzden satırların sonundaki boşluklu beyaz alanı kaldırdığını doğrulayabilir misiniz? Ayrıca bu, kuralların gerektirdiği bir işlevi tanımlamak için (ilk bakışta) görünmez.
Tim Seguine

selam @Tim, şimdi bir fonksiyon f! .. tks
Murta

2

Perl (92 + 1)

stdin okur ve stdout'a yazar. puanına 1 ekleyereksay

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

2

CJam, 32 25 bayt

CJam bu mücadeleden daha yeni, bu nedenle bu cevap kabul edilmeye uygun değil.

Kullanıcı23013 tarafından büyük ölçüde kısaltılmıştır.

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

Burada test et.

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

Uygun ya da değil, harika bir geç cevaptır. Bu cevabın en zor kısmı sanki takip eden boşluklarla uğraşıyor gibiydi.
Tim Seguine

@TimSeguine Gerçekten. Yerleşik bir düzeltme operatörü olmadan, bunu CJam'da manuel olarak yapmak şaşırtıcı derecede zahmetlidir (user23013'ün önerisi zaten bunu büyük ölçüde geliştirdi).
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``

Daha az golf oynadı

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

Ölçek

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

Perl 5 , 25 bayt

Bunun ANSI kaçış dizilerini kullandığını ve TIO'da çalışmadığını, ancak eylem halini burada görebilirsiniz .

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

açıklama

Bu kod ilk önce list separator ( $") değerini dikey bir sekme olacak şekilde değiştirir, ardından '1 sütuna geri gitme' ( \x1b[1D) için ANSI çıkış sırasını takip eder , ardından örtülü olarak basılan değişkeni $_ANSI çıkış sırasına başlayan bir dize olarak ayarlarız. 'satır 1 sütununda yazdırmaya başla $.( $.geçerli metin satırı nerede )' ( \x1b1;$.H) ve listeyi @F(bu satırdaki tüm karakterlerin listesi olan, autosplit ( -a) ile boş bir bölme deseni ( -F) ile doldurulur ) araya sokar içeriğini $"her bir öğenin arasına yerleştirir, imleci önceki karakterden sonra çıktısını devam ettirmek yerine dikey olarak aşağıya kaydırır.

Çevrimiçi deneyin!


1
Aman Tanrım, saf korku! Onu seviyorum!
Tim Seguine

1

C ++ (243 karakter)

İşte bir dize alır ve döndüren bir işlev.

Birkaç düzine karakter traş edebilirdim, ama aptal olmayan bir kod olarak tutmaya karar verdim (hızlı koşuyor, tamam okuyor). Belki de bunu yapmaya karar verdim çünkü bu benim ilk golf kodumdur ... Henüz yeterince sert değilim :)

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

Biçimlendirme ile:

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

Kullandığını farz ediyorum using namespace std;.
Konrad Borowski

@xfix Normalde değil, ama bunun için yaptım
David

1
Eğer seçici davranıyorsam, using namespace std;karakter sayımına eklenmesi gerektiğini söyleyebilirim .
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'

ve daha temiz bir baskıda:

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

115 karakter içinde:

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

Kuralların gerektirdiği gibi takip eden boşlukları çizgileriniz üzerinde çıkarmayacaksınız.
Tim Seguine

Ayrıca, aslında 116 bayt, tek bir karakter olarak \nkabul edilir len, ancak iki :)
Joachim Isaksson,

1
Unix üzerindeki @ JoachimIsaksson \nbir tanesidir. Ben de bir tane iyi diyorum.
Tim Seguine

len("\n")Kaynak kodunda kesinlikle 2 ayrı karakter olmasına rağmen, @Tim 1 değerini gösterir. Kaynağı bir dosyaya kaydetmek lsekran 116'yı gösterecektir. Sadece lenölçümden önce işlenen kaçış karakterleri nedeniyle kod boyutunu ölçmenin en iyi yolu olmadığını söylemek :)
Joachim Isaksson 15

@ JoachimIsaksson oh, üzgünüm amacınızı yanlış anladım.
Tim Seguine

1

GolfScript, 51 karakter

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

Bu ilk denemedir; İyileştirilebileceğinden şüpheleniyorum. Kodun çoğu, doldurma ve iz bırakma alanı kaldırma gereksinimlerine uymaktır - bunlar olmadan, n%zip n*yeterli olur.

Ps. Aşağıdaki 46 karakterlik sürüm, verilen örnek girdi için işi yapacak, ancak herhangi bir girdi sütunu tamamen boşluklardan oluşuyorsa çökecektir:

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

Bunun açıkça söylemediği halde, diskalifiye edilmesi için yeterli olduğunu varsayıyorum.


Senin varsayımın doğru. Kurallarda izin verilen varsayımlar altındaki herhangi bir ASCII metni üzerinde çalışmalıdır.
Tim Seguine

1

Şema / Raket 113

Metin:

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

Yeni çizgiler ve ekstra beyaz boşluklar olmadan:

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

Kullanıcı dostu versiyon

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

Çok kısaydı, beyaz boşluk eklemeye ihtiyacım vardı ...


Buradaki boşlukların bir kısmını kaldırabileceğinizden neredeyse eminim. Ama aksi takdirde, harika bir çözüm.
Konrad Borowski

3
Bu benim sistemimde pek işe yaramaz. Bir yorumda gösterilmesi biraz zor, ancak iki kez çalıştırırsanız elde edersiniz I am a text..? Transpose met Can you do i.
marinus

Evet, bence sütunları örnekte olduğu gibi sağlam tutmak için satırları doldurmuyorsunuz. Teorik olarak, işlevi iki kez çalıştırmanın sonucu orijinal dize olmalıdır (muhtemelen son satırın eklenmesi veya kaldırılmasıyla).
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()

Kirli hissediyorum. Endüstriyel dayanıklılık için 90 104 karakter. : ^)


işlev değil
Tim Seguine

@Tim Benim fena, düzeltildi. Her neyse benim çözümüm Joachim Isaksson'a göre daha düşük. Bu problemi özyineleme ile çözmenin kısa bir yolu olup olmadığını merak ediyorum.
TrevorM

1

Mathematica, 95 karakter

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

1

K, 56

Bu şimdi şartnameye uygun olmalı.

Bir dizeyi kabul eder, bir dize döndürür.

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

Çıktı dizilerin bir dizi gibi görünüyor?
Tim Seguine

@Tim Öyle. Tek bir dize istiyorsanız, o zaman üç karakter ekleyin. {`/:x@'/:!max@#:'x:`\:x}26 için
tmartin

Ayrıca sondaki boşluk ile ilgili bir problemin var. Ve "Bir dosya adı kabul ederse, sonucu kaydettiğiniz dosyanın adını döndürürsünüz." Çıktıyı, kabul ettiğiniz şekilde döndürmeniz gerekir.
Tim Seguine

@Tim şimdi düzeltilmelidir. Yine de bytecount'ımı öldürdü
14:09


1

Harika, 98 karakter

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

internet üzerinden

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 Bayt

Frownyfrog sayesinde 2 bayt kaydedildi

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

Bir dize alır, bir dize döndürür. 'Cutopen' işlevinin daha kısa bir sürümü olup olmadığından emin değilim. fiilinin .

Ayrıca daha kısa var

t=.|:@:>@cutLF

Ancak OP'nin kurallarına uyduğundan emin değilim, çünkü bir dizi karakter döndürür.

Nasıl çalışır:

                     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

Diğer sürüm aynı şekilde çalışır, ancak aktarılan diziyi doğru biçimlendirilmiş bir dizeye dönüştürmez.

Örnekler:

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?

Kullanırdım cutLF.
FrownyFrog

1
1 karakter ile kaydet0|:>@cutLF
FrownyFrog 6:17

1

Lua ,203 189 bayt

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

Çevrimiçi deneyin!

Burada başka bir Lua çözümü gördüm, ancak aynı dilde 2 çözüm göndermede bir sorun olduğunu sanmıyorum. Varsa, söyle bana :)


1
Aynı dilde çoklu cevaplarda yanlış bir şey yok. Aynı cevaplara bile izin verilmektedir (en azından benzer bir çözümü yayınlayıp yayınlamadığınızı kontrol etmenize teşvik edilse de)
Jo King

Maalesef, sonucunuz hiçbir satırda sonda boşluk bırakmamalıdır .
Jo King,

Ancak kodumun çıktısında iz bırakan boşlukları göremiyorum. Satır bittikten sonra boşluk olmaz, sonunda da boş bir satır olmaz.
Visckmart

İnsanları yakalamak gibi görünüyor parçasıdır üzerinde herhangi hattı . mesela bu ikinci satırda ekstra boşluğa sahiptir
Jo Kral

Ohhh şimdi anladım! Üzgünüm. Zamanım olduğu anda çalışmasını sağlamaya çalışacağım. Sanırım sorun sadece 1 örnek test olmasıydı ve bunun “stres” testi olacağını düşünmüştüm. Ama tamam, bana söylediğiniz için teşekkürler :)
Visckmart
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.