ข้อความยุบตัวในแนวตั้ง


85

ว่าฉันมีข้อความเช่นนี้ (แต่ละคำในหนึ่งบรรทัดโดยไม่มีช่องว่าง)

Programming
Puzzles
&
Code
Golf

ไม่สมเหตุสมผล! มันท้าทายกฎของฟิสิกส์โดยสิ้นเชิง

ความท้าทายของคุณคือการแก้ไขสถานการณ์ที่เป็นไปไม่ได้นี้และยุบข้อความเช่น:

P
Prog
&uzz
Coderam
Golflesming

เพื่อให้ไม่มีที่ว่างใต้อักขระใด ๆ แต่ตัวละครยังคงอยู่ในลำดับแนวตั้ง

เป้าหมายคือเพื่อตอบสนองความต้องการ แต่ใช้ไบต์ที่น้อยที่สุดของซอร์สโค้ดที่เป็นไปได้


12
อีกทั้งจะเป็นหนึ่งคำต่อบรรทัดหรืออาจมีช่องว่างหรือไม่ หากมีช่องว่างควรยุบตัวหรือช่องว่างสามารถรับน้ำหนักได้หรือไม่
เกลน O

53
"P & Prog Uzz Coderam Golflesming" เสียงเหมือนมีผู้สมัครใหม่สำหรับชื่อของเว็บไซต์ ..
jcai

1
มีใครบางคนกำลังใช้ Marbelous ( github.com/marbelous-lang/marbelous.py )
ชาร์ลี

1
ฉันตัดสินใจใช้เครื่องมือฟิสิกส์และถือ 0 ไบต์
l4m2

2
สามารถมีช่องว่างต่อท้ายในผลลัพธ์หรือไม่
Erik the Outgolfer

คำตอบ:


57

Pyth, 10 ไบต์

jb_.T.T_.z

ลองใช้ออนไลน์ในPyth คอมไพเลอร์

ความคิด

เราสามารถบรรลุเอาท์พุทที่ต้องการโดยใช้การแปลงสี่อย่างง่าย ๆ :

  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 จะโพสต์สิ่งนี้ :) มี upvote แทน
Maltysen

ฉันมีแผนที่จะโพสต์สิ่งที่คล้ายกันด้วย ... การลุกฮือเกินไป
WallyWest

จะเกิดอะไรขึ้นถ้าคุณเปลี่ยนแถวและคอลัมน์ก่อนที่จะกลับคำสั่ง
John Odom

1
@JohnOdom การย้ายเพียงสองครั้งจะเป็นการย้ายตัวละครไปด้านบนแทนที่จะเลื่อนไปด้านล่าง คุณสามารถเริ่มต้นด้วยการเปลี่ยนจากนั้นคุณจะต้องย้อนกลับแต่ละแถวซึ่งจะมีความยาวหนึ่งไบต์
เดนนิส

ศักดิ์สิทธิ์ FoxPro นี่เป็นคนฉลาด
เวิร์กโฟลว์

38

Haskell, 62 ไบต์

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

ฉันเป็นผู้ใหญ่มาก


20
+1 เพราะฉันไม่ค่อยเห็น Haskell และสำหรับเซ่อไลน์
Carcigenicate

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บรรทัดเพื่อส่งออก คำใหม่ผลักออกมาจากด้านล่างอย่างมีประสิทธิภาพขยับตัวอักษรทั้งหมดที่อยู่ด้านบนหนึ่งช่อง ตัวอย่างเช่นในกรณีทดสอบ

Programming
Puzzles
&
Code
Golf

หลังจากที่เราทำไปCodeแล้วเรามี

P
Prog
&uzzram
Codelesming

แล้วเพิ่มGolfผลลัพธ์ใน

P
Prog
&uzz
Coderam
Golflesming

ซึ่งเราสามารถมองว่าเป็นการรวมกันของสองชิ้น

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

