สลับหน้าของข้อความ


28

แก้ไขฉันแก้ไขถ้อยคำของกฎเพื่อทำให้บางสิ่งที่ชัดเจนโดยนัยยิ่งขึ้น ฉันยังเพิ่มความสำคัญบางอย่างเพื่อกำจัดจุดที่สับสนชัดเจนและกำหนดตัวเลือกในการทำโปรแกรมสแตนด์อโลนแทนฟังก์ชั่น

เป้าหมายที่นี่คือการทำให้ฟังก์ชั่นที่ใช้ไฟล์ข้อความ (หรือสตริง) และเปลี่ยนมันเพื่อให้บรรทัดกลายเป็นคอลัมน์และในทางกลับกัน

ตัวอย่าง:

ฉันเป็นข้อความ
ไขว้ฉัน
คุณทำได้มั้ย?

ผลลัพธ์ใน:

ITC
 RA
อาน
ล้าน
 ซี่
APO
 อู
ทีเอส
อี๊ด
XO
TM
.ei
 .t
  ?

กฎระเบียบ:

  • คุณได้รับอนุญาตให้สมมติว่าอักขระช่องว่างเท่านั้นที่ใช้เป็น" "และ"\n"และไม่มีช่องว่างต่อท้ายในบรรทัดใด ๆ
  • คุณอาจคิดว่าไฟล์นั้นเป็น ASCII เครื่องหมายปลายทางที่คุณต้องการใช้ขึ้นอยู่กับคุณ (CRLF หรือ LF) มันจะต้องทำงานอย่างถูกต้องกับตัวอย่าง แต่มันก็ควรจะทำงานกับข้อมูลใด ๆที่เป็นไปตามสมมติฐานข้างต้น
  • คุณอาจต้องแทรกช่องว่าง (ในตัวอย่าง) โดยที่ไม่มีเพื่อรักษาคอลัมน์ในบรรทัด
  • ผลของคุณต้องไม่ได้ต่อท้ายช่องว่างในบรรทัดใด
  • อักขระขึ้นบรรทัดใหม่สุดท้าย (สำหรับบรรทัดสุดท้าย) เป็นทางเลือก
  • ควรเป็นฟังก์ชันหรือโปรแกรมที่สมบูรณ์ หากฟังก์ชั่นของคุณยอมรับสตริงก็ควรส่งคืนผลลัพธ์เป็นสตริง หากยอมรับชื่อไฟล์คุณจะส่งคืนชื่อไฟล์ที่คุณบันทึกผลลัพธ์ นอกจากนี้คุณยังได้รับอนุญาตให้เขียนโปรแกรมที่สมบูรณ์ซึ่งรับอินพุตจาก STDIN และส่งผลลัพธ์ที่ถูกต้องไปยัง STDOUT; หากคุณทำสิ่งนี้คุณจะต้องไม่ส่งสิ่งใดไปยัง STDERR
  • ขั้นตอนที่สั้นที่สุดชนะ แต่ฉันจะโหวตคำตอบที่ฉันชอบ

ตามกฎเอาต์พุตในตัวอย่างมีความยาว 53 หรือ 52 ไบต์ (สำหรับบรรทัดใหม่ LF) ขึ้นอยู่กับว่าขึ้นบรรทัดใหม่สุดท้ายหรือไม่

หมายเหตุ:มันไม่ได้เป็นข้อกำหนดเฉพาะ แต่ถ้าฟังก์ชั่นของคุณเมื่อรันสองครั้งติดต่อกันจะไม่เหมือนกับต้นฉบับ (ขึ้นบรรทัดใหม่สุดท้ายอาจแตกต่างกันและบรรทัดว่างใด ๆ ที่ท้ายไฟล์จะถูกลบ) จากนั้นคุณจะอาจละเมิดกฎข้อใดข้อหนึ่ง


ฉันตัดสินใจลบข้อห้ามเกี่ยวกับภาษาในตัว
Tim Seguine

