Văn bản sụp đổ theo chiều dọc


85

Nói rằng tôi có văn bản như thế này (mỗi từ trên một dòng, không có khoảng trắng)

Programming
Puzzles
&
Code
Golf

Điều đó vô nghĩa! Nó hoàn toàn bất chấp các định luật vật lý.

Thách thức của bạn là khắc phục tình trạng bất khả thi này và thu gọn văn bản như vậy:

P
Prog
&uzz
Coderam
Golflesming

Vì vậy, không có không gian trống bên dưới bất kỳ nhân vật nào ngoài các nhân vật vẫn giữ trật tự dọc của họ.

Mục tiêu là để đáp ứng các yêu cầu nhưng sử dụng ít byte mã nguồn nhất có thể.


12
Ngoài ra, nó sẽ là một từ trên mỗi dòng, hoặc có thể có khoảng trắng? Nếu có không gian, họ có nên sụp đổ, hoặc không gian có thể chịu trọng lượng?
Glen O

53
"P Prog & uzz Coderam Golflesming", có vẻ như có một ứng cử viên mới cho danh hiệu của trang web ..
jcai

1
Ai đó sẽ sử dụng Marbelous ( github.com/marbelous-lang/marbelous.py )?
Charlie

1
Tôi quyết định sử dụng một công cụ vật lý và giữ 0 byte
l4m2

2
Có thể có dấu cách trong đầu ra?
Erik the Outgolfer

Câu trả lời:


57

Bình thường, 10 byte

jb_.T.T_.z

Dùng thử trực tuyến trong Trình biên dịch / thực thi Pyth .

Ý tưởng

Chúng ta có thể đạt được đầu ra mong muốn bằng cách áp dụng bốn phép biến đổi đơn giản:

  1. Đảo ngược thứ tự của các dòng:

    Golf
    Code
    &
    Puzzles
    Programming
    
  2. Chuyển hàng và cột:

    GC&PP
    oour
    ldzo
    fezg
    lr
    ea
    sm
    m
    i
    n
    g
    

    Đầu này biện minh, thu gọn các cột ban đầu.

  3. Chuyển hàng và cột:

    Golflesming
    Coderam
    &uzz
    Prog
    P
    
  4. Đảo ngược thứ tự của các dòng:

    P
    Prog
    &uzz
    Coderam
    Golflesming
    

        .z  Read the input as a list of strings, delimited by linefeeds.
       _    Reverse the list.
   .T.T     Transpose the list twice.
  _         Reverse the list.
jb          Join its strings; separate with linefeeds.

1
Grr, sẽ đăng chính xác này :). Có một upvote thay thế.
Maltysen

Tôi cũng đã có kế hoạch đăng một cái gì đó tương tự ... Nâng cấp quá
WallyWest

Điều gì xảy ra nếu bạn hoán đổi các hàng & cột trước khi đảo ngược thứ tự?
John Odom

1
@JohnOdom Chỉ cần hoán đổi hai lần sẽ di chuyển các ký tự lên trên cùng thay vì di chuyển chúng xuống dưới cùng. Bạn có thể bắt đầu bằng cách hoán vị, sau đó bạn sẽ phải đảo ngược từng hàng, sẽ dài hơn một byte.
Dennis

Holy FoxPro, điều này thật thông minh.
workoverflow

38

Haskell, 62 byte

import Data.List
p=reverse;o=transpose
f=unlines.p.o.o.p.lines

Tôi rất trưởng thành.


20
+1 Bởi vì tôi hiếm khi nhìn thấy Haskell và cho các dòng pooping.
Carcigenicate

17

Python 2, 104 byte

l=[]
for x in input().split('\n'):n=len(x);l=[a[:n]+b[n:]for a,b in zip(l+[x],['']+l)]
print'\n'.join(l)

Một thuật toán một lần lặp. Chúng tôi đi qua từng dòng theo thứ tự, cập nhật danh sách lcác dòng thành đầu ra. Từ mới đẩy hiệu quả từ dưới lên, dịch chuyển tất cả các chữ cái lên trên một khoảng trắng. Ví dụ, trong trường hợp thử nghiệm

Programming
Puzzles
&
Code
Golf

sau khi chúng tôi hoàn thành Code, chúng tôi có

P
Prog
&uzzram
Codelesming

và sau đó thêm Golfkết quả vào

P
Prog
&uzz
Coderam
Golflesming

mà chúng ta có thể xem là sự kết hợp của hai mảnh

P     |
Prog  |
&uzz  |
Code  | ram
Golf  | lesming