ชิ้นส่วนแรกขยับขึ้นgolfไหน เราดำเนินการเปลี่ยนแปลงนี้ด้วยzipรายการผลลัพธ์ที่มีองค์ประกอบที่ส่วนท้าย (ด้านซ้าย) และลำดับความสำคัญของรายการเอาท์พุทด้วยบรรทัดว่าง (ด้านขวา) ตัดแต่ละส่วนตามความยาวขององค์ประกอบใหม่

มันอาจดูเป็นธรรมชาติมากกว่าที่จะทำซ้ำย้อนหลังแทนที่จะปล่อยให้จดหมายใหม่หล่นลงมาจากด้านบน

สำหรับการเปรียบเทียบนี่คือวิธีzip/ filterโดยmap(None,*x)ใช้สำหรับiziplongest(109 ไบต์):

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 บรรทัดภายในสตริงแม่แบบมีความสำคัญและถูกนับ)

แนวคิดของ @Dennis นำมาใช้ใน JavaScript ฟังก์ชั่น S ที่มีความยาวทำหน้าที่ขนย้ายทีละบรรทัดและถ่านโดยถ่านออกผลใน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`
`)

น้อย golfed ภายในตัวอย่าง (ลองใน 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
Ismael Miguel

@IsmaelMiguel ไม่, S เปลี่ยน t, ดังนั้น t หลังจาก S ไม่เหมือนกับ t ก่อน S
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="")}

นี่เป็นวิธีที่ไร้เหตุผลและไร้เหตุผลในการทำ

Ungolfed:

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

ตัวอย่าง :

sกำหนดสายป้อนในตัวแปรพูด 10เป็นอักขระตัวดึงบรรทัด:

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

ฟังก์ชั่นการโทรfพร้อมอินพุตs:

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

หรือลองใช้งานออนไลน์ (ขอบคุณ@beakerสำหรับความช่วยเหลือเกี่ยวกับล่าม Octave ออนไลน์)


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>


4

APL (Dyalog Extended) , 13 11 ไบต์SBCS

-2 ด้วยส่วนขยายของฉันไปยัง Dyalog APL

ฟังก์ชั่นเงียบโดยไม่ระบุชื่อการและกลับเมทริกซ์ของตัวละคร

~∘' '1⍢⍉⍢⊖

ลองออนไลน์!

~ ลบ ช่องว่าง จาก แถว (จุด 1D ย่อยอาร์เรย์)  ในขณะที่การ ขนย้าย ในขณะที่ พลิก

' '

1




รอ 33 ไบต์นี้เป็นอย่างไร
Conor O'Brien

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

Ungolfed และอธิบาย

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 อักขระเท่านั้น จะอัปเดตในภายหลังเพื่อให้ทำงานได้มากขึ้น ยังไม่สามารถใช้งานได้ในคอมไพเลอร์ออนไลน์ ต้องใช้คอมไพเลอร์ไม่ฟรี

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 ฉันคิดว่ามีการตัดสินใจใน meta ว่าภาษาการเขียนโปรแกรมต้องสามารถทำงานได้ในสภาพแวดล้อมฟรี นอกจากนี้ข้อ จำกัด เกี่ยวกับความยาวของอินพุตอาจทำให้ใช้งานไม่ได้
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

เยลลี่ , 6 ไบต์ (ไม่แข่งขัน)

ỴṚZZṚY

ลองออนไลน์!

มันทำงานอย่างไร

ความคิดในการเช่นเดียวกับในของฉันคำตอบ 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.

2

Turtlèd , 72 ไบต์, ไม่ใช่การเข้ารหัส

ค่อนข้างแน่ใจว่าฉันสามารถเปลี่ยนวิธีการบันทึกไบต์ แต่ในภายหลัง

: p esolang ไม่ใช่กอล์ฟเต้น langs ปกติ: p

สิ่งแปลกประหลาดเกี่ยวกับTurtlèdนั้นเกิดขึ้นหลังจากการอภิปรายเกี่ยวกับ ascii art langs แต่จริงๆแล้วมันดูเหมือนจะดีที่สุดสำหรับความท้าทายเหล่านี้