ฉันแก้ไขเพื่อชี้แจงสภาพของช่องว่างต่อท้าย
Tim Seguine

คุณกำลังขอฟังก์ชั่นหรือไม่? เป็นที่ยอมรับหรือไม่ที่จะยอมรับสตริงจาก STDIN และพิมพ์เอาต์พุตที่ถูกต้องไปยัง STDOUT?
Justin

@Quincunx ใช่ฉันยอมรับว่าในฐานะ "ฟังก์ชั่น" ฉันจะเปลี่ยนกฎให้ชัดเจนในจุดนั้น
Tim Seguine

ฟังก์ชั่นการแปลงข้อความไม่สามารถมีส่วนร่วมได้เว้นแต่คุณจะอนุญาตให้ใช้ w ต่อท้าย ตัวอย่าง: "a * c \ ndef \ n" -> TT-> "a * \ ncd \ nef \ n" ~ "a \ ncd \ nef \ n" -> TT-> "acd \ nef \ n" โดยที่ * = ws
Emanuel Landeholm

คำตอบ:



4

J ( 31 40)

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

นี่คือฟังก์ชันที่รับสตริงและส่งคืนสตริง (เช่นเวกเตอร์อักขระที่มี linefeeds แทรกในตำแหน่งที่ถูกต้องไม่ใช่เมทริกซ์)

แก้ไข: ไม่มีช่องว่างต่อท้ายในบรรทัดใด ๆ

ทดสอบ:

   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
  ?

ฉันหวังว่าคุณสังเกตเห็นว่าฉันได้ลบข้อห้ามสำหรับการมีอยู่ภายใน
Tim Seguine

@Tim: ใช่มิฉะนั้นฉันจะไม่โพสต์สิ่งนี้
marinus

กฎช่องว่างต่อท้ายถูกเขียนอย่างชัดเจนหรือไม่? ดูเหมือนว่าคุณจะมีตัวละครมากกว่าที่ฉันคาดไว้
Tim Seguine

ฉันควรมีตัวละครกี่ตัว? ?\nตัวละครล่าสุดเมื่อวันที่สตริง
marinus

1
@Tim: ฉันสามารถรับได้ถึง 44 ใน APL เหตุผลหลักคือ APL ไม่ได้ให้บริการอย่างใดอย่างหนึ่งcutหรือdlbโดยค่าเริ่มต้นและการเขียนด้วยตัวเองนั้นจะต้องใช้ตัวอักษรจำนวนมากแม้ใน APL
marinus

4

ทับทิม 111

แข็งแรงเล่นกอล์ฟ:

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 มีฟังก์ชันทรานสดิสเรอเรชันดังนั้นนี่ก็แค่ตัดบรรทัดออกแล้วเปลี่ยนเป็นอาเรย์ของตัวละครใช้ฟังก์ชัน Array # transpos ของ Ruby จากนั้นเปลี่ยนอาเรย์ของอักขระกลับเป็นบรรทัด

การเล่นกอล์ฟเป็นเพียงการใช้ตัวระบุอักขระเดียวการลบช่องว่างการใช้ชั่วคราวสำหรับ text.lines และการคำนวณสำหรับ max_length inline (ไม่มีคะแนนสำหรับประสิทธิภาพ)


ดี คุณสามารถดึงออกจากตัวละครตัวหนึ่งมากขึ้นโดยการแทนที่ด้วย"\n" ?\n
OI

นอกจากนี้ยัง.to_aเป็นฟุ่มเฟือย คุณสามารถเพิ่มได้อีก 5 ตัวอักษร
OI

@OI ขอบคุณฉันเป็นหนี้คุณหกตัวอักษร ฉันประสิ่งนี้ออกจากที่ทำงานซึ่งใช้ 1.9.3 จำเป็นต้องใช้ to_a ใน 1.9.3 แต่ไม่ใช่ใน 2.0
Wayne Conrad