nơi mảnh đầu tiên đã được chuyển lên bởi golf. Chúng tôi thực hiện dịch chuyển này với một ziptrong danh sách đầu ra với phần tử ở cuối (bên trái) và ưu tiên danh sách đầu ra bằng một dòng trống (bên phải), cắt từng phần ở độ dài của phần tử mới.

Nó có vẻ tự nhiên hơn thay vì lặp đi lặp lại, để cho các chữ cái mới rơi từ trên xuống, nhưng nỗ lực của tôi ở đó bật ra lâu hơn.

Để so sánh, đây là zip/ filtercách tiếp cận, map(None,*x)được sử dụng cho iziplongest(109 byte):

f=lambda z:[''.join(filter(None,x))for x in map(None,*z)]
lambda x:'\n'.join(f(f(x.split('\n')[::-1]))[::-1])

12

CJam, 11 byte

qN/W%zzW%N*

Hãy thử trực tuyến trong trình thông dịch CJam .

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

Ý tưởng giống như trong câu trả lời Pyth của tôi .

q           e# Read from STDIN.
 N/         e# Split at linefeeds.
   W%       e# Reverse the resulting array.
     zz     e# Transpose it twice.
       W%   e# Reverse the resulting array.
         N* e# Join its strings; separate with linefeeds.

7

JavaScript (ES6), 146

(2 dòng mới bên trong chuỗi mẫu có ý nghĩa và được tính)

Ý tưởng của @Dennis được triển khai trong JavaScript. Hàm S dài thực hiện chuyển vị theo dòng và char theo char, để lại kết quả trong tmảng.

a=>(S=z=>{for(t=[];z.join``;t.push(w))for(w='',n=z.length;n--;z[n]=z[n].slice(1))w+=z[n][0]||''},S(a.split`
`),S(t.reverse()),t.reverse().join`
`)

Ít chơi gôn hơn trong đoạn trích (thử trong Firefox)

F=a=>(
  S=z=>{
    for(t=[];z.join``;t.push(w))
      for(w='',n=z.length;n--;z[n]=z[n].slice(1))
        w+=z[n][0]||''
  },
  S(a.split`\n`),
  S(t.reverse()),
  t.reverse().join`\n`
)
#I,#O { margin:0; width: 200px; height:100px; border: 1px solid #ccc }
<table><tr><td>
Input<br><textarea id=I>Programming
Puzzles
&
Code
Golf
</textarea></td><td>
Output<pre id=O></pre>
</td></tr></table>  
<button onclick='O.innerHTML=F(I.value)'>go</button>


Giảm một vài byte bằng cách thay thế S(t.reverse()),t.reverse().joinbằng S(R=t.reverse()),R.join.
Ismael Miguel

@IsmaelMiguel no, S thay đổi t, vì vậy t sau S không giống với t trước S
edc65

5

R, 223 byte

function(x){a=apply(do.call(rbind,lapply(p<-strsplit(strsplit(x,"\n")[[1]],""),function(x)c(x,rep(" ",max(lengths(p))-length(x))))),2,function(x)c(x[x==" "],x[x!=" "]));for(i in 1:nrow(a))cat(a[i,][a[i,]!=" "],"\n",sep="")}

Đây là một cách dài vô lý, ngây thơ để làm điều đó.

Ung dung:

f <- function(x) {
    # Start by spliting the input into a vector on newlines
    s <- strsplit(x, "\n")[[1]]

    # Create a list consisting of each element of the vector
    # split into a vector of single characters
    p <- strsplit(s, "")

    # Pad each vector in p to the same length with spaces
    p <- lapply(p, function(x) c(x, rep(" ", max(lengths(p)) - length(x))))

    # Now that the list has nice dimensions, turn it into a matrix
    d <- do.call(rbind, p)

    # Move the spaces to the top in each column of d
    a <- apply(d, 2, function(x) c(x[x == " "], x[x != " "]))

    # Print each row, omitting trailing whitespace
    for (i in 1:nrow(a)) {
        cat(a[i, ][a[i, ] != " "], "\n", sep = "")
    }
}

Bạn có thể thử nó trực tuyến .


5

Matlab / Octave, 99 byte

function f(s)
c=char(strsplit(s,[10 '']));[~,i]=sort(c>32);[m,n]=size(c);c(i+repmat((0:n-1)*m,m,1))

Ví dụ :

Xác định một chuỗi đầu vào trong một biến, nói s. 10là ký tự nguồn cấp dữ liệu:

>> s = ['Programming' 10 'Puzzles' 10 '&' 10 'Code' 10 'Golf'];

Chức năng gọi fvới đầu vào s:

>> f(s)
ans =
P          
Prog       
&uzz       
Coderam    
Golflesming

Hoặc dùng thử trực tuyến (cảm ơn @beaker để được trợ giúp với trình thông dịch Octave trực tuyến)


4

JavaScript ES6, 119 byte

F=s=>(C=o=>--a.length?C(a.reduce((p,c,i)=>c+p.slice((a[i-1]=p.slice(0,c.length)).length)))+`
`+o:o)(a=(s+`
`).split`
`)

Ở đây, nó không được cung cấp và trong ES5 với các bình luận giải thích cách thức hoạt động của nó:

function F(s) {
  var arr = (s+'\n').split('\n'); // Create an array of words and append an empty member
  return (function C(output) {
    return --arr.length ? // Remove the last item from the array
      C(arr.reduce(function(p,c,i) { // If the array still has length reduce it to a string and recurse
        var intersection = (arr[i-1] = p.slice(0, c.length)) // Overwrite the previous word with the part that intersects the current word
        return c + p.slice(intersection.length) // Add the part of the previous word that doesn't intersect to the current value
      })) + '\n' + output : output // Add the last level of recursions output on to the end of this
  })(arr);
}

input.addEventListener('input', updateOutput, false);

function updateOutput() {
  var oldLength = input.value.length;
  var start = this.selectionStart;
  var end = this.selectionEnd;
  input.value = input.value.split(/ +/).join('\n');
  var newLength = input.value.length;
  input.setSelectionRange(start, end + (newLength - oldLength));
  output.value = F(input.value).trim();
}

updateOutput();
textarea {
  width: 50%;
  box-sizing: border-box;
  resize: none;
  float: left;
  height: 10em;
}

label {
  width: 50%;
  float: left;
}
<p>Type in the input box below, spaces are automatically converted to newlines and the output updates as you type</p>
<label for="input">Input</label>
<label for="output">Output</label>
<textarea id="input">
Type inside me :)
</textarea>
<textarea id="output" disabled>
</textarea>



3

R 190 178 175 byte

Có lẽ vẫn còn một số phòng để chơi golf trong này. Có lẽ một vài hoạt động không cần thiết trong đó

l=lapply;s=substring;C=rbind;d=do.call;cat(C(d(C,l(apply(d(C,l(a<-scan(,''),s,1:(w=max(nchar(a))),1:w))[(h=length(a)):1,],2,paste0,collapse=''),s,1:h,1:h))[,h:1],'\n'),sep='')

Ung dung và giải thích

a<-scan(,'')    # get STDIN
h<-length(a)    # number of lines
w=max(nchar(a)) # length of longest line
M<-lapply(a,substring,1:w,1:w)   # create a list of split strings with empty chars
M<-do.call(rbind,M)[h:1,]        # turn it into a matrix with line order reversed
M<-apply(M,1,paste0,collapse='') # paste together the columns
M<-lapply(M,substring,1:h,1:h)   # split them back up
M<-do.call(rbind,M)[,h:1]        # reform a matrix
M<-rbind(M,'\n')                 # add some carriage returns
cat(M,sep='')   # output with seperators

Chạy thử nghiệm. Thật thú vị khi lưu ý rằng do cách quét hoạt động, toàn bộ câu có thể được nhập bằng dấu cách và vẫn cho đầu ra như được chỉ định.

> l=lapply;s=substring;C=rbind;d=do.call;cat(C(d(C,l(apply(d(C,l(a<-scan(,''),s,1:(w=max(nchar(a))),1:w))[(h=length(a)):1,],2,paste0,collapse=''),s,1:h,1:h))[,h:1],'\n'),sep='')
1: Programming
2: Puzzles
3: &
4:     Code
5: Golf
6: 
Read 5 items
P
Prog
&uzz
Coderam
Golflesming
> l=lapply;s=substring;C=rbind;d=do.call;cat(C(d(C,l(apply(d(C,l(a<-scan(,''),s,1:(w=max(nchar(a))),1:w))[(h=length(a)):1,],2,paste0,collapse=''),s,1:h,1:h))[,h:1],'\n'),sep='')
1: Programming Puzzles & Code Golf beta
7: 
Read 6 items
P
Prog
&uzz
Code
Golfram
betalesming
>   

3

STATA, 323 byte

Đưa đầu vào trong một tệp gọi là ab Chỉ hoạt động tối đa 24 ký tự. Sẽ cập nhật sau để làm cho nó hoạt động với nhiều hơn. Ngoài ra, không hoạt động trong trình biên dịch trực tuyến. Yêu cầu trình biên dịch không miễn phí.

