Chuyển một trang văn bản


28

EDIT Tôi đã sửa đổi từ ngữ của các quy tắc để làm cho một số điều rõ ràng rõ ràng hơn. Tôi cũng đã thêm một số điểm nhấn để làm rõ một số điểm nhầm lẫn rõ ràng và xác định rõ ràng tùy chọn tạo một chương trình độc lập thay vì một chức năng.

Mục tiêu ở đây là tạo ra một hàm lấy tệp văn bản (hoặc chuỗi) và hoán chuyển nó để các dòng trở thành cột và ngược lại.

Thí dụ:

Tôi là một văn bản.
Chuyển tôi
Bạn có làm được không

Kết quả trong:

ITC
 ra
aan
mn
 sy
một PO
 ồ
ts
eed
xo
tm
.ei
 .t
  ?

Những quy định:

  • Bạn được phép giả định rằng các ký tự khoảng trắng duy nhất được sử dụng là " ""\n"không có khoảng trắng ở cuối trên bất kỳ dòng nào.
  • Bạn có thể cho rằng tệp là ASCII. Điểm đánh dấu endline nào bạn muốn sử dụng là tùy thuộc vào bạn. (CRLF hoặc LF). Nó phải hoạt động chính xác trên ví dụ, nhưng nó cũng sẽ hoạt động trên bất kỳ đầu vào nào thỏa mãn các giả định trên.
  • Bạn có thể phải chèn khoảng trắng (như trong ví dụ) trong đó không có khoảng trống nào để giữ các cột thẳng hàng.
  • Kết quả của bạn không được có khoảng trắng cuối trên bất kỳ dòng nào .
  • Ký tự dòng mới cuối cùng (cho dòng cuối cùng) là tùy chọn.
  • Nó nên là một chức năng hoặc một chương trình hoàn chỉnh. Nếu hàm của bạn chấp nhận một chuỗi, thì nó sẽ trả về kết quả dưới dạng chuỗi. Nếu nó chấp nhận tên tệp, thì bạn trả về tên của tệp mà bạn đã lưu kết quả. Bạn cũng được phép viết một chương trình hoàn chỉnh chấp nhận đầu vào từ STDIN và đưa ra kết quả chính xác cho STDOUT; nếu bạn làm điều này, bạn không được xuất bất cứ thứ gì sang STDERR.
  • Thủ tục ngắn nhất sẽ thắng, nhưng tôi sẽ đưa ra bất kỳ câu trả lời nào tôi thích.

Dựa trên các quy tắc, đầu ra trên ví dụ dài 53 hoặc 52 byte (đối với các dòng mới của LF) tùy thuộc vào dòng mới cuối cùng có được bao gồm hay không.

Lưu ý: Đây không phải là một yêu cầu cụ thể, nhưng nếu chức năng của bạn, khi chạy hai lần liên tiếp không giống với bản gốc (dòng mới cuối cùng có thể khác và bất kỳ dòng trống nào ở cuối tệp sẽ bị xóa), thì bạn sẽ có lẽ phá vỡ một trong những quy tắc.


Tôi quyết định xóa bỏ sự cấm đoán đối với ngôn ngữ tích hợp.
Tim Seguine

Tôi chỉnh sửa để làm rõ các điều kiện khoảng trắng theo sau.
Tim Seguine

Bạn đang yêu cầu một chức năng? Có thể chấp nhận chấp nhận một chuỗi từ STDIN và in đầu ra chính xác sang STDOUT không?
Justin

@Quincunx Vâng, tôi chấp nhận rằng đó là một "chức năng". Tôi sẽ thay đổi các quy tắc để được rõ ràng về điểm đó.
Tim Seguine

Hàm chuyển đổi văn bản không thể là một phép cộng trừ khi bạn cho phép theo dõi ws. Ví dụ: "a * c \ ndef \ n" -> TT-> "a * \ ncd \ nef \ n" ~ "a \ ncd \ nef \ n" -> TT-> "acd \ nef \ n", trong đó * = ws
Emanuel Landeholm

Câu trả lời:



4

J ( 31 40)

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

Đây là một hàm lấy một chuỗi và trả về một chuỗi (tức là một vectơ ký tự với các đường dẫn được chèn vào đúng chỗ và không phải là ma trận.)