ฉันเห็น. ดีแล้วที่รู้. พิจารณาเราแม้จะแสดงให้ฉันเห็นวิธีการของสตริงใน Ruby ฉันควรใช้บ่อยกว่านี้ ไชโย!
OI

2
ความท้าทายของรหัสกอล์ฟบางอย่างทำให้ฉันสนใจเรียนรูบี้
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")}

ตัวอย่างการใช้งาน:

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
  ?

ช่องว่างต่อท้ายถูกลบออก


4

Python 2.7 ( 97 79 94 90)

แก้ไข: พลาดฟังก์ชั่นที่ต้องการ;

ฉันค่อนข้างแน่ใจว่าสิ่งนี้จะได้รับการปรับปรุงตั้งแต่ฉันเริ่มต้นที่นี่ แต่เริ่มต้นด้วย;

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

รหัสใช้ง่าย ๆsplitในการแยกสตริงเป็นเวกเตอร์ของแถว จากนั้นจะใช้mapกับค่าฟังก์ชันเป็นNone(ฟังก์ชัน unity) และตัวดำเนินการ splat เพื่อย้ายและวางเวกเตอร์ (ฟังก์ชันการทำงานที่คล้ายกับzip_longestใน Python3)

ส่วนที่เหลือของรหัสเพียงแมปNoneไปที่พื้นที่ภายนอกข้อมูลรถและประกอบเมทริกซ์อีกครั้งเพื่อสตริงเดียวอีกครั้ง

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

ไม่ตรงตามข้อกำหนด มันควรจะเป็นฟังก์ชั่นใช้เวลาสตริงและส่งกลับสตริง
Tim Seguine

@Tim ใช่พลาด แก้ไขแล้วขอบคุณ
Joachim Isaksson

+1 คุณเป็นรายการไพ ธ อนที่สั้นที่สุดในขณะนี้
Tim Seguine

ใช้ดีmapมาก ฉันกำลังมองหาสถานที่ที่จะใช้ ... และคุณก็เอาชนะฉันไปได้ ;)
บูธโดย

4

Bash + coreutils + sed, 83

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

foldและpasteทำงานที่สำคัญ ส่วนที่เหลือเป็นเพียงการจัดรูปแบบ

ยอมรับอินพุตจาก stdin และเอาต์พุตไปยัง 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
$ 

คุณดูเหมือนจะละเมิดกฎ "ผลลัพธ์ของคุณต้องไม่มีช่องว่างต่อท้ายในบรรทัดใด ๆ "
Tim Seguine

@ TimSeguine โอ๊ะฉันพลาดไป ฉันเพิ่งแก้ไขในการแก้ไขล่าสุด
บาดเจ็บทางระบบดิจิตอล

3

C (278 ไบต์)

แก้ไข: สิ่งนี้จริงทำลายกฎเนื่องจากใช้ชื่อไฟล์เป็นอาร์กิวเมนต์ แต่เขียนไปยัง stdout ฉันจะแก้ไขในภายหลังเพื่อเขียนไฟล์แล้วพิมพ์ชื่อไฟล์ไปยัง stdout

นี่คือรหัสกอล์ฟครั้งแรกของฉันเลยมีเมตตา บางตัวเก่า C. วางอินพุตtest.txtและปล่อยให้มันรัน!

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

