วาดบันไดและเลื่อน


24

งานของคุณคือการสร้างโปรแกรมหรือฟังก์ชั่นที่ใช้เป็นจำนวนธรรมชาติ ( n) ระหว่าง 1 และ 25 (รวม) และพิมพ์การแสดงภาพสามมิติของภาพนิ่งและบันไดที่มีnจำนวนขั้น

ข้อมูลจำเพาะของบันไดและสไลด์

บันไดมักจะอยู่ทางด้านซ้ายและเลื่อนไปทางขวา เรากำลังดูมันจากด้านข้างบันไดดังนั้นส่วนหนึ่งของสไลด์จะถูกบดบังในสามระดับบนสุด rungs แสดงด้วยสี่ขีดกลาง ( ----) และด้านข้างของบันไดและเลื่อนด้วยเครื่องหมายทับ ( /และ\) ต่อไปนี้เป็นแผนภาพเพื่อแสดงรูปแบบของช่องว่างที่จำเป็นสำหรับภาพนิ่งที่มีห้าขั้น

Slide              Blank space count
    /----/\        1234/----/\ 
   /----/  \       123/----/12\ 
  /----/    \      12/----/1234\ 
 /----/ \    \     1/----/1\1234\ 
/----/   \    \    /----/123\1234\

ตัวอย่าง

>>1
/----/\

>>3
  /----/\ 
 /----/  \ 
/----/    \ 

>>4
   /----/\ 
  /----/  \ 
 /----/    \ 
/----/ \    \ 

>>10
         /----/\ 
        /----/  \ 
       /----/    \ 
      /----/ \    \ 
     /----/   \    \ 
    /----/     \    \ 
   /----/       \    \ 
  /----/         \    \ 
 /----/           \    \ 
/----/             \    \ 

นี่คือโค้ดกอล์ฟดังนั้นคำตอบที่มีจำนวนไบต์ต่ำสุดจะเป็นผู้ชนะ

หมายเหตุ: พื้นที่สีขาวต่อท้ายเป็นที่ยอมรับในผลลัพธ์ตราบใดที่ไม่เกินความยาวของบรรทัด


14
คุณจะหักขาของคุณในตอนท้ายของสไลด์นั้น!
เสียชีวิต

13
@ สร้างสิ่งที่ต้องการ ... ร้ายแรง
Ven

7
@ ทำให้คะแนนโบนัสสำหรับคุณถ้าคุณวาดพูลที่ด้านล่าง;)
แผนที่

8
@atlasologist สระเลือดหรือไม่
Neil

ขอโทษถ้านี่เป็นคำถามที่โง่ แต่คำตอบสองข้อด้านล่าง (Python, JavaScript) กำหนดฟังก์ชั่นที่ส่งคืนสตริงแทนที่จะพิมพ์ เป็นเพียว ๆ ไหม
Jordan

คำตอบ:


17

เรติน่า , 81 72 52 ไบต์

จำนวนไบต์ถือว่าการเข้ารหัส ISO 8859-1

.+
$* /\    \
^.

+` /(.+)$
$&¶$%`/  $1
/.{5}
/----/

ลองออนไลน์!

คำอธิบาย

โปรแกรมประกอบด้วยสี่ขั้นตอนซึ่งทั้งหมดเป็นการทดแทน regex (พร้อมคุณสมบัติสองประการสำหรับจอประสาทตา) ฉันจะใช้อินพุต5เป็นตัวอย่างสำหรับคำอธิบาย

ด่าน 1

.+
$* /\    \

นี่จะเปลี่ยนอินพุตnเป็นnช่องว่างตามด้วย/\ \ซึ่งจะกลายเป็นส่วนบนของบันได / สไลด์:

     /\    \

สำหรับตอนนี้เราจะแสดงสไลด์แบบเต็มและแสดงบันไดทางซ้ายมือ/เท่านั้น

ด่าน 2

^.

น่าเสียดายที่nช่องว่างเป็นหนึ่งมากกว่าที่เราต้องการดังนั้นเราจึงลบอักขระแรกอีกครั้ง เราได้รับ:

    /\    \

ด่าน 3

+` /(.+)$
$&¶$%`/  $1

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

ตัว+บอกให้ Retina ทำซ้ำขั้นตอนนี้ในลูปจนกว่าเอาต์พุตจะหยุดการเปลี่ยนแปลง (ในกรณีนี้เนื่องจาก regex หยุดการจับคู่) สำหรับ regex นั้นเราเพียงแค่จับคู่/ในบรรทัดสุดท้ายและทุกอย่างที่อยู่หลังมันและเราก็จับคู่หนึ่งช่องว่างไว้ด้านหน้าซึ่งหมายความว่าสิ่งนี้ไม่สามารถจับคู่ได้อีกต่อไปเมื่อ/ถึงคอลัมน์แรกแล้ว