Chỉnh sửa: không có khoảng trắng ở cuối trên bất kỳ dòng nào.

Kiểm tra:

   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
  ?

Tôi hy vọng bạn nhận thấy tôi đã loại bỏ các lệnh cấm đối với tích hợp sẵn.
Tim Seguine

@Tim: Vâng, nếu không tôi sẽ không đăng cái này.
bến tàu

Là quy tắc khoảng trắng dấu vết được viết không rõ ràng? Bạn dường như có nhiều nhân vật hơn tôi mong đợi.
Tim Seguine

Tôi nên có bao nhiêu nhân vật? Các ký tự cuối cùng trên chuỗi là ?\n.
bến tàu

1
@Tim: Tôi chỉ có thể đạt tới 44 trong APL. Lý do chính là APL không cung cấp cuthoặc dlbtheo mặc định và việc tự viết chúng sẽ mất một loạt các ký tự ngay cả trong APL.
bến tàu

4

Ruby 111

Chơi gôn

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

Ung dung:

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 có chức năng hoán vị mảng, do đó, điều này chỉ đơn giản là đệm các dòng ra, biến chúng thành một mảng các ký tự, sử dụng hàm chuyển đổi # # của Ruby, sau đó biến mảng ký tự trở lại thành các dòng.

Chơi golf chỉ đơn giản là sử dụng mã định danh một ký tự, xóa khoảng trắng, sử dụng tạm thời cho text.lines và đặt phép tính cho nội tuyến max_length (không có điểm nào cho hiệu quả).


Tốt đẹp. Bạn có thể loại bỏ thêm một ký tự bằng cách thay thế "\n"bằng ?\n.
OI

Ngoài ra, .to_alà thừa. Bạn có thể đạt được 5 ký tự khác ở đó.
OI

@OI Cảm ơn, tôi nợ bạn sáu ký tự. Tôi đã loại bỏ điều này tại nơi làm việc, sử dụng 1.9.3. To_a được yêu cầu trong 1.9.3, nhưng không phải trong 2.0.
Wayne Conrad

Tôi hiểu rồi. Tốt để biết. Hãy xem xét chúng tôi ngay cả khi chỉ cho tôi một vài phương thức String trong Ruby Tôi nên sử dụng thường xuyên hơn. Chúc mừng!
OI

2
Một số thử thách chơi gôn mã đã làm mới lại sở thích của tôi trong việc học 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")}

Ví dụ sử dụng:

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
  ?

Khoảng trắng Trailing được loại bỏ.


4

Python 2.7 ( 97 79 94 90)

EDIT: Thiếu yêu cầu chức năng;

Tôi khá chắc chắn rằng điều này sẽ được cải thiện vì tôi là người mới bắt đầu ở đây, nhưng để bắt đầu;

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

Mã sử ​​dụng một đơn giản splitđể chia chuỗi thành một vectơ hàng. Sau đó, nó sử dụng mapvới một giá trị hàm là None(hàm unity) và toán tử splat để hoán vị và đệm vectơ (chức năng tương tự như zip_longesttrong Python3)

Phần còn lại của mã chỉ ánh xạ Nonevào không gian, cắt và ghép lại ma trận thành một chuỗi duy nhất.

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

Không chính xác tuân thủ. Nó sẽ là một hàm mất một chuỗi và trả về một chuỗi.
Tim Seguine

@Tim Vâng, đã bỏ lỡ điều đó. Đã sửa bây giờ, cảm ơn.
Joachim Isaksson

+1 bạn dường như là mục nhập trăn ngắn nhất vào lúc này.
Tim Seguine

Sử dụng tốt đẹp của map. Tôi tiếp tục tìm một nơi để sử dụng nó ... và bạn chỉ cần đánh bại tôi với nó. ;)
gian hàng

4

Bash + coreutils + sed, 83

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

foldpastelàm công việc quan trọng. Phần còn lại chỉ là định dạng.

Chấp nhận đầu vào từ stdin và đầu ra cho thiết bị xuất chuẩn:

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

Bạn dường như đang phá vỡ quy tắc "Kết quả của bạn không được có khoảng trắng ở cuối trên bất kỳ dòng nào."
Tim Seguine

