Zwiń tekst pionowo

85

Powiedz, że mam taki tekst (każde słowo w jednym wierszu, bez spacji)

Programming
Puzzles
&
Code
Golf

To nie ma sensu! Całkowicie przeciwstawia się prawom fizyki.

Twoim zadaniem jest zaradzenie tej niemożliwej sytuacji i zwinięcie tekstu w następujący sposób:

P
Prog
&uzz
Coderam
Golflesming

Aby pod postacią nie było pustej przestrzeni, ale postacie zachowują swój pionowy porządek.

Celem jest spełnienie wymagań, ale użycie jak najmniej bajtów kodu źródłowego.

Trebuchette
źródło
12
Ponadto, czy będzie to jedno słowo w wierszu, czy mogą być spacje? Jeśli są miejsca, czy powinny się zawalić, czy też mogą unieść ciężar?
Glen O
53
„P Prog & uzz Coderam Golflesming”, brzmi jakby był nowy kandydat do tytułu strony.
jcai
1
Ktoś użyje Marbelous ( github.com/marbelous-lang/marbelous.py )?
Charlie,
1
Decyduję się na użycie silnika fizyki i trzymam 0 bajtów
l4m2
2
Czy na wydruku mogą znajdować się spacje końcowe?
Erik the Outgolfer,

Odpowiedzi:

57

Pyth, 10 bajtów

jb_.T.T_.z

Wypróbuj online w Pyth Compiler / Executor .

Pomysł

Możemy osiągnąć pożądaną moc wyjściową, stosując cztery proste transformacje:

  1. Odwróć kolejność linii:

    Golf
    Code
    &
    Puzzles
    Programming
    
  2. Transponuj wiersze i kolumny:

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

    Ten szczyt uzasadnia zwijanie oryginalnych kolumn.

  3. Transponuj wiersze i kolumny:

    Golflesming
    Coderam
    &uzz
    Prog
    P
    
  4. Odwróć kolejność linii:

    P
    Prog
    &uzz
    Coderam
    Golflesming
    

Kod

        .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
źródło
1
Grr, właśnie to opublikował :). Zamiast tego poproś o głosowanie.
Maltysen
Miałem też zamiar opublikować coś podobnego ... Również upvoting
WallyWest
Co się stanie, jeśli transponujesz wiersze i kolumny przed odwróceniem zamówienia?
John Odom
1
@JohnOdom Po prostu transpozycja dwa razy spowoduje przeniesienie znaków na górę zamiast przeniesienia ich na dół. Możesz zacząć od transpozycji, do tego czasu będziesz musiał odwrócić każdy wiersz, co byłoby o jeden bajt dłużej.
Dennis
Święty FoxPro, to było sprytne.
przepływ pracy
38

Haskell, 62 bajty

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

Jestem bardzo dojrzały

Lynn
źródło
20
+1 Ponieważ rzadko widuję Haskella i kupuję linie.
Carcigenicate,
17

Python 2, 104 bajty

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)

Iteracyjny algorytm jednoprzebiegowy. Przechodzimy kolejno przez każdą linię, aktualizując listę llinii do wydruku. Nowe słowo skutecznie przesuwa się z dołu, przesuwając wszystkie litery nad nim o jedną spację. Na przykład w przypadku testowym

Programming
Puzzles
&
Code
Golf

po tym, jak skończymy Code, mamy

P
Prog
&uzzram
Codelesming

a następnie dodając Golfwyniki w

P
Prog
&uzz
Coderam
Golflesming

które możemy postrzegać jako połączenie dwóch elementów

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

gdzie przesunięto pierwszy kawałek golf. To przesunięcie wykonujemy za pomocą ziplisty wyjściowej z elementem na końcu (lewa strona) i pierwszeństwem listy wyjściowej pustą linią (prawa strona), odcinając każdą część na długości nowego elementu.

Zamiast tego iteracja wstecz może wydawać się bardziej naturalna, pozwalając nowym literom spadać z góry, ale moja próba okazała się dłuższa.

Dla porównania, oto podejście zip/ filterz map(None,*x)zastosowanym dla iziplongest(109 bajtów):

f=lambda z:[''.join(filter(None,x))for x in map(None,*z)]
lambda x:'\n'.join(f(f(x.split('\n')[::-1]))[::-1])
xnor
źródło
12