นี่คือสิ่งที่เราแทนที่ด้วย:

 $&    The match itself. We don't want to remove the line we already have.
 ¶     A linefeed, because we want to append a new line.
 $%`   This is a very recent addition to Retina: it's like the normal $` but
      is bounded by linefeeds. That means this inserts everything in front
      of the match which is on the same line. In particular this one space
      less than the indentation of the matched line, hence we are shifting
      the / one column left.
 /     A literal /, representing the left edge of the ladder.
>  <   Two spaces, so that we can shift the slide one column right.
 $1    Capturing group 1 which contains the slide and its separation from
      the ladder.

ดังนั้นในการวนซ้ำแต่ละครั้งสิ่งนี้จะเพิ่มหนึ่งบรรทัดในสตริงจนกว่าเราจะจบลงด้วยสิ่งนี้:

    /\    \
   /  \    \
  /    \    \
 /      \    \
/        \    \

ด่านที่ 4

/.{5}
/----/

สิ่งที่เหลืออยู่ก็คือการทำให้บันไดถูกต้อง นั่นง่ายจริงๆเราแค่จับคู่กับ/ตัวละคร 5 ตัวถัดไปแล้วใส่ตัวแทนบันไดที่ถูกต้องลงไปดังนั้นจึงแทนที่สไลด์หรือช่องว่างที่มีอยู่แล้ว:

    /----/\
   /----/  \
  /----/    \
 /----/ \    \
/----/   \    \

9

V , 38, 37, 36, 34, 33, 32, 31, 30 29 ไบต์

Àé r\2é/4é-òhYpX$2P^ò3GEòjlr\

ลองออนไลน์!

ฉันอาจติดต่อกับ Osabie หนึ่งไบต์สั้นกว่า Osabie\o/ผูกด้วย 2sable! สั้นลงหนึ่งไบต์!

ในข่าวอื่น ๆ นี่เป็นส่วนหัวที่ยาวที่สุดที่ฉันเคยทำมา

คำอธิบาย:

Àé              "Insert 'arg1' spaces
   r\           "Turn the last one into a '\'
     2é/        "Insert 2 '/'
        4é-     "Insert 4 '-'

ò        ò      "Recursivly:
 h              "  Move one to the left
  Yp            "  Duplicate this line
    X           "  Delete one space from the left
     $2P        "  Paste two spaces at the end of this line
        ^       "  Move back to the beginning of this line.

สิ่งนี้จะทำงานจนกว่าข้อผิดพลาดจะเกิดขึ้นซึ่งต้องขอบคุณคำสั่ง "ย้ายไปทางซ้าย" ('h') จะเป็นเวลา 'arg1'

ตอนนี้เราแค่ต้องเพิ่มขาด้านใน

3GE             "Move to the second slash of line 3
   ò    ò       "Recursively: (The second 'ò' is implicit)
    jl          "  Move down and to the right
      r\        "  And replace the character under the cursor with a '\'

รุ่นที่ไม่ใช่คู่แข่ง (28 ไบต์)


8

Pyth, 39 35 ไบต์

VQ++*dt-QN"/----/">+*+ddN"\    \\"5

คำอธิบาย:

VQ                                  # Interate over 0 -> Q-1 (Q is the input)
  +                                 # Concatenate the 2 halfs of the slide
   +                                # Concatenate the whitespace block and the ladder
    *d                              # Multiply d (whitespace) by this number \/
      t-QN                          # Calculate the amount of spaces before : input - step of the iterarion -1
          "/----/"                  # Ladder
                  >               5 # Remove the first 5 chars  from the string generated in the following lines 
                   +                # Concatenate the whitespace block and the slide
                    *+ddN           # Multiply "+dd" (2 whitespace) by the step of the iterarion to generate the space between the ladder and the slide
                         "\    \\"  # Slide

ทดสอบที่นี่


8

2sable , 40 36 32 30 ไบต์

Hmmm, V ใกล้เข้ามาแล้ว ...

F¹N-<ð×…/--«ðð«N×…\  ««5F¦}¶

ใช้การเข้ารหัสCP-1252 ลองรุ่นที่รองรับ 05AB1E! .