ด้วยการใช้ชื่อตัวแปรแบบสั้นการลบการจัดรูปแบบที่ไม่จำเป็นและการอนุญาตให้จัดการกับไฟล์รั่วไหลและปิดการใช้งานคำเตือนทั้งหมดนี้จะลดลงเป็น 278 ไบต์ (เนื่องจากสิ่งนี้ใช้การนำเข้าโดยปริยายอาจไม่สามารถเชื่อมโยงกับทุกระบบได้

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

ฉันคิดว่าคุณสามารถใช้ประโยชน์จากนัยintในการทำให้การประกาศของคุณสั้นลงหรือเป็นเรื่องผิดกฎหมายในขณะนี้
Tim Seguine

ใช่ฉันใช้มันในการแก้ไขในภายหลังเพื่อไม่นำเข้า stdlib.h หรือ string.h ถ้าฉันไม่นำเข้า stdio.h มัน segfaults เมื่อทำงาน
wjl

หากต้องการแก้ไขความคิดเห็นของคุณเกี่ยวกับกฎ: ทางเลือกอื่นของคุณคือการยอมรับอินพุตจาก stdin ฉันจะพิจารณาว่าสอดคล้องกันเช่นกัน และฉันก็ไม่สามารถบอกได้จากภาพรวมคร่าวๆ: มันตัดช่องว่างออกจากปลายเส้นในเวอร์ชั่นไขว้หรือไม่?
Tim Seguine

เนื่องจากฉันอ่านไฟล์ซ้ำหลาย ๆ ครั้งเพื่อหลีกเลี่ยงการเก็บใน RAM การอ่านจาก stdio อาจจะยากกว่า :) ฉันไม่แน่ใจว่าช่องว่างใดควรถูกถอดออก ตอนนี้ฉันไม่คิดว่ามันจะทำการปอกใด ๆ เลยโชคไม่ดี ฉันจะต้องทำงานด้วยเช่นกัน
wjl

คุณสามารถประกาศA,B,D,I,J,*Fว่าเป็นตัวแปรทั่วโลกเพื่อหลีกเลี่ยงintคำหลัก ในทำนองเดียวกันคุณสามารถลบออกintจากmainการประกาศและการCโต้แย้ง ในC, intเป็นตัวเลือกในหลายสถานที่
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
}

ทดสอบ

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

ฉันไม่สามารถทดสอบอันนี้ได้ แต่มันก็ดูเป็นไปตามมาตรฐาน
Tim Seguine

3

Ruby: 88 ตัวอักษร

(โพสต์เพราะสั้นกว่าโซลูชัน Ruby อื่น ๆ ไม่ได้ตรวจสอบว่าโค้ดของฉันแนะนำอะไรใหม่เมื่อเทียบกับที่แก้ไขหากคุณโพสต์โซลูชัน Ruby ไว้แล้วและคุณรู้สึกว่านี่เป็นสำเนาของคุณส่วนใหญ่โปรดแสดงความคิดเห็น )

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

วิ่งตัวอย่าง:

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 คุณเล่นกอล์ฟได้ดีกว่าในทุกกรณี
Tim Seguine

3

Bash, 124 ไบต์

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

มันอ่านอินพุตมาตรฐานและเขียนเอาต์พุตมาตรฐาน ลองมัน:

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

มันทำงานอย่างไร:

  • split อินพุตลงในบรรทัดเดียว (ไฟล์ในไดเร็กทอรีชั่วคราว $D )
  • แยกบรรทัดออกเป็นอักขระเดี่ยวโดยใช้ grep (ไฟล์ * +)
  • ใช้เลย์เอาต์อักขระแบบเคียงข้างกัน paste (คอลัมน์ที่คั่นด้วย TAB)
  • ลบ TABs การจัดตำแหน่งแทนที่แท็บฟิลเลอร์ด้วย BLANKs ตัดแต่งโดยใช้ sed

แก้ไข:

  • -9: ลบรหัสเรียบร้อย;rm -r $D(ขอบคุณทิม)
  • -2: ใช้+แทน_คำต่อท้ายและย่อ${F}_ให้สั้นลง$F+
  • -3: ลบคำนำหน้าLจากไฟล์ผลแยก

สำหรับจุดประสงค์ของการเขียนโค้ดคุณไม่จำเป็นต้องเป็นคนดีและทำความสะอาดหลังจากที่ตัวเอง คุณสามารถออกไปrmเล็กน้อยจากการนับตัวละครของคุณ
Tim Seguine

2

Ruby - 144 ตัวอักษร