@TimSeguine Rất tiếc tôi đã bỏ lỡ cái đó. Tôi chỉ sửa nó trong bản chỉnh sửa mới nhất.
Chấn thương kỹ thuật số

3

C (278 byte)

Chỉnh sửa: Điều này thực sự phá vỡ các quy tắc, vì nó lấy tên tệp làm đối số nhưng ghi vào thiết bị xuất chuẩn. Tôi sẽ chỉnh sửa nó sau để ghi vào một tệp và sau đó in tên tệp thành thiết bị xuất chuẩn.

Đây là mã golf đầu tiên của tôi từ trước đến nay, vì vậy hãy thương xót. Một số đơn giản cũ C. Đặt đầu vào test.txtvà để cho nó chạy!

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

Bằng cách sử dụng tên biến ngắn, loại bỏ định dạng vô cớ và cho phép xử lý tệp bị rò rỉ và vô hiệu hóa tất cả các cảnh báo, điều này được giảm xuống còn 278 byte. (Vì việc này sử dụng nhập khẩu ngầm, nên nó có thể không liên kết chính xác trên tất cả các hệ thống. Hoạt động trên máy của tôi!)

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

Tôi nghĩ rằng bạn có thể lợi dụng ngầm intđể rút ngắn một số tuyên bố của bạn, hoặc bây giờ điều đó là bất hợp pháp?
Tim Seguine

Vâng, tôi đang sử dụng nó trong lần chỉnh sửa sau để không nhập stdlib.h hoặc string.h. Nếu tôi không nhập stdio.h thì nó sẽ chạy.
wjl

Để bình luận chỉnh sửa của bạn về các quy tắc: lựa chọn khác của bạn là chấp nhận đầu vào từ stdin. Tôi sẽ xem xét rằng phù hợp là tốt. Ngoài ra, tôi không thể nói từ một cái nhìn lướt qua: nó có tước khoảng trắng từ cuối dòng trong phiên bản chuyển vị không?
Tim Seguine

Vì tôi đọc lại tệp nhiều lần để tránh lưu trữ trong RAM, nên đọc từ stdio có lẽ sẽ khó hơn. :) Tôi không chắc nên xóa khoảng trắng nào. Ngay bây giờ tôi không nghĩ rằng nó không có bất kỳ tước, không may. Tôi cũng sẽ phải làm việc với điều đó.
wjl

Bạn có thể khai báo A,B,D,I,J,*Flà biến toàn cục, để tránh inttừ khóa. Tương tự, bạn có thể xóa intkhỏi mainkhai báo và Cđối số. Trong C, intlà tùy chọn ở nhiều nơi.
Konrad Borowski

3

Auto Hotkey 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
}

Kiểm tra

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

Tôi không thể kiểm tra cái này, nhưng nó có vẻ tuân thủ
Tim Seguine

3

Ruby: 88 ký tự

(Được đăng bởi vì nó ngắn hơn các giải pháp Ruby khác. Không kiểm tra xem mã của tôi có giới thiệu gì mới so với các giải pháp đó không. Nếu bạn đã đăng một giải pháp Ruby và bạn cảm thấy đây chủ yếu là bản sao của bạn, vui lòng nhận xét và tôi sẽ rút lại câu trả lời của tôi. )

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

Chạy mẫu:

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 Bạn chơi golf tốt hơn trong mọi trường hợp.
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/ *$//'

Nó đọc đầu vào tiêu chuẩn và ghi đầu ra tiêu chuẩn. Thử nó:

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

Làm thế nào nó hoạt động:

  • splitnhập vào các dòng đơn (tệp trong thư mục tạm thời $D)
  • chia dòng thành các ký tự đơn bằng cách sử dụng grep(tệp * +)
  • bố trí các ký tự cạnh nhau bằng cách sử dụng paste(các cột được phân tách bằng TAB)
  • xóa TAB căn chỉnh, thay thế TAB phụ bằng BLANK, cắt bằng cách sử dụng sed

Chỉnh sửa:

  • -9: Đã xóa mã dọn dẹp ;rm -r $D(cảm ơn Tim)
  • -2: sử dụng +thay vì _như hậu tố và rút ngắn ${F}_thành$F+
  • -3: xóa tiền tố Lkhỏi các tệp kết quả phân tách