CJam, 11 bajtów

qN/W%zzW%N*

Wypróbuj online w interpretatorze CJam .

Jak to działa

Pomysł jest taki sam jak w mojej odpowiedzi 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.
Dennis
źródło
7

JavaScript (ES6), 146

(2 nowe wiersze w ciągach szablonów są znaczące i są liczone)

Pomysł @Dennis zaimplementowany w JavaScript. Długa funkcja S wykonuje transpozycję linia po linii i char przez char, pozostawiając wynik w ttablicy.

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

Mniej golfa we fragmencie (spróbuj w 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
źródło
Zmniejsz kilka bajtów, zastępując S(t.reverse()),t.reverse().joinje S(R=t.reverse()),R.join.
Ismael Miguel,
@ IsmaelMiguel nie, S zmienia t, więc t po S nie jest taki sam jak t przed S
edc65
5

R, 223 bajty

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

To absurdalnie długi, naiwny sposób.

Nie golfowany:

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

Możesz spróbować online .

Alex A.
źródło
5

Matlab / Octave, 99 bajtów

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

Przykład :

Zdefiniuj ciąg wejściowy w zmiennej, powiedzmy s. 10jest znakiem nowego wiersza:

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

Funkcja wywołania fz wejściem s:

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

Lub wypróbuj online (dzięki @beaker za pomoc w tłumaczeniu online Octave)

Luis Mendo
źródło
4

JavaScript ES6, 119 bajtów

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

Tutaj jest bez golfa i w ES5 z komentarzami wyjaśniającymi, jak to działa:

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
źródło
4

APL (Dyalog Extended) , 13 11 bajtów SBCS

-2 z moimi rozszerzeniami do Dyalog APL.

Anonimowa funkcja milcząca, przyjmująca i zwracająca macierz znaków.

~∘' '1⍢⍉⍢⊖

Wypróbuj online!

~ wyjąć
 z
' ' przestrzeni
 z
1 rzędów (Lit. 1D tablice podrzędne)
 podczas
 transpozycji
 gdy
 odwrócony

Adám
źródło
poczekaj, jak tam 33 bajty?
Conor O'Brien
3

R, 190 178 175 bajtów

Prawdopodobnie jest jeszcze trochę miejsca na grę w golfa. Prawdopodobnie kilka niepotrzebnych operacji

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

Nie golfił i wyjaśnił

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

Testowe uruchomienie. Warto zauważyć, że ze względu na sposób działania skanowania całe zdanie można wprowadzać spacjami i nadal podawać wynik zgodnie ze specyfikacją.

> 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
źródło
3

STATA, 323 bajty

Pobiera dane wejściowe w pliku o nazwie ab Działa teraz tylko dla maksymalnie 24 znaków. Zaktualizuje później, aby działało z większą liczbą. Ponadto nie działa w kompilatorze online. Wymaga niewolnego kompilatora.

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
}

Edycja: przeniósł cicho (aby ukryć wyjście) do samej pętli z każdej instrukcji w pętli, oszczędzając 8 bajtów.

znaczniki
źródło
Dlaczego przesłanie byłoby nieprawidłowe, tylko dlatego, że wymaga niewolnego kompilatora?
Dennis,
@Dennis Myślałem, że w meta postanowiono, że języki programowania muszą być uruchamialne w wolnym środowisku. Ponadto ograniczenia długości wejściowej mogą go unieważnić.
oznacza
1
Ograniczenie postaci byłoby problemem, ale nie znam żadnego meta konsensusu, który wymagałby darmowej implementacji. (Jeśli masz ten pomysł z quizu Hello World, to pytanie wyraźnie dotyczyło wolnych języków.)
Dennis
@Dennis Doszedłem do wniosku, że był to konsensus: meta.codegolf.stackexchange.com/questions/988/…
zaznacza
Odpowiedź sugeruje głosowanie na niestabilne posty, co tak naprawdę nie wymaga konsensusu i nie zdarza się w praktyce. W rzeczywistości odpowiedzi Mathematica i TI-BASIC są zwykle dość popularne.
Dennis,
2

R 171 bajtów

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

Z nowymi liniami i wcięciami:

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

Stosowanie:

> 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
źródło
2