นี่คือความพยายามครั้งแรกของฉัน golfed:

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

สำหรับเอาต์พุตให้รันputs f textโดยที่textสตริงแบบหลายบรรทัดยึดตามกฎข้างต้น รุ่น ungolfed อยู่ด้านล่าง:

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 ให้ตรวจสอบรหัสของ Wayne Conrad ด้านบน


ฉันไม่ได้สังเกตtransposeในคำตอบของคุณก่อนที่ฉันจะเขียนของฉัน ดูเหมือนว่าฉันจะไม่ได้รับความเสี่ยงในการเขียนคำตอบของคุณเป็นหลัก แต่ก็ดีขึ้นเล็กน้อย :(
Wayne Conrad

2
ฉันไม่รังเกียจเลย คุณมากับรหัสของคุณอย่างอิสระและไม่ใช่การแข่งขัน ฉันเรียนรู้อะไรบางอย่างจากคำตอบของคุณ หากคุณระงับเพราะฉันใช้transposeมันเป็นไปได้ว่าวิธีการแก้ปัญหาทับทิมที่ดีกว่าจะไม่โผล่ขึ้นมา สิ่งหนึ่งที่ฉันชอบมากที่สุดเกี่ยวกับการเขียนโปรแกรมคือความเต็มใจที่จะทำงานร่วมกันและข้ามความคิด จนกว่าเราจะพบกันอีกครั้งครับ ไชโย!
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-แข็งแรงเล่นกอล์ฟ:

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

นี่เป็นความพยายามครั้งแรกของฉันในการเล่นกอล์ฟดังนั้นโปรดเป็นคนใจดี! นอกจากนี้คำแนะนำ / ข้อเสนอแนะจะได้รับการชื่นชมอย่างมาก!


มันสั้นกว่าความพยายาม php ของฉัน คุณสามารถบันทึกตัวละครทั้งสองโดย gitting กำจัด"s "trim"รอบ php จะให้คำเตือน แต่ก็ใช้ได้ดี
Tim Seguine

@ TimSeguine คำเตือนเอาท์พุทบนหน้าจอใช่ไหม? คุณจะต้องใช้@เพื่อยับยั้งการเตือน
ericw31415

@eric ฉันไม่ได้ใช้งานในขณะที่ความคิดเห็นอาจมีการเปลี่ยนแปลง แต่ในอดีตที่ผ่านมาถือว่าเป็นที่ยอมรับในการส่งออกข้อมูลที่ไม่เกี่ยวข้องกับข้อผิดพลาดมาตรฐาน
Tim Seguine

มันอนุญาตหรือไม่ ถ้านั่นเป็นเรื่องจริงฉันก็ไม่รู้เหมือนกัน
ericw31415

2

MATHEMATICA 117 ตัวอักษร

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

ฉันไม่สามารถทดสอบอันนี้ได้ดังนั้นคุณสามารถตรวจสอบได้หรือไม่ว่ามันจะลบช่องว่างที่อยู่บริเวณท้ายบรรทัด นอกจากนี้สิ่งนี้จะไม่ปรากฏขึ้น (ในแวบแรก) เพื่อกำหนดฟังก์ชั่นซึ่งต้องใช้กฎ
Tim Seguine

สวัสดี @Tim ตอนนี้มันเป็นฟังก์ชั่นf! .. tks
Murta


2

CJam, 32 25 ไบต์

CJam ใหม่กว่าความท้าทายนี้ดังนั้นคำตอบนี้จึงไม่มีสิทธิ์ได้รับการยอมรับ

สั้นลงอย่างมากโดยผู้ใช้ 23013

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

ทดสอบที่นี่

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

มีสิทธิ์หรือไม่มันเป็นคำตอบที่ยอดเยี่ยม ดูเหมือนว่าส่วนที่ยากที่สุดสำหรับคำตอบนี้คือการจัดการกับช่องว่างต่อท้าย
Tim Seguine

@ TimSeguine แน่นอน หากไม่มีผู้ดำเนินการตัดแต่งในตัวการทำสิ่งนี้ด้วยตนเองใน CJam นั้นยุ่งยากอย่างน่าประหลาดใจ (ข้อเสนอแนะของผู้ใช้ 23013 ได้ปรับปรุงให้ดีขึ้นอย่างมาก
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``

น้อย golfed

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

ทดสอบ

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

เรติน่า 40 ไบต์

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

ลองออนไลน์!

ขึ้นอยู่กับโปรแกรมนี้ที่ฉันสร้างขึ้นเพื่อแปลงสี่เหลี่ยมทุกขนาดซึ่งใช้คำแนะนำของ Leo ในการแปลงสี่เหลี่ยมขนาดเท่าที่รู้จัก

แก้ไข: เล่นกอล์ฟมากขึ้นและไม่มีช่องว่างต่อท้ายบนบรรทัดอีกต่อไป


2

Perl 5 , 25 ไบต์

โปรดทราบว่านี้ใช้ลำดับหนี ANSI และเป็นเช่นนี้ไม่ได้ทำงานใน TIO คุณ แต่สามารถเห็นมันในการดำเนินการที่นี่

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

คำอธิบาย

รหัสนี้เปลี่ยนค่าlist separator ( $")เป็นแท็บแนวตั้งตามด้วยลำดับ ANSI escape สำหรับ 'ย้อนกลับ 1 คอลัมน์' ( \x1b[1D) จากนั้นเราตั้งค่าตัวแปรที่พิมพ์โดยปริยาย$_ให้เป็นสตริงที่เริ่มต้นด้วยลำดับ ANSI escape สำหรับ 'เริ่มการพิมพ์ที่คอลัมน์บรรทัดที่ 1 $.(โดยที่$.เป็นบรรทัดข้อความปัจจุบัน)' ( \x1b1;$.H) และแทรกรายการ@F(ซึ่งเป็นรายการของอักขระทั้งหมดในบรรทัดนั้นซึ่งเติมโดย autosplit ( -a) ด้วยรูปแบบการแบ่งที่ว่างเปล่า ( -F)) ซึ่งวางเนื้อหาของ$"ในระหว่างแต่ละรายการเลื่อนเคอร์เซอร์ในแนวตั้งลงแทนที่จะเอาท์พุทต่อเนื่องหลังจากที่ตัวละครก่อนหน้า

ลองออนไลน์!


1
โอ้พระเจ้าที่น่ากลัวที่สุด! ฉันรักมัน!
Tim Seguine

1

C ++ (243 ตัวอักษร)

นี่คือฟังก์ชันที่รับและส่งคืนสตริง

ฉันโกนหนวดสักสิบสองตัว แต่ตัดสินใจที่จะเก็บมันไว้ในรูปแบบที่ไม่โง่ (ทำงานเร็วอ่านได้โอเค) บางทีฉันอาจตัดสินใจที่จะทำเช่นนี้เพราะนี่คือรหัสกอล์ฟครั้งแรกของฉัน ... ฉันยังไม่ยอมใครง่ายๆเลย :)

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

ด้วยการจัดรูปแบบ:

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

using namespace std;ผมถือว่าคุณใช้
Konrad Borowski

@xfix ไม่ปกติ แต่ฉันทำเพื่อสิ่งนี้
David

1
ถ้าฉันจู้จี้จุกจิกฉันจะบอกว่าusing namespace std;ควรจะเพิ่มเข้าไปในจำนวนตัวละคร
Tim Seguine

1

Python 2.7 - 115 ตัวอักษร :

หนึ่งในสายการบิน:

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

และในการพิมพ์ที่สะอาดขึ้น:

>>> 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 ตัวอักษร:

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

คุณไม่ได้ลอกช่องว่างที่ต่อท้ายบนบรรทัดของคุณเหมือนกฎที่ต้องการ
Tim Seguine

นอกจากนี้จริง ๆ แล้ว 116 ไบต์\nถือว่าlenเป็นถ่านเดียว แต่มันเป็นสอง :)
46432 Joachim Isaksson

1
@JoachimIsaksson บน unix \nเป็นหนึ่ง ดังนั้นฉันพูดได้ว่าเป็นเรื่องปกติ
Tim Seguine

@Tim len("\n")จะแสดง 1 แม้ว่าจะเป็นอักขระ 2 ตัวที่แยกต่างหากในซอร์สโค้ด การบันทึกแหล่งที่มาลงในไฟล์จะทำให้lsหน้าจอ 116 แสดงว่าlenไม่ใช่วิธีที่ดีที่สุดในการวัดขนาดรหัสเนื่องจากตัวละครที่กำลังประมวลผลก่อนที่จะทำการหลบหนี :)
Joachim Isaksson