และการต่อสู้ที่ดุเดือดบน: codegolf.stackexchange.com/a/85985/31716 :P
DJMcMayhem

@DrGreenEggsandIronMan อืมม !!?!?!
Adnan

มีอีกแล้วและอีกครั้งเมื่อฉันกลับถึงบ้าน นอกจากนี้ฉันไม่ได้เปลี่ยนภาษา : P
DJMcMayhem

7

PowerShell v2 +, 99 90 82 ไบต์

param($n)1..$n|%{" "*($n-$_)+"/----/"+-join(" "*($_+$i++)+"\    \")[6..(6+$_+$i)]}

จะเข้า$nเริ่มห่วงจาก1การที่มี$n |%{...}การวนซ้ำแต่ละครั้งเรากำลังสร้างสตริง เราเริ่มต้นด้วยจำนวนช่องว่าง" "*($n-$_)และบันไดที่เหมาะสม"/----/"เหมาะสม

การที่เราเพิ่มสตริงอื่นที่ได้รับการหั่น[...]และ-joinเอ็ดกลับมารวมกัน สตริงที่สองคือสไลด์และเราคิดว่าสไลด์ทั้งหมดสามารถมองเห็นได้เสมอ มันเป็นจำนวนของช่องว่างก่อนสไลด์จะเริ่มต้นตามด้วยการสไลด์ตัวเอง" "*($_+$i++) "\ \"สิ่งนี้จะถูกแบ่งตามช่วงที่คำนวณได้ว่าเป็นส่วนหนึ่งของ "ช่องว่างพร้อมสไลด์" ที่ซ่อนอยู่บางส่วนโดยบันได

ตัวอย่าง

PS C:\Tools\Scripts\golfing> .\draw-a-ladder-and-slide.ps1 7
      /----/\
     /----/  \
    /----/    \
   /----/ \    \
  /----/   \    \
 /----/     \    \
/----/       \    \

PS C:\Tools\Scripts\golfing> .\draw-a-ladder-and-slide.ps1 15
              /----/\
             /----/  \
            /----/    \
           /----/ \    \
          /----/   \    \
         /----/     \    \
        /----/       \    \
       /----/         \    \
      /----/           \    \
     /----/             \    \
    /----/               \    \
   /----/                 \    \
  /----/                   \    \
 /----/                     \    \
/----/                       \    \

7
+1 เนื่องจากเครื่องหมายสแลชในไดเรกทอรีของคุณตรงกับเครื่องหมายสแลชในเอาต์พุตทดสอบ :D
DJMcMayhem

\golfingโฟลเดอร์ของคุณจะต้องมีการจัดระเบียบมาก._.
Conor O'Brien

6

Python 2 - 79 76 75 ไบต์

x=input()
for i in range(x):print(x-i)*' '+'/----/'+(i*'  '+'\\    \\')[5:]

ขอบคุณ Hubert Grzeskowiak สำหรับ "ตัดสิทธิ์" ฉันตั้งแต่การพิมพ์โปรแกรมของฉันบันทึกจริง 3 ไบต์! ขอบคุณEʀɪᴋᴛʜᴇGᴏʟғᴇʀที่ช่วยประหยัดอีก 1 ไบต์!


ดี! โดยวิธีแลมบ์ดาก็โอเคฉันคิดว่าเนื่องจากการพูดอย่างเคร่งครัดมันเป็นฟังก์ชั่น การใช้แลมบ์ดาคุณสามารถบันทึกบรรทัดใหม่และช่องว่าง :-)
Hubert Grzeskowiak

เดี๋ยวก่อนฉันลองแลมด้าจริง ๆ แล้วใช้ไม่ได้ มันเป็นสำเนาของ BC ฉันเดาเหรอ?
Hubert Grzeskowiak

@HubertGrzeskowiak มันขึ้นอยู่กับข้อกำหนดของความท้าทาย หากคำถามถามหาโปรแกรม / ฟังก์ชั่นที่คืนค่าการแสดงสตริงของภาพนิ่งคำตอบของฉันจะใช้ได้ เนื่องจากมันระบุว่า "print" ตามที่คุณต้องการฉันจะต้องตั้งชื่อฟังก์ชั่นแลมบ์ดาและพิมพ์การโทรหรือทำสิ่งที่ฉันทำด้านบนซึ่งสั้นกว่า
Cowabunghole

รายละเอียดไม่ได้บอกว่าฟังก์ชั่นจะต้องมีชื่อหรือถูกเรียกว่า ;-)
23416 Hubert Grzeskowiak

