บันไดเขียน


35

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

ตัวอย่างเช่น:

Input: Programming Puzzles and Code Golf


Output: Pr          P           C    G
          ogr        uzzl   and  od   olf
             amm         es        e
                ing

อินพุต

สตริงที่มีอะไรนอกจากตัวอักษรและช่องว่าง

สตริงสามารถส่งผ่านผ่านSTDINหรือฟังก์ชั่นข้อโต้แย้งหรือสิ่งที่เทียบเท่า

ตัวอักษรสามารถเป็นตัวพิมพ์เล็กหรือใหญ่

อินพุตจะถือว่าเป็นไปตามกฎเหล่านั้นเสมอคุณไม่จำเป็นต้องตรวจสอบอินพุตที่ไม่ถูกต้อง

เอาท์พุต

ทุกครั้งที่สระ (นั่นคือa, e, i, o, uหรือy) จะพบในคำคุณต้องส่งออกส่วนที่เหลือของคำในบรรทัดถัดไป (สระพบรวม) ที่ตำแหน่งแนวนอนที่ถูกต้อง กฎนี้เรียกซ้ำซึ่งหมายความว่าหากมีเสียงสระ n คำในคำนั้นมันจะถูกเขียนบน n + 1 บรรทัด

  • สระควรเขียนที่จุดเริ่มต้นของบรรทัดถัดไปและไม่ควรอยู่ที่จุดสิ้นสุดของบรรทัดก่อนหน้าเมื่อพบหนึ่งบรรทัด

  • แต่ละคำเริ่มต้นในบรรทัดแรกและควรจัดรูปแบบเป็นอิสระจากคำอื่น ๆ คำสองคำคั่นด้วยช่องว่าง

  • หากคำเริ่มต้นด้วยเสียงสระคุณจะต้องเขียนคำนั้นขึ้นต้นด้วยบรรทัดที่สอง

กรณีทดสอบ

  • การป้อนข้อมูล: Programming Puzzles and Code Golf

เอาท์พุท:

Pr          P           C    G
  ogr        uzzl   and  od   olf
     amm         es        e
        ing
  • การป้อนข้อมูล: The quick brown fox jumps over the lazy dog

เอาท์พุท:

Th  q     br    f   j          th  l    d
  e  u      own  ox  umps ov     e  az   og
      ick                   er        y
  • การป้อนข้อมูล: aeiouy

เอาท์พุท:

 
a
 e
  i
   o
    u
     y
  • การป้อนข้อมูล: YEAh UppErcAsE VOwEls

เอาท์พุท:

               V
Y    Upp        Ow
 E      Erc       Els
  Ah       As  
             E
  • การป้อนข้อมูล: If you only knew the power of the Dark Side

เอาท์พุท:

            kn   th  p        th  D    S
If y   onl    ew   e  ow   of   e  ark  id
    o     y             er                e
     u

เกณฑ์การให้คะแนน

นี่คือดังนั้นรหัสที่สั้นที่สุดชนะ


ตัวอย่างผลลัพธ์ที่สามดูเหมือนจะไม่สอดคล้องกับกฎ "ถ้าคำขึ้นต้นด้วยเสียงสระคุณต้องเขียนคำนั้นโดยเริ่มจากบรรทัดที่สอง"
JohnE

1
Y คือ Y เป็นเสียงสระ
เครื่องมือเพิ่มประสิทธิภาพ

1
@ JohnE จริง ๆ แล้วฉันซ่อมมัน ขอบคุณ
เสียชีวิต

2
The vowel should be written at the beginning of the next line, and not at the end of the previous line when one is encountered.หลังจากความคิดบางอย่างฉันเข้าใจว่านี่หมายความว่าการย้ายไปยังบรรทัดถัดไปควรเกิดขึ้นก่อนที่จะพิมพ์เสียงสระไม่ใช่หลังจาก แต่มันอาจจะคุ้มค่ากับการใช้ถ้อยคำนี้ในแบบที่เข้าใจได้ทันที - ใช้เวลาสักพักหนึ่ง
trichoplax

3
ขึ้นบรรทัดใหม่ / ช่องว่างอนุญาตหรือไม่
Loovjo

คำตอบ:


18

เรติน่า , 50 44 34 (+10) 32 30 ไบต์