@JoachimIsaksson โอ้ขอโทษฉันเข้าใจผิดจุดของคุณ
Tim Seguine

1

GolfScript, 51 ตัวอักษร

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

นี่เป็นความพยายามครั้งแรก; ฉันสงสัยว่ามันจะดีขึ้น ส่วนใหญ่ของรหัสคือการปฏิบัติตามข้อกำหนดการลบช่องว่างภายในและส่วนท้าย - โดยไม่ต้องn%zip n*ก็เพียงพอเพียง

ps เวอร์ชั่น46 -character ต่อไปนี้จะทำงานให้กับอินพุตตัวอย่างที่กำหนด แต่จะล้มเหลวหากคอลัมน์อินพุตใด ๆ ประกอบด้วยช่องว่างทั้งหมด:

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

ฉันคิดว่าเพียงพอที่จะตัดสิทธิ์แม้ว่าความท้าทายจะไม่ได้กล่าวอย่างชัดเจน


สมมติฐานของคุณถูกต้อง มันควรทำงานกับข้อความ ASCII ใด ๆ ภายใต้สมมติฐานที่อนุญาตในกฎ
Tim Seguine

1

โครงการ / แร็กเก็ต 113

ข้อความ:

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

ไม่มีบรรทัดใหม่และช่องว่างสีขาวพิเศษ:

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

