Runtuh teks secara vertikal

85

Katakanlah saya memiliki teks seperti ini (setiap kata pada satu baris, tanpa spasi)

Programming
Puzzles
&
Code
Golf

Itu tidak masuk akal! Ini benar-benar menentang hukum fisika.

Tantangan Anda adalah memperbaiki situasi yang mustahil ini dan menciutkan teks seperti ini:

P
Prog
&uzz
Coderam
Golflesming

Sehingga tidak ada ruang kosong di bawah karakter apa pun kecuali karakter mempertahankan urutan vertikal mereka.

Tujuannya adalah untuk memenuhi persyaratan tetapi menggunakan byte terkecil dari kode sumber yang mungkin.

Trebuchette
sumber
12
Juga, apakah itu satu kata per baris, atau dapatkah ada spasi? Jika ada ruang, haruskah mereka runtuh, atau dapatkah ruang menanggung beban?
Glen O
53
"P Prog & uzz Coderam Golflesming", sepertinya ada kandidat baru untuk judul situs ..
jcai
1
Seseorang akan menggunakan Marbelous ( github.com/marbelous-lang/marbelous.py )?
Charlie
1
Saya memutuskan untuk menggunakan mesin fisika dan menahan 0 byte
l4m2
2
Bisakah ada spasi tambahan dalam output?
Erik the Outgolfer

Jawaban:

57

Pyth, 10 byte

jb_.T.T_.z

Cobalah online di Pyth Compiler / Executor .

Ide

Kami dapat mencapai hasil yang diinginkan dengan menerapkan empat transformasi sederhana:

  1. Membalik urutan baris:

    Golf
    Code
    &
    Puzzles
    Programming
    
  2. Alihkan baris dan kolom:

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

    Atas ini membenarkan, menciutkan kolom asli.

  3. Alihkan baris dan kolom:

    Golflesming
    Coderam
    &uzz
    Prog
    P
    
  4. Membalik urutan baris:

    P
    Prog
    &uzz
    Coderam
    Golflesming
    

Kode

        .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.
Dennis
sumber
1
Grr, tadinya pasti memposting ini :). Sebagai gantinya, pilih upvote.
Maltysen
Saya punya rencana untuk memposting sesuatu yang serupa juga ... Upvoting juga
WallyWest
Apa yang terjadi jika Anda mengubah urutan baris & kolom sebelum membalik urutan?
John Odom
1
@JohnOdom Cukup memindahkan dua kali akan memindahkan karakter ke atas alih-alih memindahkannya ke bawah. Anda dapat mulai dengan mentransposisi, saat itu Anda harus membalikkan setiap baris, yang akan menjadi satu byte lebih lama.
Dennis
Holy FoxPro, ini pintar.
workoverflow
38

Haskell, 62 byte

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

Saya sangat dewasa.

Lynn
sumber
20
+1 Karena saya jarang melihat Haskell, dan untuk buang air besar.
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)

Algoritma sekali jalan yang berulang. Kami melewati setiap baris secara berurutan, memperbarui daftar ljalur ke keluaran. Kata baru secara efektif mendorong dari bawah, menggeser semua huruf di atasnya satu spasi. Misalnya, dalam kasus uji

Programming
Puzzles
&
Code
Golf

setelah kita selesai Code, kita punya

P
Prog
&uzzram
Codelesming

dan kemudian menambahkan Golfhasil dalam

P
Prog
&uzz
Coderam
Golflesming

yang bisa kita lihat sebagai kombinasi dua potong

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

di mana potongan pertama digeser oleh golf. Kami melakukan pemindahan ini dengan salah satu zipdari daftar keluaran dengan elemen di ujung (sisi kiri) dan daftar keluaran didahului oleh garis kosong (sisi kanan), memotong setiap bagian pada panjang elemen baru.

Tampaknya lebih alami untuk beralih ke belakang, membiarkan surat-surat baru jatuh dari atas, tetapi upaya saya ternyata lebih lama.

Sebagai perbandingan, inilah pendekatan zip/ filter, dengan map(None,*x)digunakan untuk 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])
Tidak
sumber
12

CJam, 11 byte