Đối với các mục đích của mã golf, bạn không nhất thiết phải đẹp và tự dọn dẹp. Bạn có thể để lại một rmchút từ số lượng nhân vật của bạn.
Tim Seguine

2

Ruby - 144 ký tự

Đây là nỗ lực đầu tiên của tôi, đánh gôn:

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

Đối với đầu ra, chạy puts f textở đâu textlà bất kỳ chuỗi nhiều dòng tuân thủ các quy tắc ở trên. Phiên bản không có bản quyền dưới đây:

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

Để có giải pháp tương tự nhưng cuối cùng tốt hơn trong Ruby, hãy xem mã của Wayne Conrad ở trên.


Tôi đã không nhận thấy transposetrong câu trả lời của bạn trước khi tôi viết của tôi. Có vẻ như tôi không thực sự viết lại câu trả lời của bạn, chỉ tốt hơn một chút. :(
Wayne Conrad

2
Tôi không bận tâm chút nào. Bạn đã đưa ra mã của mình một cách độc lập và đó không phải là một cuộc đua. Tôi chắc chắn đã học được điều gì đó từ giải pháp của bạn. Nếu bạn giữ lại vì tôi đã sử dụng transpose, có thể một giải pháp Ruby tốt hơn sẽ không xuất hiện. Một trong những điều tôi thích nhất về lập trình là sự sẵn sàng hợp tác và thụ phấn chéo. Cho đến khi chúng ta gặp lại nhau, thưa ngài. Chúc mừng!
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)));}

Không chơi gôn:

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

Đây là nỗ lực chơi gôn đầu tiên của tôi, vì vậy hãy tử tế! Ngoài ra, lời khuyên / đề xuất sẽ được đánh giá rất cao!


Nó ngắn hơn nỗ lực php của tôi. Bạn có thể lưu hai ký tự bằng cách loại bỏ các "xung quanh "trim". php sẽ đưa ra một cảnh báo, nhưng nó hoạt động tốt.
Tim Seguine

@TimSeguine Cảnh báo đầu ra trên màn hình mặc dù phải không? Bạn sẽ phải sử dụng @để ngăn chặn các cảnh báo.
ericw31415

@eric Tôi đã không hoạt động trong một thời gian vì vậy các ý kiến ​​có thể đã thay đổi, nhưng trong quá khứ, nó được coi là chấp nhận được để xuất dữ liệu không liên quan đến lỗi tiêu chuẩn.
Tim Seguine

Nó đã được chấp nhận? Nếu đó là sự thật, thì tôi đã không biết điều đó.
ericw31415

2

MATHEMATICA 117 ký tự

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

Tôi không thể kiểm tra cái này, vì vậy bạn có thể xác minh rằng nó sẽ loại bỏ khoảng trắng ở cuối dòng không? Ngoài ra, điều này không xuất hiện (thoạt nhìn) để xác định một chức năng, mà các quy tắc yêu cầu.
Tim Seguine

xin chào @Tim, bây giờ nó là một chức năng f! .. tks
Murta

2

Perl (92 + 1)

đọc stdin và viết vào stdout. thêm 1 vào điểm số chosay

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

2

CJam, 32 25 byte

CJam mới hơn thử thách này, vì vậy câu trả lời này không đủ điều kiện để được chấp nhận.

Được rút ngắn đáng kể bởi user23013.

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

Kiểm tra nó ở đây.

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

Đủ điều kiện hay không, đó là một câu trả lời muộn tuyệt vời. Có vẻ như phần khó nhất cho câu trả lời này là xử lý các khoảng trống ở cuối.
Tim Seguine

@TimSeguine Thật vậy. Nếu không có toán tử cắt xén tích hợp, thực hiện việc này một cách thủ công trong CJam rất khó sử dụng (đề xuất của user23013 đã cải thiện đáng kể).
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``

Ít chơi gôn

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

Kiểm tra

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 byte

Lưu ý rằng điều này sử dụng các chuỗi thoát ANSI và như vậy không hoạt động trên TIO, tuy nhiên bạn có thể thấy nó hoạt động ở đây .

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

Giải trình