ขอบคุณเดนนิสสำหรับการบันทึก 14 ไบต์โดยใช้อักขระควบคุมจริง

i`[aeiouy]
<VT>$0#
+`#(\S*)
$1<ESC>[A

จากคำตอบนี้ฉันใช้รหัสหลบหนี ANSI เพื่อเลื่อนเคอร์เซอร์เทอร์มินัลในแนวตั้ง <ESC>จะถูกแทนที่ด้วยอักขระควบคุม 0x1b และมีแนวแท็บ<VT> 0x0Bสำหรับการทดสอบง่ายนอกจากนี้คุณยังสามารถแทนที่<ESC>ด้วย\e, <VT>มีและอาหารที่ส่งออกผ่าน\vprintf

สำหรับวัตถุประสงค์ในการนับแต่ละบรรทัดจะเป็นไฟล์แยกต่างหาก อย่างไรก็ตามเพื่อความสะดวกมันง่ายกว่าที่จะวางรหัสลงในไฟล์เดียวและเรียกใช้ Retina พร้อม-sตัวเลือก

การแทนที่ครั้งแรกจะล้อมรอบสระแต่ละสระ\v...#โดยที่\vเคอร์เซอร์จะเลื่อนลงและ#จะเป็นเครื่องหมายสำหรับขั้นตอนที่สอง นี่i`เป็นสัญกรณ์ของ Retina สำหรับการจับคู่แบบตรงตามตัวพิมพ์ใหญ่ - เล็ก

ขั้นตอนที่สองจากนั้นซ้ำ ๆ ( +`) ลบคำ#จากคำหนึ่งและวางคำe\[Aที่ท้ายคำที่เลื่อนเคอร์เซอร์ขึ้นด้านบน สิ่งนี้จะหยุดเมื่อสตริงหยุดเปลี่ยนเช่นเมื่อไม่มี#เครื่องหมายในสตริง


printfคุณไม่จำเป็นต้อง เพียงแทนที่\eด้วย ESC ไบต์ (0x1b)
Dennis

@Dennis Oh ดีกว่ามากขอบคุณ
Martin Ender

1
มันยอดเยี่ยมมาก !!!
kirbyfan64sos

คำตอบนี้เป็นเหตุผลว่าทำไมไม่มีใครทำ Retina อย่างจริงจัง;)
Christopher Wirt

@ChristopherWirt กรุณาอธิบายอย่างละเอียด :) (ถึงแม้ว่าฉันจะกลัวจริง ๆ ถ้าใครเอา Retina อย่างจริงจัง)
Martin Ender

8

CJam, 39 36 ไบต์

0000000: 6c 7b 5f 65 6c 22 61 65 69 6f 75 79 22  l{_el"aeiouy"
000000d: 26 7b 22 1b 5b 41 22 27 0b 6f 5c 7d 26  &{".[A"'.o\}&
000001a: 5f 53 26 7b 5d 7d 26 6f 7d 2f           _S&{]}&o}/

ด้านบนเป็นดัมพ์ xxd ที่สามารถย้อนกลับได้เนื่องจากซอร์สโค้ดมีอักขระที่ไม่สามารถพิมพ์ได้ VT (รหัสจุด 0x0b) และ ESC (รหัสจุด 0x1b)

ชอบคำตอบนี้จะใช้แท็บแนวตั้งและANSI ลำดับหนี

ต้องใช้เทอร์มินัลส่งข้อความวิดีโอที่รองรับซึ่งรวมถึงโปรแกรมจำลองเทอร์มินัลที่ไม่ใช่ Windows ส่วนใหญ่

ทดสอบการทำงาน

ก่อนดำเนินการรหัสจริงเราจะปิดใช้งานพรอมต์และล้างหน้าจอ

$ PS1save="$PS1"
$ unset PS1
$ clear

สิ่งนี้ทำให้แน่ใจว่าผลลัพธ์ถูกแสดงอย่างถูกต้อง

echo -n Programming Puzzles and Code Golf | cjam <(xxd -ps -r <<< 6c7b5f656c226165696f757922267b221b5b4122270b6f5c7d265f53267b5d7d266f7d2f)
Pr          P           C    G
  ogr        uzzl   and  od   olf
     amm         es        e
        ing

หากต้องการคืนค่าพรอมต์ให้ดำเนินการดังนี้

PS1="$PS1save"

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

เราแทรกแท็บแนวตั้งก่อนสระแต่ละอันเพื่อเลื่อนเคอร์เซอร์ลงและสำเนาเพียงพอของลำดับไบต์1b 5b 41 ( "\e[A") หลังจากแต่ละพื้นที่เพื่อเลื่อนเคอร์เซอร์กลับไปที่แถวแรก

l           e# Read a line from STDIN.
{           e# For each character C:
  _el       e#   Push lowercase(C).
  "aeiouy"& e#   Intersect with "aeiouy".
  {         e#   If the intersection is non-empty:
    ".[A"   e#     Push "\e[A" (will be printed later).
    '.o     e#     Print "\v".
    \       e#     Swap "\e[A" with C.
  }&        e#
  _S&       e#   Intersect C with " ".
  {         e#   If the intersection is non-empty:
    ]       e#     Wrap the entire stack in an array.
  }&
  o         e#   Print C or the entire stack.
}/          e#

อย่าลืมunset PS1saveหลังจากนั้น
usandfriends

5

Java, 428 ไบต์

void s(String s){int l=s.length(),m=0;char[][]c=new char[l][];for(int i=0;i<c.length;java.util.Arrays.fill(c[i++],' '))c[i]=new char[l];String v="aeiouyAEIOUY";String[]a=s.split(" ");for(int r=0,p=0;r<a.length;r++){String u=a[r]+" ";int o=v.indexOf(u.charAt(0))>=0?1:0,x=p;for(;x<u.length()-1+p;o+=v.indexOf(u.charAt(x++-~-p))>=0?1:0)c[o][x]=u.charAt(x-p);p+=u.length();m=m<o?o:m;}for(int i=0;i<=m;i++)System.out.println(c[i]);}

ฉันรู้ว่ามันน่ากลัว อาจมีตัวอักษรบางตัวที่โกนได้ แต่ฉันขี้เกียจเกินกว่าจะทำเช่นนั้นได้


คุณอาจจะสามารถประกาศจำนวนมากที่คุณintตัวแปร (คือi, r, p, oและx) ที่คุณเริ่มต้นlและmเนื่องจากพวกเขาจะได้รับค่าในภายหลัง นอกจากนี้คุณยังสามารถทำและทำเช่นเดียวกับข้างต้นสำหรับString v="...",a[]=...; String uนั่นควรลดคะแนนของคุณลงเล็กน้อย
ทีเอ็นที

ฉันชอบx++-~-p
Ypnypn

4

Perl, 31 ไบต์

0000000: 24 5c 3d 22 1b 5b 41 22 78 20 73 2f 5b 61  $\=".[A"x s/[a
000000e: 65 69 6f 75 79 5d 2f 0b 24 26 2f 67 69     eiouy]/.$&/gi

ด้านบนเป็นดัมพ์ xxd ที่สามารถย้อนกลับได้เนื่องจากซอร์สโค้ดมีอักขระที่ไม่สามารถพิมพ์ได้ VT (รหัสจุด 0x0b) และ ESC (รหัสจุด 0x1b)

รหัสมีความยาว 27 ไบต์และต้องการสวิตช์040p(4 ไบต์)

โปรแกรมต้องการเทอร์มินัลข้อความวิดีโอที่รองรับแท็บแนวตั้งและ ลำดับการหลีกเลี่ยง ANSIซึ่งรวมถึงเทอร์มินัลเทอร์มินัลที่ไม่ใช่ Windows

ทดสอบการทำงาน

ก่อนดำเนินการรหัสจริงเราจะปิดใช้งานพรอมต์และล้างหน้าจอ

$ PS1save="$PS1"
$ unset PS1
$ clear

สิ่งนี้ทำให้แน่ใจว่าผลลัพธ์ถูกแสดงอย่างถูกต้อง

echo -n Programming Puzzles and Code Golf | perl -040pe "$(xxd -ps -r <<< 245c3d221b5b41227820732f5b6165696f75795d2f0b24262f6769)"
Pr          P           C    G
  ogr        uzzl   and  od   olf
     amm         es        e 
        ing

หากต้องการคืนค่าพรอมต์ให้ดำเนินการดังนี้

PS1="$PS1save"

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

  • perl -040pอ่านอินพุตโดยอัตโนมัติเป็นโทเค็นที่คั่นด้วยช่องว่าง ( -040) บันทึกแต่ละโทเค็นใน$_( -p) และเรียกใช้งานโปรแกรม

  • s/[aeiouy]/.$&/giทำการค้นหาแบบโกลบอลการคำนึงถึงขนาดตัวพิมพ์และตัวเล็ก$_สำหรับเสียงสระและแทนที่เสียงสระแต่ละตัวด้วยอักขระควบคุม VT (เลื่อนเคอร์เซอร์ลง) ตามด้วยเสียงสระของมันเอง

  • sส่งคืนจำนวนการแทนที่ที่ทำขึ้นดังนั้น$\=".[A"x s...บันทึกหลาย ๆ ชุดของลำดับไบต์1b 5b 41 (เลื่อนเคอร์เซอร์ขึ้น) $\หนึ่งชุดสำหรับแต่ละสระ

  • ในตอนท้ายของโปรแกรม Perl จะพิมพ์โดยอัตโนมัติ"$_$\"เนื่องจาก-pสวิตช์


4

C, 200 190 ไบต์

i,j,k,l,M;f(char*s){M=strlen(s)+1;char t[M*M];for(;i<M*M;++i)t[i]=(i+1)%M?32:10;for(i=0;i<M-1;++i)k=(strspn(s+i,"aeiouyAEIOUY")?++j:s[i]==32?j=0:j)*M+i,l<k?l=k:0,t[k]=s[i];t[l+1]=0;puts(t);}

Ungolfed:

i,j,k,l,M;
f(char *s){
    M = strlen(s)+1;
    char t[M*M];
    for(; i<M*M; ++i) t[i] = (i+1)%M ? 32 : 10;
    for(i=0; i<M-1; ++i)
        k = (strspn(s+i,"aeiouyAEIOUY") ? ++j : s[i]==32 ? j=0 : j) * M + i,
        l<k ? l=k : 0,
        t[k] = s[i];
    t[l+1]=0;
    puts(t);
}

มันจัดสรรบัฟเฟอร์สี่เหลี่ยม (สี่เหลี่ยมจัตุรัสจริง ๆ ) เติมเต็มด้วยช่องว่างและบรรทัดใหม่จากนั้นข้ามสตริงที่กำหนด ในตอนท้ายจะเพิ่มอักขระ null เพื่อป้องกันการขึ้นบรรทัดใหม่

ในทางเทคนิคแล้วมันไม่ใช่ฟังก์ชั่นเนื่องจากมันมีรูปทรงกลม ในความเป็นจริงมันไม่สามารถเรียกได้มากกว่าหนึ่งครั้ง ( jและlต้องเป็น 0 ในตอนเริ่มต้น) ในการปฏิบัติตามi,j,k,l,M;สามารถย้ายไปint i,j=0,k,l=0,M;ที่จุดเริ่มต้นของฟังก์ชั่น


char*t=malloc(M*M);-> char t[M*M];และfor(i=0;i<M*M;++i)->for(;i<M*M;++i)
Spikatrix

จับได้ดีแก้ไข
jcai

นี่เป็นเพราะ C99 char t[M*M]หรือเปล่า?
Zacharý

4

CJam, 47

ใช่มันค่อนข้างยาว แต่ไม่ใช่ "การโกง" ด้วยรหัส ANSI :)

q_{_S&!\el"aeiouy"-!U+*:U}%_0|$])\zff{~@-S@?}N*

ลองออนไลน์

แนวคิดคือการคำนวณหมายเลขบรรทัดสำหรับอักขระแต่ละตัว (เริ่มต้นที่ 0 เพิ่มขึ้นที่สระและกระโดดกลับไปที่ 0 ที่ช่องว่าง) จากนั้นสำหรับแต่ละบรรทัดให้ทำซ้ำสตริง แต่แทนที่อักขระที่มีหมายเลขบรรทัดที่แตกต่างกันด้วยช่องว่าง .


3

K, 81 72 70 66 ไบต์

มันเป็นการเริ่มต้น:

`0:{+{(-z)!y,x#" "}[|/s].'x,'s:,/{+\{12>"aeiouyAEIOUY"?x}'x}'(0,&~{"  "?x}'x)_ x}

ตัวอย่างการใช้งาน:

  `0:{+{(-z)!y,x#" "}[|/s].'x,'s:,/{+\{12>"aeiouyAEIOUY"?x}'x}'(0,&~{"  "?x}'x)_ x} "Programming Puzzles and Code Golf"
Pr          P           C    G   
  ogr        uzzl   and  od   olf
     amm         es        e     
        ing                      
  `0:{+{(-z)!y,x#" "}[|/s].'x,'s:,/{+\{12>"aeiouyAEIOUY"?x}'x}'(0,&~{"  "?x}'x)_ x} "YEAh UppErcAsE VOwEls"
               V     
Y    Upp        Ow   
 E      Erc       Els
  Ah       As        
             E       

แก้ไข 1:

ดีกว่า ทำการปรับปรุงระดับพื้นผิว:

`0:{+{(-z)!y,x#" "}[|/s].'x,'s:,/{+\{12>"aeiouyAEIOUY"?x}'x}'(0,&~{"  "?x}'x)_ x}
`0:{+{(-z)!y,x#" "}[|/s].'x,'s:,/(+\12>?["aeiouyAEIOUY"]')'_[0,&" "=x]x}

โดยเฉพาะอย่างยิ่งผมกลับอาร์กิวเมนต์สำหรับ?เมื่อผมดำเนินการค้นหาเสียงสระและกำจัดความจำเป็นสำหรับแลมบ์ดาจึงทำผกผันเหมือนกันกับ_ที่ผมแยกคำในช่องว่างและฉันตระหนักว่า~{" "?x}'xเป็นจริงๆโง่วิธี overcomplicated " "=xพูดว่า

แก้ไข 2:

อีกระดับของพื้นผิวที่บิดเบี้ยวsก่อนนำไปใช้กับแลมบ์ดา

`0:{+{(-z)!y,x#" "}[|/s].'x,'s:,/(+\12>?["aeiouyAEIOUY"]')'_[0,&" "=x]x}
`0:{+{z!y,x#" "}[|/s].'x,'-s:,/(+\12>?["aeiouyAEIOUY"]')'_[0,&" "=x]x}

แก้ไข 3:

ตกลงมาเป็นวิธีที่แตกต่างกันในการคำนวณออฟเซ็ตสำหรับแต่ละตัว แทนที่จะแยกลำดับที่ช่องว่างและคำนวณผลรวมสะสม ( +\) ของตำแหน่งของสระเราสามารถดำเนินการกับสตริงอินพุตทั้งหมดในหนึ่งรอบการคูณผลรวมสะสมด้วย 0 เมื่อใดก็ตามที่เราพบช่องว่าง ฉันต้องการการปฏิเสธของลำดับนี้ดังนั้นฉันสามารถลบแทนการเพิ่มเมื่อฉันสแกนและใช้ number-of-different ( #?) แทน max ( |/) เมื่อฉันคำนวณจำนวนของการเติมในแนวดิ่ง

`0:{+{z!y,x#" "}[|/s].'x,'-s:,/(+\12>?["aeiouyAEIOUY"]')'_[0,&" "=x]x}
`0:{+{z!y,x#" "}[#?s].'x,'s:1_0{(~" "=y)*x-12>"aeiouyAEIOUY"?y}\x}

ที่บันทึกอีก 4 ตัวอักษร วุ้ย


2

ทับทิม: 135 131 124 115 112 ตัวละคร

a=[]
y=l=0
gets.split(r=/(?=[aeiouy ])/i).map{|w|w=~r&&y+=1
w<?A&&y=0
a[y]='%*s%s'%[-l,a[y],w]
l+=w.size}
puts a

วิ่งตัวอย่าง:

bash-4.3$ ruby staircase.rb <<< 'Programming Puzzles and Code Golf'
Pr          P           C    G
  ogr        uzzl   and  od   olf
     amm         es        e
        ing

ถ้าฉันไม่เข้าใจผิดคุณสามารถทำให้ regex ของคุณสั้นลง/(?=[aeiouy ])/iได้
Alex A.

อ้าคุณพูดถูกแล้ว @AlexA การแยกคำนั้นมีความสำคัญสำหรับทฤษฎีก่อนหน้านี้เท่านั้น ขอบคุณ
จัดการ

2

C, 192 ไบต์

f(char*s){int l=0,r=1,v,c;for(;r;l=1){v=l;r=0;char*p;for(p=s;*p;++p){c=*p;if(c==' ')v=l,putchar(c);else if((strchr("aoeuiyAOEUIY",c)?--v:v)<0)r=1,putchar(' ');else*p=' ',putchar(c);}puts(p);}}

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

เวอร์ชันที่อ่านได้

f(char *s) {
    int l=0,       /* true if we've done the first line (no vowels) */
        r=1,       /* true if characters remain in buffer */
        v,         /* how many vowels to print from current word */
        c;         /* current character value */
    for (l=0; r; l=1) {
        v = l;
        r = 0;
        char *p;
        for (p=s;*p;++p) {
            c=*p;
            if (c==' ') {       /* a space - reset vowel counter */
                v=l;
                putchar(c);
            } else if ((strchr("aoeuiyAOEUIY",c)?--v:v)<0) {
                /* vowel conter exceeded - print a space */
                putchar(' ');
                r=1;
            } else {
                /* print it, and obliterate it from next line of output */
                putchar(c);
                *p=' ';
            }
        }
        puts(p); /* p points at the NUL, so this just prints a newline */
    }
}

' '-> 32และf(char*s){int l=0,r=1,v,c;->l,r=1,v,c;f(char*s){
Spikatrix

@ คูล - ' ' อาจเป็นไปได้32แต่มันก็ขึ้นอยู่กับการเข้ารหัสของตัวละครและอย่างที่ฉันบอกว่าฉันทำแบบพกพา C. การลดความชัดเจนintเป็นสิ่งที่ดี แต่ - ไม่แน่ใจว่าทำไมฉันลืมไป!
Toby Speight

2

Python 3, 265 207 202 185 177 ตัวอักษร

i=input()
w,e=i.split(" "),lambda:[[" "]*len(i)]
o,x=e(),0
for p in w:
    y=0
    for c in p:
        if c in"AEIOUYaeiouy":o+=e();y+=1
        o[y][x],x=c,x+1
    x+=1
for l in o:print("".join(l))

มันแย่มากและฉันก็ไม่ภูมิใจ ฉันรู้ว่านี่สามารถทำให้สั้นลง แต่ฉันคิดว่าฉันจะโพสต์ต่อไป

แรงบันดาลใจจากรุ่น C มันจะสร้างรายการที่เต็มไปแล้วในขณะที่ภายในสตริงการป้อนข้อมูล


2

GNU Sed, 151 + 1

(+1 ตามต้องการ-rแฟล็ก)

s/^/ /;h;s/[aoeuiy]/_/ig;:a;s/_[^ _]/__/;ta;y/_/ /;g;:x;:b;s/ [^ aoeuiy]/  /i;tb;h;s/([^ ])[aoeuiy]/\1_/ig;:c;s/_[^ _]/__/;tc;y/_/ /;g;s/ [^ ]/  /ig;tx

ฉันคิดว่า sed จะเป็นเครื่องมือสำหรับงานนี้ แต่พบว่ามันยากอย่างน่าประหลาดใจ

รุ่นที่อ่านได้:

#!/bin/sed -rf

# make sure the string starts with a space
s/^/ /
h

# print leading consonants, if any
s/[aoeuiy]/_/ig
:a
s/_[^ _]/__/
ta
y/_/ /
p
g

:x
# strip the consonants just printed
:b
s/ [^ aoeuiy]/  /i
tb
h

s/([^ ])[aoeuiy]/\1_/ig
:c
s/_[^ _]/__/
tc
y/_/ /
p
g
# remove leading vowel of each word
s/ [^ ]/  /ig
tx

ฉันกลัวว่าควรเป็น 128 ตัวอักษร เวอร์ชันหนึ่งบรรทัดหายไปpดังนั้นจึงไม่มีผลอะไร ปัญหาเล็ก ๆ คือเอาต์พุตเริ่มต้นด้วยพื้นที่เพิ่มเติม ปัญหาใหญ่คือข้อความชิ้นแรกที่เริ่มต้นด้วยสระจะหายไป
จัดการ

ฉันแน่ใจว่ามันทำงานก่อนหน้านี้ ฉันจะดูและดูว่าฉันหักอะไรไป ขอบคุณสำหรับหัวหน้า @manatwork!
Toby Speight

ผมผิดที่จะกระโดดลงห่วงเนื่องจากเส้นก่อนc txฉันได้คืนสถานะเวอร์ชันก่อนหน้าด้วยลูปที่คล้ายกันแล้วและฉันจะลองอีกครั้งในภายหลัง
Toby Speight

2

Python 2, 145 142 Bytes

อาจจะไม่สามารถแข่งขันได้กับวิธีอื่น ๆ แต่ฉันคิดว่านี่เป็นวิธีที่ยอดเยี่ยมในการใช้ regex

import re;s=I=input()[::-1]+" ";i=0
while s.strip()or i<2:s=re.sub("(?!([^aeiouy ]*[aeiouy]){%s}[^aeiouy]* )."%i," ",I,0,2)[::-1];print s;i+=1

regex (?!([^aeiouy ]*[aeiouy]){N}[^aeiouy]* ).จับคู่อักขระเดี่ยวใด ๆ ที่ไม่อยู่ในกลุ่มตัวอักษร N-th ตั้งแต่ท้ายคำ เนื่องจากนับจากจุดสิ้นสุดของโลกฉันย้อนกลับสตริงก่อนและหลังและฉันยังต้องเพิ่มช่องว่างในตอนท้าย แต่หลังจากนั้นมันกลายเป็นเรื่องง่ายของการใช้re.subเพื่อแทนที่ทุกตัวอย่างของตัวละครเหล่านี้ด้วยช่องว่าง มันทำเช่นนี้สำหรับทุกค่าของ N จนกระทั่งสตริงว่างเปล่า


ในฐานะที่เป็นคนดีและสามารถอ่านได้ก็คือการใช้re.Iคุณสามารถบันทึก 3 2ไบต์โดยการแทนค่าธงที่เหมาะสมคือ
Sp3000

1
@ Sp3000 เฉพาะในโค้ดกอล์ฟเท่านั้นที่มีความสัมพันธ์เชิงลบกับ "nice and readable"
KSab

1

คู่, 132 129 ตัวอักษร

p=1;x=[];y=input(0);for j=1:numel(y);if regexpi(y(j),'[aeiouy]');p+=1;elseif y(j)==" ";p=1;end;x(p,j)=y(j);end;x(x==0)=32;char(x)

ทดสอบ

การป้อนข้อมูล: "YEAh UppErcAsE VOwEls"

เอาท์พุท:

               V     
Y Upp Ow   
 E Erc Els
  อ่าเป็น        
             E       

1

Gema : 53 48 ตัวอักษร

/[aeiouyAEIOUY]/=@append{u;^[[A}^K$1
 = $u@set{u;}

โปรดทราบว่า^[(x1b) และ^K(x0b) เป็นอักขระเดียว (ในตัวอย่างด้านล่างฉันใช้การคัดลอกแปะที่เป็นมิตร\eและ\vเทียบเท่าในกรณีที่คุณต้องการลอง)

วิ่งตัวอย่าง:

bash-4.3$ gema '/[aeiouyAEIOUY]/=@append{u;\e[A}\v$1; = $u@set{u;}' <<< 'Programming Puzzles and Code Golf'
Pr          P           C    G    
  ogr        uzzl   and  od   olf 
     amm         es        e 
        ing 

1

Jelly , 42 ไบต์ (ไม่ใช่การแข่งขัน?)

Ḳµe€Øyœṗ⁸⁶ṁ$;¥\z⁶Zµ€µḷ/⁶ṁW⁸;ḣ®µ€L€Ṁ©$¡ZK€Y

ลองออนไลน์!

ทำไมต้องเจลลี่ :-(


ดูเหมือนว่าจะนานกว่า CJam เสียอีก
ทำให้เสียชีวิต

@ สรุปว่าเป็นเพราะเจลลี่ไม่ได้ไปกับสตริง ... ปกติ นอกจากนี้คุณไม่สามารถเปรียบเทียบกระบวนทัศน์การเขียนโปรแกรมที่แตกต่างกันจริงๆ (cjam เป็นแบบสแต็ก, เยลลี่คือเงียบ)
Erik the Outgolfer
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.