qN/W%zzW%N*

Cobalah online di juru bahasa CJam .

Bagaimana itu bekerja

Gagasannya sama dengan jawaban Pyth saya .

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.
Dennis
sumber
7

JavaScript (ES6), 146

(2 baris baru di dalam string template signifikan dan dihitung)

Gagasan @Dennis diimplementasikan dalam JavaScript. Fungsi S panjang melakukan transposisi baris demi baris dan char oleh char, meninggalkan hasilnya dalam tarray.

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

Kurang bermain golf di dalam cuplikan (coba di 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>

edc65
sumber
Kurangi beberapa byte dengan menggantinya S(t.reverse()),t.reverse().joindengan S(R=t.reverse()),R.join.
Ismael Miguel
@ IsmaelMiguel tidak, S berubah t, jadi t setelah S tidak sama dengan t sebelum 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="")}

Ini adalah cara yang sangat panjang dan naif untuk melakukannya.

Tidak Disatukan:

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 = "")
    }
}

Anda dapat mencobanya secara online .

Alex A.
sumber
5

Matlab / Oktaf, 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))

Contoh :

Tentukan string input dalam variabel, katakanlah s. 10adalah karakter umpan baris:

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

Fungsi panggilan fdengan input s:

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

Atau coba online (terima kasih kepada @beaker untuk bantuan dengan penerjemah Oktaf online)

Luis Mendo
sumber
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`
`)

Ini dia ungolfed dan di ES5 dengan komentar yang menjelaskan cara kerjanya:

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>

George Reith
sumber
4

APL (Dyalog Extended) , 13 11 byte SBCS

-2 dengan ekstensi saya ke Dyalog APL.

Fungsi diam-diam anonim, mengambil dan mengembalikan matriks karakter.

~∘' '1⍢⍉⍢⊖

Cobalah online!

~ menghapus
 satu
' ' spasi
 dari
1 baris (lit. 1D sub-array)
 sementara
 dialihkan
 sementara
 membalik

Adm
sumber
tunggu bagaimana ini 33 byte?
Conor O'Brien
3

R, 190 178 175 Bytes

Mungkin masih ada ruang untuk bermain golf di sini. Mungkin beberapa operasi yang tidak perlu di sana

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

Tidak diikat dan dijelaskan

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

Uji Coba. Sangat menarik untuk dicatat bahwa karena cara pemindaian bekerja, seluruh kalimat dapat dimasukkan dengan spasi dan masih memberikan output seperti yang ditentukan.

> 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
>   
MickyT
sumber
3

STATA, 323 byte

Mengambil input dalam file yang disebut ab Only berfungsi hingga 24 karakter sekarang. Akan diperbarui nanti untuk membuatnya berfungsi dengan lebih banyak. Juga, tidak berfungsi di kompiler online. Membutuhkan kompiler yang tidak bebas.

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
}

Sunting: memindahkan diam-diam (untuk menekan output) ke loop itu sendiri dari setiap pernyataan dalam loop, menghemat 8 byte.

tanda
sumber
Mengapa kiriman Anda tidak valid, hanya karena memerlukan kompiler yang tidak bebas?
Dennis
@ Dennis Saya pikir telah diputuskan dalam meta bahwa bahasa pemrograman harus dapat dijalankan di beberapa lingkungan bebas. Juga, pembatasan panjang input mungkin membatalkannya.
tanda
1
Pembatasan karakter akan menjadi masalah, tetapi saya tidak mengetahui adanya konsensus meta yang memerlukan implementasi gratis. (Jika Anda mendapat ide ini dari kuis Hello World, pertanyaan itu secara eksplisit meminta bahasa gratis.)
Dennis
@Dennis, saya pikir ini adalah konsensus: meta.codegolf.stackexchange.com/questions/988/…
patok
Jawabannya menyarankan downvoting posting yang tidak dapat diuji, yang tidak benar-benar membutuhkan konsensus, dan tidak terjadi dalam praktek. Sebenarnya, jawaban Mathematica dan TI-BASIC biasanya cukup populer.
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")

Dengan baris baru dan lekukan:

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

Pemakaian:

> 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
plannapus
sumber
2