รุ่นที่ใช้งานง่าย

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

มันสั้นมากฉันต้องเพิ่มในพื้นที่สีขาว ...


ฉันเกือบจะแน่ใจว่าคุณสามารถลบช่องว่างบางส่วนได้ที่นี่ แต่อย่างอื่นทางออกที่ดี
Konrad Borowski

3
สิ่งนี้ใช้ไม่ได้กับระบบของฉัน มันเป็นบิตยากที่จะแสดงในความคิดเห็น I am a text..? Transpose met Can you do iแต่ถ้าคุณใช้มันสองครั้งที่คุณได้รับ
marinus

ใช่ฉันคิดว่าบางทีคุณอาจไม่ได้เติมเต็มบรรทัดเพื่อให้คอลัมน์ยังคงเหมือนเดิม Theorectally ผลจากการทำงานของฟังก์ชั่นสองเท่าที่ควรจะเป็นสายเดิม (ที่มีอาจจะเพิ่มหรือถอนการขึ้นบรรทัดใหม่สุดท้าย.)
ทิม Seguine

1

Python 89 103 ตัวอักษร

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

ฉันรู้สึกสกปรก 90 104 chars เพื่อความแข็งแรงทางอุตสาหกรรม : ^)


ไม่ใช่ฟังก์ชั่น
Tim Seguine

@Tim ฉันไม่ดีคงที่ อย่างไรก็ตามวิธีการแก้ปัญหาของฉันด้อยกว่าของ Joachim Isaksson ฉันสงสัยว่ามีวิธีสั้น ๆ ในการแก้ปัญหานี้ด้วยการเรียกซ้ำ
TrevorM


1

K, 56

ควรตรงตามสเป็คตอนนี้