gl l=24/
forv x=1/$l{
gl a="$a str a`x' `x'"
}
infix $a using a.b
gl b=_N
forv k=1/$l{
gen b`k'=0
qui forv i=$b(-1)1{
forv j=`i'/$b{
replace b`k'=1 if _n==`j'&a`k'==""
replace a`k'=a`k'[_n-1] if _n==`j'&a`k'==""
replace a`k'="" if _n==`j'-1&b`k'[_n+1]==1
replace b`k'=0
}
}
}
forv i=1/$b{
forv k=1/$l{
di a`k'[`i'] _c
}
di
}

Chỉnh sửa: di chuyển lặng lẽ (để chặn đầu ra) sang chính vòng lặp từ mỗi câu lệnh trong vòng lặp, tiết kiệm 8 byte.


Tại sao bài nộp của bạn không hợp lệ, chỉ vì nó yêu cầu trình biên dịch không miễn phí?
Dennis

@Dennis Tôi nghĩ rằng đã được quyết định trong meta rằng các ngôn ngữ lập trình phải có thể chạy được trong một số môi trường miễn phí. Ngoài ra, các hạn chế về độ dài đầu vào có thể làm mất hiệu lực nó.
đánh dấu

1
Hạn chế về ký tự sẽ là một vấn đề, nhưng tôi không biết về bất kỳ sự đồng thuận meta nào đòi hỏi phải thực hiện miễn phí. (Nếu bạn có ý tưởng này từ bài kiểm tra Hello World, câu hỏi đó rõ ràng yêu cầu ngôn ngữ miễn phí.)
Dennis

@Dennis Tôi cho rằng đây là một sự đồng thuận: meta.codegolf.stackexchange.com/questions/988/ Ấn
đánh dấu

Câu trả lời cho thấy việc bỏ qua các bài viết không thể kiểm chứng, điều này không thực sự đòi hỏi sự đồng thuận và không xảy ra trong thực tế. Trên thực tế, các câu trả lời Mathicala và TI-BASIC thường khá phổ biến.
Dennis

2

R, 171 byte

S=scan(,"");while(any((D<-diff(N<-sapply(S,nchar)))<0)){n=max(which(D<0));S[n+1]=paste0(S[n+1],substr(S[n],N[n]+D[n]+1,N[n]));S[n]=substr(S[n],1,N[n]+D[n])};cat(S,sep="\n")

Với dòng mới và thụt lề:

S=scan(,"") #Takes input from stdin
while(any((D<-diff(N<-sapply(S,nchar)))<0)){
    n=max(which(D<0))
    S[n+1]=paste0(S[n+1],substr(S[n],N[n]+D[n]+1,N[n]))
    S[n]=substr(S[n],1,N[n]+D[n])
}
cat(S,sep="\n")

Sử dụng:

> S=scan(,"");while(any((D<-diff(N<-sapply(S,nchar)))<0)){n=max(which(D<0));S[n+1]=paste0(S[n+1],substr(S[n],N[n]+D[n]+1,N[n]));S[n]=substr(S[n],1,N[n]+D[n])};cat(S,sep="\n")
1: Programming
2: Puzzles
3: &
4: Code
5: Golf
6: 
Read 5 items
P
Prog
&uzz
Coderam
Golflesming

2

Jelly , 6 byte (không cạnh tranh)

ỴṚZZṚY

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

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

Ý tưởng giống như trong câu trả lời Pyth của tôi .

ỴṚZZṚY  Main link. Argument: s (string)

Ỵ       Split at linefeeds.
 Ṛ      Reverse the order of the lines.
  ZZ    Zip/transpose twice.
    Ṛ   Reverse the order of the lines.
     Y  Join, separating by linefeeds.

2

Turtlèd , 72 byte, không

Khá chắc chắn rằng tôi có thể thay đổi cách tiếp cận để lưu byte, nhưng sau đó.

: p Non-golf esolang đánh bại langs thường xuyên: p

Điều kỳ lạ về Turtlèd là ban đầu nó được tạo ra sau khi thảo luận về lang nghệ thuật ascii, nhưng nó thực sự có vẻ là tốt nhất trong các loại thử thách này

Turtlèd không thể nhận đầu vào dòng mới nhưng cho nhiều đầu vào và điều này chỉ mất một đầu vào: chấm dứt mỗi từ bằng một khoảng trắng, bao gồm cả đầu vào cuối cùng.

!l[*,+r_][ l]ur[*,[ -.]+.[ r{ d}u+.]-.[ -.]{ l}[ l]r[ u]_]' d[ d]u[ ' r]

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