Jelly , 6 byte (tidak bersaing)

ỴṚZZṚY

Cobalah online!

Bagaimana itu bekerja

Gagasannya sama dengan jawaban Pyth saya .

ỴṚ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.
Dennis
sumber
2

Turtlèd , 72 byte, tidak bersaing

Cukup yakin saya bisa mengubah pendekatan untuk menghemat byte, tetapi nanti.

: p Esolang non-golf mengalahkan ketukan reguler: p

Hal yang aneh tentang Turtlèd adalah awalnya dibuat setelah diskusi tentang ascii art langs, tetapi sebenarnya tampaknya yang terbaik dalam tantangan semacam ini

Turtlèd tidak dapat mengambil input baris baru tetapi untuk beberapa input, dan ini hanya membutuhkan satu input: akhiri setiap kata dengan spasi, termasuk yang terakhir.

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

Cobalah online!

Penjelasan:

!                          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
Lemon dirusak
sumber
2

Perl, 133 byte

Ini adalah salah satu tantangan yang berubah di kepala saya dari menjadi terlalu keras, menjadi mudah, menjadi kode lebih banyak daripada yang saya perkirakan ... Saya tidak terlalu senang dengan pendekatan, saya yakin ada cara yang jauh lebih baik untuk mengurangi print pop@F...bit mungkin menggunakan -natau hanya regex murni, tapi saya tidak bisa sampai di sana sekarang ... Awalnya saya menggunakan say, tapi saya pikir saya harus skor yang lebih tinggi ( use 5.01) karena $'.

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

Pemakaian

Simpan sebagai vertically-collapse-text.pl.

perl vertically-collapse-text.pl <<< 'Programming
Puzzles
&
Code
Golf'
P
Prog
&uzz
Coderam
Golflesming
Dom Hastings
sumber
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.

Menerapkan gravitasi ke semua teks di konsol. Saya tidak yakin apakah ini valid, atau apakah saya harus menggunakan array string.

12Me21
sumber
1

Ruby, 99 82 byte

Hampir disana...

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

Penjelasan percobaan:

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

Jalankan seperti ini:

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

K, 30

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

.

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

Penjelasan

x@\:!|/#:'x meluas setiap string untuk membuat matriks char persegi.

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

+ mentransposinya

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} akan menghapus spasi apa pun dari string dan kemudian pad string dengan panjang aslinya

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

Terapkan fungsi itu ke masing-masing string yang dialihkan, lalu balikkan output untuk mendapatkan hasilnya