Galaretka , 6 bajtów (niekonkurencyjna)

ỴṚZZṚY

Wypróbuj online!

Jak to działa

Pomysł jest taki sam jak w mojej odpowiedzi Pyth .

ỴṚ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
źródło
2

Turtlèd , 72 bajty, niekonkurujące

Dość pewien, że mógłbym zmienić podejście do zapisywania bajtów, ale później.

: p Esolang nie golfowy bije zwykłe języki: p

Dziwną rzeczą w Turtlèd jest to, że pierwotnie powstał po dyskusji na temat ascii art langs, ale tak naprawdę wydaje się być najlepszy w tego rodzaju wyzwaniach

Turtlèd nie może pobierać nowego wiersza, ale dla wielu danych wejściowych, a to wymaga tylko jednego wejścia: zakończ każde słowo spacją, w tym ostatnią.

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

Wypróbuj online!

Wyjaśnienie:

!                          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
Zniszczalna cytryna
źródło
2

Perl, 133 bajty

To było jedno z tych wyzwań, które zmieniły się w mojej głowie ze zbyt trudnej, na łatwą, na o wiele więcej kodu, niż się spodziewałem ... Nie jestem szczególnie zadowolony z tego podejścia, jestem pewien, że o wiele lepszy sposób, aby zmniejszyć print pop@F...bit, używając -nlub po prostu czystego wyrażenia regularnego, ale teraz nie mogę się tam dostać ... Początkowo używałem say, ale myślę, że musiałbym zdobyć wyższą ( use 5.01) z powodu $'.

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

Stosowanie

Zapisz jako vertically-collapse-text.pl.

perl vertically-collapse-text.pl <<< 'Programming
Puzzles
&
Code
Golf'
P
Prog
&uzz
Coderam
Golflesming
Dom Hastings
źródło
2

SmileBASIC, 90 bajtów

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

Stosuje grawitację do całego tekstu w konsoli. Nie jestem pewien, czy jest to poprawne, czy też muszę użyć tablicy ciągów.

12Me21
źródło
1

Ruby, 99 82 bajtów

Jak się tam dostać ...

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

Próba wyjaśnienia:

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

Uruchom tak:

a = %w[
  Programming
  Puzzles
  &
  Code
  Golf
]
puts f[a]
daniero
źródło
1

K, 30

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

.

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

Wyjaśnienie

x@\:!|/#:'x rozszerza każdy ciąg znaków, aby utworzyć kwadratową macierz znaków.

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

+ transponuje to

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} usunie wszelkie spacje z łańcucha, a następnie wypełni łańcuch według oryginalnej długości

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

Zastosuj tę funkcję do każdego z transponowanych ciągów, a następnie odwróć dane wyjściowe, aby uzyskać wynik