Giải trình:

!                          Take string input
 l                         Move left, off the asterisk at the start of grid
  [*    ]                  Until cell is *
    ,+r_       write *, string pointer+=1, move right, write * if pointed char is last char
         [ l]ur    move left until finding a space, move up and right
               [*                                        ]     Until cell is *
                 ,                               write *
                  [   ]             until cell is [space]
                    -.               decrement string pointer, write pointed char
                       +.           increment and write string pointer
                         [         ] until cell is [space]
                           r{ d}     move right, move down until finding nonspace
                                u+.  move up, string pointer+=1 and write pointed char
                                    -.      decrement string pointer and write pointed char
                                      [   ]  until cell is [space]
                                        -.  string pointer-=1 and write pointed char
                                           { l}   move left until finding nonspace
                                               [ l]   move left until finding space
                                                   r   move right
                                                    [ u]  move up until finding space
                                                        _  write * if pointed char is last char
                                                          (if it is written, loop ends)

                                                          ' d[ d]u[ ' r] just cleanup

2

Perl, 133 byte

Đây là một trong những thử thách đã thay đổi trong đầu tôi từ quá khó, trở nên dễ dàng, trở nên nhiều mã hơn tôi dự đoán ... Tôi không đặc biệt hài lòng với cách tiếp cận, tôi chắc chắn có một Cách tốt hơn nhiều để giảm print pop@F...bit có thể sử dụng -nhoặc chỉ là regex thuần túy, nhưng tôi không thể đến đó ngay bây giờ ... Ban đầu tôi đang sử dụng say, nhưng tôi nghĩ rằng tôi phải đạt điểm cao hơn ( use 5.01) vì $'.

@F=(/.+/g,@F)for<>;$_%=$#F,($x=length$F[$_++])<length$F[$_]&&($F[$_]=~/.{$x}/,$F[$_-1].=$',$F[$_]=$&)for 0..1e2;print pop@F,$/while@F

Sử dụng

Lưu như vertically-collapse-text.pl.

perl vertically-collapse-text.pl <<< 'Programming
Puzzles
&
Code
Golf'
P
Prog
&uzz
Coderam
Golflesming

2

SmileBASIC, 90 byte

X=RND(50)Y=RND(20)G=CHKCHR(X,Y+1)<33LOCATE X,Y+G?CHR$(CHKCHR(X,Y));
LOCATE X,Y?" "*G
EXEC.

Áp dụng trọng lực cho tất cả các văn bản trong bảng điều khiển. Tôi không chắc chắn nếu điều này là hợp lệ, hoặc nếu tôi phải sử dụng một chuỗi chuỗi.


1

Ruby, 99 82 byte

Đến đó ...

f=->a,i=-1{a.map{|l|i+=1;(0...l.size).map{|c|a.map{|x|x[c]}.join[~i]}*''}.reverse}

Một lời giải thích đã cố gắng:

f=->a,i=-1{a.map{|l|i+=1; # For each line `l` with index `i` in string array `a`
(0...l.size).map{|c|        # For each column `c` in `l`
a.map{|x|x[c]}.join           # Make a string of non-nil characters `c` across `a`...
[~i]                          # ...and grap the `i`th character *from the end*, if any
}*''}.reverse}              # Join the characters grabbed from each column and reverse the result

Chạy nó như thế này:

a = %w[
  Programming
  Puzzles
  &
  Code
  Golf
]
puts f[a]

1

K, 30