แปลงเป็นโปรแกรมเต็ม: แทนที่def f(x):ด้วยx=input()และลบการเยื้องในบรรทัดที่สอง วิธีนี้จะช่วยให้คุณประหยัด 1 ไบต์
Erik the Outgolfer

6

เป็นกลุ่ม 71 การกดแป้น

นี่เป็นวิธีที่โง่มากในการทำ แต่มันสนุกดี อินพุตถูกกำหนดเป็นไฟล์ข้อความที่มีบรรทัดเดียวที่มีจำนวนเต็ม นี่น่าจะเป็นเรื่องที่เล่นได้ง่าย แต่ตอนนี้จะต้องทำตอนนี้ ( แก้ไข: เปลี่ยนสไตล์ของอักขระควบคุมตามคำขอ )

A@qyyPgg<c-v><c-v>GkI <c-v><esc>G$i  <c-v><esc><esc>
Tq"qDI/----/\^[lD@"ddh<c-v>god:%s/     \\/\\    \\<cr>

<c-v>, <esc>และ<cr>มีการกดแป้นพิมพ์ทั้งหมดของแต่ละบุคคล ctrl + v, escape และ carriage return (enter) ตามลำดับ สำหรับเวอร์ชันย่อยที่เรียบง่ายด้วยตัวอักษรที่ถูกต้องนี่คือไฟล์ที่ladder.keysเรียกใช้xxd:

00000000: 4140 7179 7950 6767 1616 476b 4920 161b  A@qyyPgg..GkI ..
00000010: 4724 6920 2016 1b1b 5471 2271 4449 2f2d  G$i  ...Tq"qDI/-
00000020: 2d2d 2d2f 5c1b 6c44 4022 6464 6816 676f  ---/\.lD@"ddh.go
00000030: 643a 2573 2f20 2020 2020 5c5c 2f5c 5c20  d:%s/     \\/\\
00000040: 2020 205c 5c0d 0d0a                         \\...

ในการทดลองใช้ (สมมติว่าห้ามใช้เครื่องมือที่เหมาะสม) ลองทำตามขั้นตอนด้านบน xxd -rladder.keysและใส่ในแฟ้ม สร้างไฟล์ที่ladder.txtมีจำนวนเต็ม จากนั้นทำ:

vim -s ladder.keys -u NONE ladder.txt

เรามักจะเขียน^Vตาม<c-v>ที่นี่
Leun Nun

@ จอร์แดนพวกเขาเป็นหนึ่งในการกดแป้นพิมพ์แต่ละครั้งนับกุญแจที่แก้ไข (shift, ctrl หรือ alt ด้วยปุ่มอื่น) เป็นหนึ่งการกดแป้น การกดแป้นคือ Ctrl + v, หลบหนีและเข้า
algmyr

@algmyr ความผิดพลาดของฉัน ฉันอ่านคำตอบของคุณผิดก่อนหน้านี้
Jordan

6

ทุบตี, 61

for((;i<$1;)){ printf "%$[$1+i]s\    \^M%$[$1-++i]s/----/\n";}

ที่^Mเป็นรถกลับที่แท้จริง

$ ./ladder 1
/----/\
$ ./ladder 4
   /----/\
  /----/  \
 /----/    \
/----/ \    \
$ ./ladder 10
         /----/\
        /----/  \
       /----/    \
      /----/ \    \
     /----/   \    \
    /----/     \    \
   /----/       \    \
  /----/         \    \
 /----/           \    \
/----/             \    \