Trước tiên, mã này thay đổi giá trị dấu phân cách danh sách ( $") thành tab dọc, theo sau là chuỗi thoát ANSI cho 'quay ngược 1 cột' ( \x1b[1D), sau đó chúng tôi đặt biến được in ngầm $_thành một chuỗi bắt đầu bằng chuỗi thoát ANSI cho 'bắt đầu in tại cột dòng 1 $.(trong đó $.dòng văn bản hiện tại)' ( \x1b1;$.H) và nội suy danh sách @F(là danh sách tất cả các ký tự trên dòng đó, được điền bởi autosplit ( -a) với mẫu phân tách trống ( -F)) trong đó đặt nội dung $"ở giữa mỗi mục, di chuyển con trỏ xuống theo chiều dọc thay vì tiếp tục xuất sau ký tự trước.

Hãy thử trực tuyến!


1
Ôi chúa ơi, nỗi kinh hoàng! Tôi thích nó!
Tim Seguine

1

C ++ (243 ký tự)

Đây là một hàm lấy và trả về một chuỗi.

Tôi đã có thể cạo vài chục ký tự, nhưng quyết định giữ nó dưới dạng mã không ngu ngốc (chạy nhanh, đọc ổn). Có lẽ tôi chỉ quyết định làm điều đó bởi vì đây là môn đánh gôn đầu tiên của tôi ... Tôi chưa đủ khó tính :)

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

Với định dạng:

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

Tôi giả sử bạn sử dụng using namespace std;.
Konrad Borowski

@xfix Không bình thường, nhưng tôi đã làm điều này
David

1
Nếu tôi kén chọn, tôi sẽ nói using namespace std;nên được thêm vào số lượng nhân vật.
Tim Seguine

1

Python 2.7 - 115 ký tự :

lót:

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

và trong một bản in sạch hơ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
  ?

trong 115 ký tự:

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

Bạn không tước khoảng trắng theo sau trên các dòng của bạn như các quy tắc yêu cầu.
Tim Seguine

Ngoài ra, nó thực sự là 116 byte, \nđược coi lenlà một char duy nhất, nhưng đó là hai :)
Joachim Isaksson

1
@JoachimIsaksson trên unix \nlà một. Vì vậy, tôi nói một là tốt.
Tim Seguine

@Tim len("\n")sẽ hiển thị 1, mặc dù chắc chắn đó là 2 ký tự riêng biệt trong mã nguồn. Lưu nguồn vào một tệp sẽ lshiển thị 116. Chỉ cần nói rằng đó lenkhông phải là cách tốt nhất để đo kích thước mã do các ký tự thoát được xử lý trước khi đo :)
Joachim Isaksson

@JoachimIsaksson oh, xin lỗi tôi đã hiểu nhầm quan điểm của bạn.
Tim Seguine

1

GolfScript, 51 ký tự

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

Đây là một nỗ lực đầu tiên; Tôi nghi ngờ nó có thể được cải thiện. Hầu hết các mã là để tuân thủ các yêu cầu loại bỏ không gian đệm và dấu vết - không có chúng, n%zip n*sẽ chỉ đủ.

Thi thiên Phiên bản 46 -character sau đây sẽ thực hiện công việc cho đầu vào mẫu đã cho, nhưng sẽ sập nếu bất kỳ cột đầu vào nào chứa toàn bộ khoảng trắng:

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

Tôi cho rằng điều đó đủ để loại bỏ nó, ngay cả khi thử thách không nói rõ ràng như vậy.


Giả định của bạn là chính xác. Nó nên hoạt động trên bất kỳ văn bản ASCII nào theo các giả định được phép trong các quy tắc.
Tim Seguine

1

Sơ đồ / vợt 113

Văn bản:

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

Không có dòng mới và khoảng trắng thừa:

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

Phiên bản thân thiện với người dùng

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

Nó quá ngắn, tôi cần thêm vào khoảng trắng ...


Tôi gần như chắc chắn rằng bạn có thể loại bỏ một số khoảng trắng ở đây. Nhưng nếu không, giải pháp tuyệt vời.
Konrad Borowski

3
Điều này không hoạt động trên hệ thống của tôi. Hơi khó để thể hiện trong một nhận xét, nhưng nếu bạn chạy nó hai lần, bạn sẽ nhận được I am a text..? Transpose met Can you do i.
bến tàu