{+{(-#x)$x@&~^x}'+x@\:!|/#:'x}

.

k){+{(-#x)$x@&~^x}'+x@\:!|/#:'x}("Programming";"Puzzles";,"&";"Code";"Golf")
"P          "
"Prog       "
"&uzz       "
"Coderam    "
"Golflesming"

Giải trình

x@\:!|/#:'x mở rộng mỗi chuỗi để tạo một ma trận char vuông.

k){x@\:!|/#:'x}("Programming";"Puzzles";,"&";"Code";"Golf")
"Programming"
"Puzzles    "
"&          "
"Code       "
"Golf       "

+ hoán chuyển nó

k){+x@\:!|/#:'x}("Programming";"Puzzles";,"&";"Code";"Golf")
"PP&CG"
"ru oo"
"oz dl"
"gz ef"
"rl   "
"ae   "
"ms   "
"m    "
"i    "
"n    "
"g    "

{(-#x)$x@&~^x} sẽ xóa bất kỳ khoảng trắng nào khỏi chuỗi và sau đó đệm chuỗi theo độ dài ban đầu của chuỗi

k){(-#x)$x@&~^x}"a  b  c   de  f"
"         abcdef"

Áp dụng hàm đó cho từng chuỗi được chuyển đổi, sau đó lật đầu ra để có kết quả

k){+{(-#x)$x@&~^x}'+x@\:!|/#:'x}("Programming";"Puzzles";,"&";"Code";"Golf")
"P          "
"Prog       "
"&uzz       "
"Coderam    "
"Golflesming"

{+{(-#x)$x@&~^x}'+(|/#:'x)$x}cho 29.
streetster

1

pb - 310 byte

^w[B!0]{w[B=32]{vb[1]^b[0]}>}b[1]vb[1]>b[2]<[X]w[B!2]{t[T+B]b[0]>}b[0]v[T]w[X!-1]{b[1]<}b[1]vb[1]w[B!0]{w[B!0]{^w[B!0]{>}<<<<^[Y+1]w[B!0]{<}>t[B]b[0]w[B!1]{v}v<[X]w[B!0]{>}b[T]}b[0]vb[1]^w[X!0]{<vb[1]^t[B]b[0]^w[B!0]{^}b[T]w[B!0]{v}}vw[B!0]{^^w[B!0]{>}<b[0]vvw[B=0]{<}b[0]<[X]}^^>w[B=0]{vb[1]}v<<}>>^b[0]^<b[0]

Thật là một thảm họa. Tôi hầu như không nhớ bất cứ điều gì về cách nó hoạt động.

Do cách thức hoạt động của đầu vào của pb (một dòng duy nhất cùng một lúc), bạn phải sử dụng khoảng trắng thay vì dòng mới trong đầu vào. Nếu trình thông dịch không phải là rác và bạn có thể bao gồm các dòng mới trong đầu vào, thay đổi duy nhất sẽ là [B=32]lúc bắt đầu trở thành[B=10] .

Tôi đang làm việc với một bản cập nhật cho pbi (trình thông dịch) sẽ dọn sạch hình ảnh nếu bạn muốn xem chương trình chạy. Nó vẫn cần rất nhiều công việc nhưng trong thời gian đó, bạn có thể xem chương trình này trên YouTube .


1

J, 17 byte

-.&' '"1&.(|:@|.)

Giải pháp khá dễ chịu.

Giải trình:

-.&' '"1&.(|:@|.)  input: list of strings y
              |.   reverse lines
           |:@     then transpose
-.&' '"1           remove blanks from columns
        &.         and undo the inside
           |:@|.   (that is, transpose and reverse again.)

Trường hợp kiểm tra giải thích

   s
Programming
Puzzles
&
Code
Golf
   |.s
Golf
Code
&
Puzzles
Programming
   |:|.s
GC&PP
oo ur
ld zo
fe zg
   lr
   ea
   sm
    m
    i
    n
    g
   -.&' '"1|:|.s
GC&PP
oour
ldzo
fezg
lr
ea
sm
m
i
n
g
   |.-.&' '"1|:|.s
g
n
i
m
sm
ea
lr
fezg
ldzo
oour
GC&PP
   |.|:-.&' '"1|:|.s
P
Prog
&uzz
Coderam
Golflesming
   (-.&' '"1)&.(|:@|.)s
P
Prog
&uzz
Coderam
Golflesming
   -.&' '"1&.(|:@|.)s
P
Prog
&uzz
Coderam
Golflesming

Các trường hợp thử nghiệm

   f =: -.&' '"1&.(|:@|.)
   f
-.&' '"1&.(|:@|.)
   f >'Programming';'Puzzles';'&';'Code';'Golf'
P
Prog
&uzz
Coderam
Golflesming
   g =: [: > [: <;._1 '|'&,
   g 'Programming|Puzzles|&|Code|Golf'
Programming
Puzzles
&
Code
Golf
   f g 'Programming|Puzzles|&|Code|Golf'
P
Prog
&uzz
Coderam
Golflesming
   F =: f @ g
   F &. > 'Programming|Puzzles|&|Code|Golf' ; '1|23|456|7890' ; '1234|567|89|0'
+-----------+----+----+
|P          |1   |1   |
|Prog       |23  |52  |
|&uzz       |456 |863 |
|Coderam    |7890|0974|
|Golflesming|    |    |
+-----------+----+----+

;@;:&.(|:@|.)cho 13
FrownyFrog

1

Thực ra , 13 byte

Điều này sử dụng thuật toán được mô tả trong câu trả lời Dennis 'Jelly . Đầu vào và đầu ra là cả hai danh sách các chuỗi. Thật không may, hàm chuyển đổi dựng sẵn không hoạt động tốt nếu các danh sách hoặc chuỗi bên trong không có cùng độ dài, điều này sẽ đánh bại điểm sụp đổ theo chiều dọc ở vị trí đầu tiên. Gợi ý chơi golf chào mừng. Hãy thử trực tuyến!

R2`;i(lZ♂Σ`nR

Ungolfing

          Implicit input s.
R         Reverse s.
2`...`n   Run the following function twice.
  ;i        Duplicate and flatten onto the stack.
  (l        Get the number of strings in the list.
  Z         Zip len strings together, which results in a list of lists of characters.
  ♂Σ        Sum each list of characters, which essentially joins them together.
           This function essentially transposes
R         Reverse the result.
          Implicit return.

1

Vợt 312 byte

(let((lr list-ref)(ls list-set)(sl string-length)(ss substring)(l(string-split s)))(let p((ch #f))
(for((i(-(length l)1)))(define s(lr l i))(define r(lr l(+ 1 i)))(define n(sl s))(define m(sl r))
(when(> n m)(set! l(ls l i(ss s 0 m)))(set! l(ls l(+ 1 i)(string-append r(ss s m n))))(set! ch #t)))(if ch(p #f)l)))

Ung dung:

(define (f s)
  (let ((lr list-ref)
        (ls list-set)
        (sl string-length)
        (ss substring)
        (l (string-split s)))
    (let loop ((changed #f))
      (for ((i (sub1 (length l))))
        (define s (lr l i))
        (define r (lr l (add1 i)))
        (define n (sl s))
        (define m (sl r))
        (when (> n m)
          (set! l (ls l i (ss s 0 m)))
          (set! l (ls l (add1 i)(string-append r (ss s m n))))
          (set! changed #t)))
      (if changed (loop #f)
          l))))

Kiểm tra:

(f "Programming Puzzles & Code Golf")

Đầu ra:

'("P" "Prog" "&uzz" "Coderam" "Golflesming")

1

JavaScript (ES6), 103 byte

v=>(v=v.split`
`).map(_=>v=v.map((x,i)=>v[++i]?x.slice(0,n=v[i].length,v[i]+=x.slice(n)):x))&&v.join`
`

Tách trên CR, bản đồ bên ngoài đảm bảo chúng ta lặp đủ số lần để cho phép "trọng lực" thả các chữ cái đến mức chúng cần thả.

Bản đồ bên trong trước tiên kiểm tra xem có dòng tiếp theo không, nếu có, và nó ngắn hơn, thả phần tràn sang dòng tiếp theo. tức là nếu dòng thứ 1 có "ABCD" và dòng thứ 2 có "FG", hãy thả "CD" từ dòng thứ 1 xuống dòng thứ 2 để dòng thứ 1 trở thành "AB" và dòng thứ 2 trở thành "FGCD".

Khi chúng ta làm điều này nhiều lần khi có các dòng, các chữ cái sẽ giảm xuống hết mức có thể, để lại cho chúng ta kết quả mong muốn.


1

Japt , 8 byte

y kS ù y

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

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

Uy kS ù y

Uy  Transpose at newline
kS  Replace spaces with nothing
ù   Left-pad to fit the longest line
y   Transpose at newline

Cũng có thể zxoay chuỗi 2D bằng bội số 90 độ, nhưng bằng cách nào đó nó cắt ngắn chuỗi khi height > length.


7 byte . Nhân tiện, chào mừng bạn đến với Japt (nếu tôi chưa chào đón bạn).
Xù xì

1

05AB1E , 10 9 byte

¶¡RζðмζR»

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

hoặc bắt đầu thay thế:

.BRøðмζR»

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

Cách tiếp cận tương tự như câu trả lời Pyth của @ Dennis ♦ .
-1 byte nhờ @Emigna thay thế ðõ:bằngðм .

Giải trình:

¶¡       # Split on new-lines
  R      # Reverse the list
   ζ     # Zip/Transpose with unequal-length items (with space filler by default)
ðм       # Remove all spaces
  ζ      # Zip/Transpose unequal-length items (with space filler) again
   R     # Reverse the list again
    »    # Join the list by newlines, and output implicitly

Giải thích thay thế:

.B      # Box (implicitly splits on new-lines and appends spaces)
   ø    # Zip/Transpose with equal-length items
        # Rest is the same

1

R, s81 52 byte

function(x)apply(x,2,function(.).[order(!is.na(.))])

#old,longer version did the same but less efficiently
#function(x)apply(x,2,function(x){n<-na.omit(x);c(rep("",length(x)-length(n)),n)}))

Tôi đã có một chút tự do trong việc giải thích câu hỏi và cho rằng văn bản được thể hiện trong một ma trận với một ký tự cho mỗi ô, do đó:

x <- as.matrix(read.fwf(textConnection("Programming
Puzzles
&
Code
Golf"), widths=rep(1, 11)))

Vì vậy, x trở thành:

     V1  V2  V3  V4  V5  V6  V7  V8  V9  V10 V11
[1,] "P" "r" "o" "g" "r" "a" "m" "m" "i" "n" "g"
[2,] "P" "u" "z" "z" "l" "e" "s" NA  NA  NA  NA 
[3,] "&" NA  NA  NA  NA  NA  NA  NA  NA  NA  NA 
[4,] "C" "o" "d" "e" NA  NA  NA  NA  NA  NA  NA 
[5,] "G" "o" "l" "f" NA  NA  NA  NA  NA  NA  NA 

Bây giờ tôi sử dụng order[sắp xếp các cột sao cho NA đến trước và sau đó là tất cả các giá trị khác:

     V1  V2  V3  V4  V5  V6  V7  V8  V9  V10 V11
[1,] "P" NA  NA  NA  NA  NA  NA  NA  NA  NA  NA 
[2,] "P" "r" "o" "g" NA  NA  NA  NA  NA  NA  NA 
[3,] "&" "u" "z" "z" NA  NA  NA  NA  NA  NA  NA 
[4,] "C" "o" "d" "e" "r" "a" "m" NA  NA  NA  NA 
[5,] "G" "o" "l" "f" "l" "e" "s" "m" "i" "n" "g"

Nó trở nên dài hơn nếu yêu cầu đầu ra là từ:

s <- (function(x)apply(x,2,function(.).[order(!is.na(.))]))(x)
s[is.na(s)]<-""
apply(s, 1, paste, collapse="")
# [1] "P"           "Prog"        "&uzz"        "Coderam"     "Golflesming"

Chào mừng (trở lại) đến PPCG! Miễn là OP ổn với định dạng của bạn, bạn sẽ an toàn! cách thông thường là hỏi nó trong một bình luận cho câu hỏi.
JayCe

như đã đề cập trong câu trả lời của bạn cho một câu hỏi khác, các câu trả lời cần phải là các chương trình hoặc chương trình đầy đủ vì vậy function(x)cần phải được đưa vào số byte.
JayCe

1

R, 196 189 170 byte

function(x){l=nchar;o=function(y)which(diff(l(y))<0)[1];d=function(x,i)"[<-"(x,i:(j<-i+1),c(a<-substr(x[i],1,l(x[j])),sub(a,x[j],x[i])));while(!is.na(o(x)))x=d(x,o(x));x}

Một phiên bản có thể đọc được của con người:

f<-function(x){
  l=nchar;

  # find the first line in x that is longer than the next line
  # if no such line exists o(x) will be NA
  o = function(y) which(diff(l(y))<0)[1]

  # d(x,i) --> clips the line i in x, adding the remainder to x[i+1]
  d = function(x,i) "[<-"(x,i:(j<-i+1),
        c(a<-substr(x[i],1,l(x[j])), sub(a,x[j],x[i])))
         # a --> clipped x[i],      sub(a,x[j],x[i]) --> expanded x[j]

  while(!is.na(o(x)))x=d(x,o(x));x
}                            

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

  1. Lấy dòng "xấu" đầu tiên, nghĩa là dòng dài hơn dòng tiếp theo, lấy phần "phụ" và thêm nó vào dòng tiếp theo
  2. Kiểm tra xem có còn dòng "xấu" nào không, nếu có, hãy chuyển đến # 1

(Hay nói cách khác, các phần "không cần thiết" rơi xuống cho đến khi mọi thứ có thể rơi xuống đã rơi xuống.)

Đầu vào: một vectơ ký tự.

x<-readLines(textConnection("Programming\nPuzzles\n&\nCode\nGolf"))
f(x)
# [1] "P"           "Prog"        "&uzz"        "Coderam"     "Golflesming"

0

Julia 0,6 , 141 byte

l=length
g(z,i)=(n=z[i];m=z[i+1];(N,M)=l.([n,m]);z[i:i+1]=[n[1:min(N,M)],m*n[M+1:N]])
f(s,w=split(s),d=1:l(w)-1)=(g.([w],[d d]);join(w,"\n"))

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

Phát sóng với g.([w], [d d])cho phép tôi thoát khỏi mọi tuyên bố bản đồ và tiết kiệm cho tôi khoảng 7 byte.

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.