ยอมรับสตริงส่งคืนสตริง

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

ผลลัพธ์ที่ดูเหมือนจะเป็นอาร์เรย์ของสตริง?
Tim Seguine

@Tim มันเป็น หากคุณต้องการสตริงเดียวให้เพิ่มสามตัวอักษร {`/:x@'/:!max@#:'x:`\:x}สำหรับ 26.
tmartin

คุณมีปัญหากับช่องว่างต่อท้าย และ "หากยอมรับชื่อไฟล์คุณจะส่งคืนชื่อไฟล์ที่คุณบันทึกผลลัพธ์ไว้" คุณต้องส่งคืนเอาต์พุตในลักษณะเดียวกับที่คุณยอมรับอินพุต
Tim Seguine

@ Tim ควรได้รับการแก้ไขแล้ว ฆ่า bytecount ของฉัน
tmartin

ฉันสงสัยว่ามันอาจ :( แต่สเป็คเป็นสเป็ค
Tim Seguine

1

Groovy, 98 ตัวอักษร

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

ออนไลน์

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 ไบต์

บันทึก 2 ไบต์ขอบคุณ frownyfrog

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

รับสตริงส่งคืนสตริง ผมไม่แน่ใจว่าถ้ามีรุ่นสั้นของ 'cutopen' ฟังก์ชั่น คำกริยาที่ฉันสามารถใช้ได้หรือไม่

นอกจากนี้ยังมีขนาดสั้น

t=.|:@:>@cutLF

แต่ฉันไม่แน่ใจว่ามันอยู่ในแนวทางของ OP เนื่องจากส่งคืนอักขระจำนวนมาก

มันทำงานอย่างไร:

                     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

รุ่นอื่นใช้งานได้เหมือนกัน แต่ไม่แปลงอาเรย์ที่ถูกแปลงเป็นสตริงที่จัดรูปแบบอย่างถูกต้อง

ตัวอย่าง:

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?

cutLFผมจะใช้
FrownyFrog

1
บันทึก 1 ตัวละครด้วย0|:>@cutLF
FrownyFrog

1

Lua ,203 189 ไบต์

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

ลองออนไลน์!

ฉันเห็นโซลูชัน Lua อื่นที่นี่ แต่ฉันไม่คิดว่าจะมีปัญหากับการโพสต์ 2 โซลูชันในภาษาเดียวกัน ถ้ามีบอกฉันหน่อย :)


1
ไม่มีอะไรผิดปกติกับหลายคำตอบในภาษาเดียวกัน แม้คำตอบที่เหมือนกันได้รับอนุญาตให้แสดงความคิดเห็น (แม้ว่ามันจะได้รับการสนับสนุนให้เมื่อเช็คอย่างน้อยถ้าคุณกำลังโพสต์วิธีการแก้ปัญหาที่คล้ายกัน)
โจกษัตริย์

แต่น่าเสียดายที่ผลของคุณต้องไม่ได้ต่อท้ายช่องว่างในบรรทัดใด
Jo King

แต่ฉันไม่เห็นช่องว่างที่ต่อท้ายบนโค้ดของฉัน ไม่มีช่องว่างหลังจากสิ้นสุดบรรทัดและไม่มีบรรทัดว่างท้าย
Visckmart

ส่วนที่ดูเหมือนว่าจะจับคนออกเป็นในใด ๆบรรทัด เช่นนี้มีช่องว่างพิเศษในบรรทัดที่สอง
Jo King

โอ้ตอนนี้ฉันเข้าใจแล้ว! ขอโทษ ฉันจะพยายามทำให้มันใช้งานได้ทันทีที่ฉันมีเวลา ผมคิดว่าปัญหาก็คือว่ามีเพียงการทดสอบตัวอย่างที่ 1 และผมคิดว่าจะเป็น "ความเครียด" hahah ทดสอบ แต่ ok ขอบคุณสำหรับบอกฉัน :)
Visckmart
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.