k){+{(-#x)$x@&~^x}'+x@\:!|/#:'x}("Programming";"Puzzles";,"&";"Code";"Golf")
"P          "
"Prog       "
"&uzz       "
"Coderam    "
"Golflesming"
tartin
źródło
{+{(-#x)$x@&~^x}'+(|/#:'x)$x}na 29.
streetster
1

pb - 310 bajtów

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

Co za katastrofa. Prawie nic nie pamiętam o tym, jak to działa.

Ze względu na sposób, w jaki działa wejście pb (pojedyncza linia naraz), musisz używać spacji zamiast nowych linii na wejściu. Jeśli interpreter nie był śmieciem i mógłbyś wstawić znaki nowego wiersza na wejściu, jedyną zmianą byłby [B=32]na początku [B=10].

Pracuję nad aktualizacją pbi (interpretera), która wyczyści efekty wizualne, jeśli chcesz oglądać działanie programu. Nadal wymaga dużo pracy, ale w międzyczasie możesz obejrzeć ten program na YouTube .

podziemny monorail
źródło
1

J, 17 bajtów

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

Całkiem przyjemne rozwiązanie.

Wyjaśnienie:

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

Wyjaśnienie przypadku testowego

   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

Przypadki testowe

   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
źródło
;@;:&.(|:@|.)za 13
FrownyFrog
1

Tak właściwie 13 bajtów

Wykorzystuje algorytm opisany w odpowiedzi Jelly'ego na Jelly . Dane wejściowe i wyjściowe są listami ciągów. Niestety, wbudowana funkcja transpozycji nie działa zbyt dobrze, jeśli wewnętrzne listy lub ciągi nie są tej samej długości, co w pewnym sensie pokonałoby punkt zawalenia się w pionie. Sugestie dotyczące gry w golfa mile widziane. Wypróbuj online!

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.
Sherlock9
źródło
1

Rakieta 312 bajtów

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

Nie golfowany:

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

Testowanie:

(f "Programming Puzzles & Code Golf")

Wynik:

'("P" "Prog" "&uzz" "Coderam" "Golflesming")
rnso
źródło
1

JavaScript (ES6), 103 bajty

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

Podzielona na CR, zewnętrzna mapa zapewnia, że ​​zapętlamy wystarczająco dużo razy, aby pozwolić „grawitacji” na upuszczanie liter tak daleko, jak trzeba.

Wewnętrzna mapa najpierw sprawdza, czy jest następna linia, a jeśli tak, to jest krótsza, upuść przelew do następnej linii. tzn. jeśli pierwsza linia ma „ABCD”, a druga linia ma „FG”, upuść „CD” z pierwszej linii do drugiej, aby pierwsza linia zmieniła się na „AB”, a druga na „FGCD”.

Gdy robimy to tyle razy, ile jest linii, litery spadają tak daleko, jak powinny, pozostawiając nam pożądany rezultat.

Grax32
źródło
1

Japt , 8 bajtów

y kS ù y

Wypróbuj online!

Jak to działa

Uy kS ù y

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

Jest też taki, zktóry obraca ciąg 2D o wielokrotność 90 stopni, ale w jakiś sposób skraca ciąg kiedy height > length.

Bubbler
źródło
7 bajtów . Przy okazji, witajcie w Japt (jeśli jeszcze was nie powitałem).
Kudłaty
1

05AB1E , 10 9 bajtów

¶¡RζðмζR»

Wypróbuj online.

lub z alternatywnym startem:

.BRøðмζR»

Wypróbuj online.

Podobne podejście jak @ Dennis ♦ 'Pyth answer .
-1 bajt dzięki zastąpieniu @Emignaðõ: przezðм .

Wyjaśnienie:

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

Alternatywne wyjaśnienie:

.B      # Box (implicitly splits on new-lines and appends spaces)
   ø    # Zip/Transpose with equal-length items
        # Rest is the same
Kevin Cruijssen
źródło
1

R, s81 52 bajty

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

Zinterpretowałem to pytanie i założyłem, że tekst jest reprezentowany w matrycy z jednym znakiem na komórkę, a zatem:

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

Więc x staje się:

     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 

Teraz używam orderi [do sortowania kolumn, aby najpierw były NA, a potem wszystkie inne wartości:

     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"

Wydłuża się, jeśli wymagane jest, aby wynik zawierał słowa:

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
źródło
Witamy (powrót) w PPCG! Tak długo, jak OP jest w porządku z twoim formatem, jesteś bezpieczny! zwykłym sposobem jest zadawanie tego w komentarzu do pytania.
JayCe
jak wspomniano w odpowiedzi na inne pytanie, odpowiedzi muszą być pełne lub zawierać programy, więc function(x)należy je uwzględnić w liczbie bajtów.
JayCe
1

R 196 189 170 bajtów

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}

Wersja czytelna dla człowieka:

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
}                            

Jak to działa:

  1. Weź pierwszą „złą” linię, tj. Linię, która jest dłuższa niż następna linia, weź „dodatkową” część i dodaj ją do następnej linii
  2. Sprawdź, czy pozostały jakieś „złe” linie, jeśli tak, przejdź do # 1

(Innymi słowy, „zbędne” części upadają, dopóki nie spadnie wszystko, co może spaść).

Dane wejściowe: wektor znaków.

x<-readLines(textConnection("Programming\nPuzzles\n&\nCode\nGolf"))
f(x)
# [1] "P"           "Prog"        "&uzz"        "Coderam"     "Golflesming"
lebatsnok
źródło
0

Julia 0.6 , 141 bajtów

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

Wypróbuj online!

Nadawanie za pomocą g.([w], [d d])pozwala mi pozbyć się każdej instrukcji mapy i oszczędza mi około 7 bajtów.

niczky12
źródło