Turtlèdไม่สามารถรับอินพุตบรรทัดใหม่ แต่สำหรับอินพุตหลายอินพุตและใช้อินพุตเพียงหนึ่งเดียว: ยุติแต่ละคำด้วยช่องว่างรวมถึงช่องว่างสุดท้าย

!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 ไบต์

นี่เป็นหนึ่งในความท้าทายที่เปลี่ยนไปในหัวของฉันจากการยากเกินไปเป็นเรื่องง่ายเป็นรหัสมากกว่าที่ฉันคาดไว้ ... ฉันไม่ค่อยมีความสุขกับวิธีการฉันแน่ใจว่ามี วิธีที่ดีมากในการลดprint pop@F...บิตอาจจะใช้-nหรือเพียงแค่ regex บริสุทธิ์ แต่ฉันไม่สามารถได้รับมีตอนนี้ ... แต่เดิมผมใช้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

Ruby, 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 ขยายแต่ละสตริงเพื่อสร้างเมทริก char char

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 (บรรทัดเดียวพร้อมกันทั้งหมด) คุณต้องใช้ช่องว่างแทนการขึ้นบรรทัดใหม่ในอินพุต หากล่ามไม่ได้ขยะและคุณอาจรวมถึงการขึ้นบรรทัดใหม่ในการป้อนข้อมูลการเปลี่ยนแปลงเท่านั้นที่จะเป็นจุดเริ่มต้นการเป็น[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 ไบต์

นี้จะใช้ขั้นตอนวิธีการที่อธิบายไว้ในเดนนิสคำตอบของวุ้น อินพุตและเอาต์พุตเป็นรายการสตริงทั้งคู่ น่าเสียดายที่ฟังก์ชั่นขนย้าย builtin ทำงานได้ไม่ดีนักหากรายการด้านในหรือสายอักขระนั้นไม่ได้มีความยาวเท่ากันซึ่งจะเอาชนะจุดที่ยุบตัวในแนวตั้งได้ตั้งแต่แรก ยินดีต้อนรับคำแนะนำการเล่นกอล์ฟ ลองออนไลน์!

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

แร็กเก็ต 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)))

Ungolfed:

(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" และบรรทัดที่สองมี "FG" ให้วาง "CD" จากบรรทัดที่ 1 ถึง 2 เพื่อให้บรรทัดที่ 1 กลายเป็น "AB" และที่สองกลายเป็น "FGCD"

ในขณะที่เราทำเช่นนี้บ่อยครั้งเท่าที่มีเส้นตัวอักษรจะลดลงตามที่ควรจะทิ้งไว้กับผลลัพธ์ที่ต้องการ


1

Japtet , 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 โดยวิธี (ถ้าฉันไม่ได้ต้อนรับคุณแล้ว)
Shaggy

1

05AB1E , 10 9 ไบต์

¶¡RζðмζR»

ลองออนไลน์

หรือด้วยการเริ่มต้นทางเลือก:

.BRøðмζR»

ลองออนไลน์

วิธีการที่คล้ายกันเป็น@ เดนนิส♦' คำตอบ
-1 ไบต์ขอบคุณที่@Emignaแทนที่ด้วยðõ:ðм

คำอธิบาย:

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

ฉันใช้เสรีภาพบางอย่างในการตีความคำถามและสันนิษฐานว่าข้อความแสดงในเมทริกซ์ที่มีอักขระหนึ่งตัวต่อเซลล์ดังนั้น:

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. ตรวจสอบว่ามีบรรทัด "bad" เหลืออยู่หรือไม่ถ้าใช่ไปที่ # 1

(หรือกล่าวอีกนัยหนึ่งส่วน "ฟุ่มเฟือย" ล้มลงจนกระทั่งทุกสิ่งที่สามารถล้มลงได้ล้มลง)

อินพุต: เวกเตอร์อักขระ

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

0

Julia 0.6 , 141 bytes

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

ลองออนไลน์!

การออกอากาศด้วยg.([w], [d d])ช่วยให้ฉันสามารถลบคำสั่งแผนที่ใด ๆ และช่วยฉันประมาณ 7 ไบต์

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.