テキストを垂直方向に折りたたむ


85

次のようなテキストがあるとしましょう(各単語は1行で、スペースなしで)

Programming
Puzzles
&
Code
Golf

それは意味がありません!それは物理学の法則を完全に無視します。

あなたの挑戦は、この不可能な状況を改善し、次のようにテキストを崩壊させることです。

P
Prog
&uzz
Coderam
Golflesming

そのため、文字の下に空のスペースはありませんが、文字は垂直方向を維持します。

目標は、要件を満たしながら、可能な限り少ないバイト数のソースコードを使用することです。


12
また、行ごとに1語になりますか、それともスペースがありますか?スペースがある場合、それらは崩壊する必要がありますか、またはスペースは重量を支えることができますか?
グレンO

53
「P Prog&uzz Coderam Golflesming」、サイトのタイトルの新しい候補があるように聞こえます
。– jcai

1
誰かがMarbelous(github.com/marbelous-lang/marbelous.py)を使用しますか?
チャーリー

1
物理エンジンを使用し、0バイトを保持することにしました
l4m2

2
出力に末尾のスペースを含めることはできますか?
エリックアウトゴルファー

回答:


57

Pyth、10バイト

jb_.T.T_.z

Pyth Compiler / Executorでオンラインで試してください。

アイデア

4つの単純な変換を適用することにより、目的の出力を実現できます。

  1. 行の順序を逆にします。

    Golf
    Code
    &
    Puzzles
    Programming
    
  2. 行と列を転置する:

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

    これにより、元の列が折りたたまれます。

  3. 行と列を転置する:

    Golflesming
    Coderam
    &uzz
    Prog
    P
    
  4. 行の順序を逆にします。

    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、まさにこれを投稿するつもりでした:)。代わりに賛成票を持っています。
マルティセン

私も似たようなものを投稿する計画がありました...あまりにも
投票-WallyWest

順序を逆にする前に行と列を入れ替えるとどうなりますか?
ジョン・オドム

1
@JohnOdom単純に2回転置すると、文字が下に移動する代わりに上に移動します。転置から始めて、それまでに1行長くなる各行を逆にする必要があります。
デニス

神聖なFoxPro、これは巧妙でした。
ワークフロー

38

Haskell、62バイト

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

私はとても成熟しています。


20
+1 Haskellを見ることがめったにないので、行をうんちするために。
発癌性

17

Python 2、104バイト

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)

反復ワンパスアルゴリズム。各行を順番に処理して、l出力する行のリストを更新します。新しい単語は下から効果的にプッシュされ、その上のすべての文字が1スペース移動します。たとえば、テストケースでは

Programming
Puzzles
&
Code
Golf

まで行った後Code

P
Prog
&uzzram
Codelesming

そして、Golf結果を追加します

P
Prog
&uzz
Coderam
Golflesming

これは2つのピースの組み合わせとして見ることができます

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

どこ最初のピースがでシフトアップしましたgolf。このシフトはzip、要素を最後に持つ出力リスト(左側)で実行し、出力リストの優先順位を空白行(右側)にして、各要素を新しい要素の長さで切り取ります。

代わりに逆方向に繰り返して新しい文字を先頭から落とす方が自然に思えるかもしれませんが、その試みはより長くなりました。

比較のために、(109バイト)で使用されるzip/ filterアプローチを示します。map(None,*x)iziplongest

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バイト

qN/W%zzW%N*

CJamインタープリターでオンラインで試してください。

使い方

私のPythの答えと同じアイデア。

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つの改行は重要であり、カウントされます)

JavaScriptに実装された@Dennisのアイデア。長いS関数は、行ごとに転置を行い、charごとに転置を行い、結果をt配列に残します。

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

スニペット内でのゴルフが少ない(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>


に置き換えS(t.reverse()),t.reverse().joinて、数バイトを減らしますS(R=t.reverse()),R.join
イスマエルミゲル

@IsmaelMiguelいいえ、Sはtを変更するため、Sの後のtはSの前のtと同じではありません
edc65

5

R、223バイト

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

これは、とてつもなく長い、ナイーブな方法です。

ゴルフをしていない:

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

オンラインで試すことができます


5

Matlab / Octave、99バイト

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

たとえば、変数に入力文字列を定義しますs10改行文字です:

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

f入力で関数を呼び出すs

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

または、オンラインで試してください(オンラインのOctaveインタープリターのサポートについて@beakerに感謝します)


4

JavaScript ES6、119バイト

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

ここでは、ES5で未使用であり、どのように機能するかを説明するコメントが付いています。

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バイト

おそらくこれでまだゴルフのためのいくつかの部屋。おそらくそこにいくつかの不必要な操作

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

非ゴルフと説明

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

テスト走行。スキャンの仕組みにより、文全体をスペースで入力し、指定どおりに出力することができることに注意してください。

> 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バイト

abと呼ばれるファイルに入力を取ります。最大24文字まで機能します。後で更新して、より多くの機能で動作するようにします。また、オンラインコンパイラでは機能しません。non-freeコンパイラーが必要です。

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
}

編集:静かに(出力を抑制するために)ループ内の各ステートメントからループ自体に移動し、8バイトを節約しました。


フリーでないコンパイラが必要なため、提出が無効になるのはなぜですか?
デニス

@Dennisメタで決定されたのは、プログラミング言語は無料の環境で実行可能でなければならないということです。また、入力の長さの制限により無効になる場合があります。
bmarks

1
文字の制限は問題になりますが、無料の実装を必要とするメタコンセンサスは知りません。(Hello Worldクイズからこのアイデアを得た場合、その質問は明示的に無料の言語を要求しました。)
デニス

私は考え出し@Dennisこれはコンセンサスだった:meta.codegolf.stackexchange.com/questions/988/...は
bmarks