Vâng, tôi nghĩ có lẽ bạn không đệm các dòng để giữ cho các cột nguyên vẹn như ví dụ. Về mặt lý thuyết, kết quả của việc chạy chức năng hai lần phải là chuỗi gốc (có thể là thêm hoặc xóa dòng mới cuối cùng.)
Tim Seguine

1

Python 89 103 ký tự

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

Tôi cảm thấy bẩn. 90 104 ký tự cho phiên bản sức mạnh công nghiệp. : ^)


không phải là một chức năng.
Tim Seguine

@Tim Của tôi xấu, đã sửa. Dù sao, giải pháp của tôi không thua kém gì Joachim Isaksson. Tôi tự hỏi nếu có bất kỳ cách ngắn để giải quyết vấn đề này với đệ quy.
TrevorM

1

Toán học, 95 ký tự

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

1

K, 56

Điều này sẽ đáp ứng các thông số kỹ thuật bây giờ.

Chấp nhận một chuỗi, trả về một chuỗi.

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

Đầu ra dường như là một chuỗi các chuỗi?
Tim Seguine

@Tim Đó là. Nếu bạn muốn một chuỗi đơn thì thêm ba ký tự. {`/:x@'/:!max@#:'x:`\:x}cho 26.
tmartin

Bạn cũng có một vấn đề với khoảng trắng dấu. Và "Nếu nó chấp nhận tên tệp, thì bạn trả lại tên của tệp nơi bạn đã lưu kết quả." Bạn cần trả lại đầu ra giống như cách bạn chấp nhận đầu vào.
Tim Seguine

@Tim nên được sửa ngay bây giờ. Giết chết số tiền của tôi mặc dù
tmartin

Tôi nghi ngờ nó có thể :(, nhưng một thông số là một thông số kỹ thuật
Tim Seguine 20/03/2016

1

Groovy, 98 ký tự

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

Trực tuyến

vô dụng:

{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 byte

Đã lưu 2 byte nhờ vào frownyfrog

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

Lấy một chuỗi, trả về một chuỗi. Tôi không chắc chắn nếu có một phiên bản ngắn hơn của động từ chức năng 'cutopen' mà tôi có thể sử dụng.

Cũng có cái ngắn hơn

t=.|:@:>@cutLF

Nhưng tôi không chắc nó nằm trong hướng dẫn của OP, vì nó trả về một loạt các ký tự.

Làm thế nào nó hoạt động:

                     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

Phiên bản khác hoạt động tương tự, nhưng không chuyển đổi mảng được chuyển thành một chuỗi được định dạng đúng.

Ví dụ:

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?

Tôi sẽ sử dụng cutLF.
FrownyFrog

1
Lưu 1 ký tự với0|:>@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

Hãy thử trực tuyến!

Tôi đã thấy một giải pháp Lua khác ở đây, nhưng tôi không nghĩ có vấn đề gì với việc đăng 2 giải pháp trên cùng một ngôn ngữ. Nếu có, hãy nói cho tôi :)


1
Không có gì sai với nhiều câu trả lời trong cùng một ngôn ngữ. Ngay cả các câu trả lời giống hệt nhau cũng được cho phép ở một mức độ nào đó (mặc dù ít nhất nó được khuyến khích kiểm tra xem bạn có đăng giải pháp tương tự không)
Jo King

Thật không may, kết quả của bạn không được có khoảng trắng ở bất kỳ dòng nào .
Jo King

Nhưng tôi không thể thấy dấu vết trắng trên đầu ra của mã. Không có khoảng trắng sau khi dòng kết thúc và không có dòng trống ở cuối.
Visckmart

Phần mà dường như để bắt mọi người là trên bất kỳ dòng . ví dụ: Điều này có thêm khoảng trắng trên dòng thứ hai
Jo King

Ohhh bây giờ tôi đã nhận nó! Lấy làm tiếc. Tôi sẽ cố gắng làm cho nó hoạt động ngay khi tôi có thời gian. Tôi nghĩ vấn đề là chỉ có 1 bài kiểm tra mẫu và tôi nghĩ đó sẽ là bài kiểm tra "căng thẳng" hahah Nhưng ok, cảm ơn vì đã nói với tôi :)
Visckmart
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.