k){+{(-#x)$x@&~^x}'+x@\:!|/#:'x}("Programming";"Puzzles";,"&";"Code";"Golf")
"P          "
"Prog       "
"&uzz       "
"Coderam    "
"Golflesming"
tmartin
sumber
{+{(-#x)$x@&~^x}'+(|/#:'x)$x}untuk 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]

Benar-benar bencana. Saya hampir tidak ingat apa-apa tentang cara kerjanya.

Karena cara input pb bekerja (satu baris sekaligus), Anda harus menggunakan spasi alih-alih baris baru dalam input. Jika penerjemah bukan sampah dan Anda dapat memasukkan baris baru dalam input, satu-satunya perubahan akan menjadi [B=32]di awal menjadi[B=10] .

Saya sedang mengerjakan pembaruan ke pbi (interpreter) yang akan membersihkan visual jika Anda ingin menonton program berjalan. Masih membutuhkan banyak pekerjaan, tetapi sementara itu, Anda dapat menonton program ini di YouTube .

monmon bawah tanah
sumber
1

J, 17 byte

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

Solusi yang cukup menyenangkan.

Penjelasan:

-.&' '"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.)

Uji kasus dijelaskan

   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

Uji kasus

   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|    |    |
+-----------+----+----+
Conor O'Brien
sumber
;@;:&.(|:@|.)untuk 13
FrownyFrog
1

Sebenarnya , 13 byte

Ini menggunakan algoritma yang dijelaskan dalam jawaban Dennis 'Jelly . Input dan output adalah daftar string. Sayangnya, fungsi transpos builtin tidak bekerja dengan baik jika daftar atau string dalam tidak semua sama panjang, yang akan semacam mengalahkan titik runtuh secara vertikal di tempat pertama. Saran bermain golf diterima. Cobalah online!

R2`;i(lZ♂Σ`nR

Tidak melakukanolf

          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.
Sherlock9
sumber
1

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

Tidak Disatukan:

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

Pengujian:

(f "Programming Puzzles & Code Golf")

Keluaran:

'("P" "Prog" "&uzz" "Coderam" "Golflesming")
juga
sumber
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`
`

Berpisah pada CR, peta luar memastikan kita mengulangi waktu yang cukup untuk memungkinkan "gravitasi" untuk menjatuhkan huruf sejauh mereka perlu turun.

Peta dalam terlebih dulu memeriksa apakah ada baris berikutnya, jika demikian, dan lebih pendek, letakkan overflow ke baris berikutnya. yaitu jika baris ke-1 memiliki "ABCD" dan baris ke-2 memiliki "FG", jatuhkan "CD" dari baris ke-1 sehingga baris ke-1 menjadi "AB" dan ke-2 menjadi "FGCD".

Ketika kita melakukan ini sebanyak yang ada garis, surat-surat turun sejauh yang seharusnya, meninggalkan kita dengan hasil yang diinginkan.

Grax32
sumber
1

Japt , 8 byte

y kS ù y

Cobalah online!

Bagaimana itu bekerja

Uy kS ù y

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

Ada juga zyang memutar string 2D dengan kelipatan 90 derajat, tetapi entah bagaimana memotong string kapan height > length.

Bubbler
sumber
7 byte . Selamat datang di Japt, omong-omong (jika saya belum menyambut Anda).
Shaggy
1

05AB1E , 10 9 byte

¶¡RζðмζR»

Cobalah online.

atau dengan alternatif mulai:

.BRøðмζR»

Cobalah online.

Pendekatan yang sama seperti @ Dennis ♦ Pyth menjawab .
-1 byte berkat @Emigna mengganti ðõ:denganðм .

Penjelasan:

¶¡       # 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

Penjelasan alternatif:

.B      # Box (implicitly splits on new-lines and appends spaces)
   ø    # Zip/Transpose with equal-length items
        # Rest is the same
Kevin Cruijssen
sumber
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)}))

Saya mengambil sedikit kebebasan dalam menafsirkan pertanyaan dan berasumsi bahwa teks diwakili dalam matriks dengan satu karakter per sel, dengan demikian:

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

Jadi x menjadi:

     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 

Sekarang saya menggunakan orderdan [mengurutkan kolom sehingga NA datang pertama dan kemudian semua nilai lainnya:

     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"

Menjadi lebih lama jika diperlukan bahwa output berupa kata-kata:

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"
lebatsnok
sumber
Selamat datang (kembali) ke PPCG! Selama OP baik-baik saja dengan format Anda, Anda aman! cara yang biasa adalah menanyakannya dalam komentar untuk pertanyaan itu.
JayCe
seperti yang disebutkan dalam jawaban Anda untuk pertanyaan lain, jawaban harus fuinctions penuh atau program sehingga function(x)perlu dimasukkan dalam jumlah 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}

Versi yang bisa dibaca manusia:

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
}                            

Bagaimana itu bekerja:

  1. Ambil baris "buruk" pertama, yaitu baris yang lebih panjang dari baris berikutnya, ambil bagian "ekstra" dan tambahkan ke baris berikutnya
  2. Periksa apakah ada garis "buruk" yang tersisa, jika ya lanjutkan ke # 1

(Atau dengan kata lain, bagian "berlebihan" jatuh sampai semua yang bisa jatuh telah jatuh.)

Input: vektor karakter.

x<-readLines(textConnection("Programming\nPuzzles\n&\nCode\nGolf"))
f(x)
# [1] "P"           "Prog"        "&uzz"        "Coderam"     "Golflesming"
lebatsnok
sumber
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"))

Cobalah online!

Siaran dengan g.([w], [d d])memungkinkan saya untuk menghilangkan pernyataan peta dan menyelamatkan saya sekitar 7 byte.

niczky12
sumber