答えは、テストできない投稿をダウン投票することを示唆しています。これは実際にはコンセンサスを必要とせず、実際には発生しません。実際、MathematicaとTI-BASICの回答は通常非常に人気があります。
デニス

2

R、171バイト

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

改行とインデント付き:

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

タートルード、72バイト、非競合

バイトを節約するためのアプローチを変更できると確信していますが、後で。

:pゴルフ以外のエソランは通常の言語よりも優れています:p

Turtlèdの奇妙な点は、元々はアスキーアートラングについての議論の後に作成されたものですが、実際にはこれらの種類の課題で最高のようです

Turtlèdは改行入力を使用できませんが、複数入力の場合、入力は1つだけです。最後の単語を含むスペースで各単語を終了します。

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

オンラインでお試しください!

説明:

!                          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バイト

これは、私の頭の中で、難しすぎて、簡単に、予想よりもはるかに多くのコードに変わった挑戦の1つでした。このアプローチには特に満足していません。削減するより良い方法print pop@F...、おそらく使用してビット-nまたはちょうど純粋な正規表現を、私は今そこに着くことができませんが...もともと私が使用していたsayが、私はより高い(得点する必要があると思うuse 5.01)のために$'

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

使用法

として保存しvertically-collapse-text.plます。

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

2

SmileBASIC、90バイト

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

コンソール内のすべてのテキストに重力を適用します。これが有効かどうか、または文字列配列を使用する必要があるかどうかはわかりません。


1

ルビー、99 82バイト

そこに着く...

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

試みられた説明:

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

次のように実行します。

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"

説明

x@\:!|/#:'x 各文字列を拡張して、正方文字行列を作成します。

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

+ 転置する

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} 文字列からスペースを削除してから、元の長さで文字列を埋め込みます

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

その関数を転置された各文字列に適用し、出力を反転して結果を取得します

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

{+{(-#x)$x@&~^x}'+(|/#:'x)$x}29のため
Streetster

1

pb -310バイト

^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]

最悪だ。私はそれがどのように機能するかについてほとんど何も覚えていません。

pbの入力の動作方法(一度に1行ずつ)のため、入力では改行の代わりにスペースを使用する必要があります。インタプリタがガベージではなく、入力に改行を含めることができる場合、唯一の変更は[B=32]最初にになること[B=10]です。

プログラムの実行を見たい場合にビジュアルをクリーンアップするpbi(インタープリター)の更新に取り組んでいます。まだ多くの作業が必要ですが、当面はYouTubeでこのプログラムを視聴できます


1

J、17バイト

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

非常に快適なソリューション。

説明:

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

テストケースの説明

   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

テストケース

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

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

1

実際には、13バイト

これは、DennisのJelly answerで説明されているアルゴリズムを使用します。入力と出力は両方とも文字列のリストです。残念ながら、内部のリストまたは文字列がすべて同じ長さではない場合、組み込みの転置関数はあまりうまく機能せず、そもそも垂直方向の折りたたみのポイントを無効にします。ゴルフの提案を歓迎します。オンラインでお試しください!

R2`;i(lZ♂Σ`nR

アンゴルフ

          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

ラケット312バイト

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

ゴルフをしていない:

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

テスト:

(f "Programming Puzzles & Code Golf")

出力:

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

1

JavaScript(ES6)、103バイト

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

CRで分割し、外側のマップにより、「重力」が文字をドロップする必要がある限りドロップするのに十分な回数ループすることが保証されます。

内部マップは、次の行があるかどうかを最初にチェックし、ある場合はそれが短く、オーバーフローを次の行にドロップします。すなわち、1行目に「ABCD」があり、2行目に「FG」がある場合、「CD」を1行目から2行目にドロップして、1行目が「AB」になり、2行目が「FGCD」になるようにします。

行数だけこれを行うと、文字は必要なだけドロップされ、目的の結果が得られます。


1

Japt、8バイト

y kS ù y

オンラインでお試しください!

使い方

Uy kS ù y

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

またz、2D文字列を90度の倍数だけ回転させるものもありますが、の場合、何らかの理由で文字列が切り捨てられますheight > length


7バイト。ところで、Japtへようこそ(まだお迎えしていない場合)。
シャギー

1

05AB1E10 9 バイト

¶¡RζðмζR»

オンラインでお試しください。

または別の開始で:

.BRøðмζR»

オンラインでお試しください。

@ Dennis♦ 'Pyth answerと同様のアプローチ。@Emignaをに置き換えて
-1バイト。ðõ:ðм

説明:

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

別の説明:

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

1

R、s81 52バイト

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

私は質問を解釈する際にある程度の自由を取り、テキストはセルごとに1文字のマトリックスで表されていると推定しました。したがって、

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

したがって、xは次のようになります。

     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 

ここでとを使用order[て列をソートし、NAが最初になり、次に他のすべての値が来るようにします。

     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"

出力が単語であることが必要な場合、より長くなります。

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"

PPCGへようこそ(戻る)!OPがフォーマットに問題がなければ、安全です!通常の方法は、質問へのコメントで質問することです。
JayCe

別の質問への回答で述べたように、回答は完全な機能またはプログラムであるfunction(x)必要があるため、バイトカウントに含める必要があります。
JayCe

1

R、196の 189 170バイト

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}

人間が読めるバージョン:

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
}                            

使い方:

  1. 最初の「不良」行、つまり次の行より長い行を取得し、「余分な」部分を取得して次の行に追加します
  2. 「悪い」行が残っているかどうかを確認し、残っている場合は#1に進みます

(つまり、「余分な」部品は、倒れる可能性のあるものがすべて倒れるまで倒れます。)

入力:文字ベクトル。

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.