ฉันคิดว่าคุณควรมีช่องว่างเดียวระหว่าง/และ `\ 'ในแถวที่ 4 และ 1 ช่องว่างที่น้อยกว่าระหว่างขอบสไลด์
Leibrug

ควรเป็น 4 ขีดกลางไม่ใช่ 5
algmyr

@algmyr ขอบคุณที่ช่วยประหยัด 2 ไบต์
izabera

5

JavaScript (ES6), 79 ไบต์

f=
n=>" ".repeat(n).replace(/./g,"$'/$`$`\\    \\\n").replace(/\/...../g,"/----/")
;
<input type=number min=0 oninput=o.textContent=f(this.value)><pre id=o>

ทำงานโดยใช้nช่องว่างจากนั้นทำการแทนที่บางส่วนที่แปลกใหม่เพื่อรับสไลด์ด้วยการสนับสนุนจากนั้นแทนที่การสนับสนุนด้วยบันได


4

Ruby, 61 ไบต์

->n{n.times{|i|puts"%*s\\    \\\r%*s----/"% [n+i,"",n-i,?/]}}

Ungolfed

->(num_rows) {
  num_rows.times {|row_idx|
    puts "%*s\\    \\\r%*s----/" % [ num_rows + row_idx, "", num_rows - row_idx, "/" ]
  }
}

ฉันสามารถบันทึกสองไบต์โดยใช้ '%*s\ \^M%*s----/' (ซึ่ง^Mเป็นตัวอักษรกลับรถ) สำหรับสตริงรูปแบบ แต่จากนั้นทับทิมพิมพ์คำเตือน "warning: encountered \r in middle of line, treated as a mere space " ¯ \ _ (ツ) _ / ¯

โซลูชันก่อนหน้า (64 ไบต์)

->n{n.times{|i|puts" "*(n+i)+"\\    \\\r"+" "*(n-i-1)+"/----/"}}

3

แบตช์ 194 ไบต์

@echo off
for /l %%i in (1,1,%1)do call:l %1 %%i
exit/b
:l
set s=\    \
for /l %%j in (1,1,%2)do call set s=  %%s%%
set s=/----/%s:~7%
for /l %%j in (%2,1,%1)do call set s= %%s%%
echo%s%

กลายเป็นตรงไปตรงมาพอสมควร: เยื้องสไลด์ลบ 7 ตัวอักษรแรกเยื้องบันไดลบพื้นที่นำ บิตสุดท้ายนี้เกี่ยวข้องกับการใช้เล่ห์เหลี่ยมเล็กน้อย!


2

Java, 116 ไบต์

c->{for(int i=0;i<c;i++)System.out.format("%"+(5+c-i)+"s%"+(i<3?i*2+1:2*(i-2))+"s%5s\n","/----/","\\",i<3?"":"\\");};

น่าเสียดายที่คุณไม่สามารถ [ซ้ำ ๆ ] สตริงที่ซ้ำกันใน Java ได้ง่ายดังนั้นฉันจึงใช้ฟังก์ชันรูปแบบที่ไม่เหมาะสม




0

eacal , ไม่ใช่การแข่งขัน, 386 ไบต์

init .
define @ curry push .
define ~ curry exec .--func
alias $ strap
alias ' string
set n set m cast number arg number 0
set s empty string
label l
@ get n
set n ~ dec
@ space
@ get n
$ ~ repeat
$ ' /----/
@ space
@ get m
@ get n
@ ~ sub
@ ~ dec
@ number 2
@ ~ mul
$ ~ repeat
$ ' \
$ newline
@ get n
@ number 0
if ~ more
goto l
@ $
@ regex gm '   ( {4})(?=.$)
@ '  \$1
print ~ replace

ฉันทำให้ภาษา verbose เป็นทางการที่สุดเท่าที่จะเป็นไปได้ฉันแสดงความคิดเห็นด้วยความตลกขบขันและเสียดสี กรุณาใจเย็น ๆ. คำแนะนำเกี่ยวกับวิธีการทำงานใน repo github ที่เชื่อมโยงในส่วนหัว

Ungolfed

init .
set n set m cast number arg number 0
set s empty string
label loop
    push . get n
    set n exec .--func dec
    push . space
    push . get n
    strap exec .--func repeat
    strap string /----/
    push . space
    push . get m
    push . get n
    push . exec .--func sub
    push . exec .--func dec
    push . number 2
    push . exec .--func mul
    strap exec .--func repeat
    strap string \
    strap newline
    push . get n
    push . number 0
    if exec .--func more
        goto loop

push . strap
push . regex gm string   ( {4})(?=.$)
push . string  \$1
print exec .--func replace

1
" ฉันทำภาษา verbose มากที่สุดอย่างเป็นทางการ " ขอโทษด้วยคุณได้ยิน AppleScript ไหม?
Addison Crump

@VTCAKAVSMoACE เอาล่ะมาทำข้อตกลงกันเถอะ คุณตอบคำถามนี้ในภาคผนวก จากนั้นฉันจะบอกคุณว่านี่เป็นสิ่งที่ละเอียดยิ่งขึ้น
Conor O'Brien

4
มันไม่เพียงพอหากคุณสามารถปลดปล่อยมันได้
Neil

@VTC, TimmyD และ Neil: Geez คุณมีความสุขตอนนี้เหรอ?
Conor O'Brien

@ CᴏɴᴏʀO'Bʀɪᴇɴเห็นได้ชัดว่าเราล้อเล่นฮ่า ๆ ๆ
แอดดิสันครัมพ์
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.