사다리를 그리고 슬라이드


24

당신의 임무는 입력으로 n1에서 25 사이 의 자연수 ( ) 를 취하고 슬라이드와 사다리의 아이소 메트릭 표현 n을 렁의 수로 인쇄하는 프로그램이나 함수를 만드는 것 입니다.

사다리 및 슬라이드 사양

사다리는 항상 왼쪽을 향하고 슬라이드는 오른쪽을 향합니다. 사다리 쪽에서보고 있으므로 슬라이드의 일부가 최상위 3 단계에서 가려져 있습니다. 렁은 4 개의 대시 ( ----)와 사다리의 측면으로 표시되며 슬래시 ( /\)로 슬라이드됩니다 . 다음은 5 개의 렁이있는 슬라이드에 필요한 공간 패턴을 나타내는 다이어그램입니다.

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

>>1
/----/\

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

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

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

이것은 코드 골프이므로 바이트 수가 가장 적은 답이 이깁니다.

참고 : 줄의 길이를 초과하지 않는 한 출력에서 ​​후행 공백이 허용됩니다.


14
당신은 그 슬라이드의 끝에서 다리를 부러 것입니다!
페이탈 라이즈

13
@ 치명적일 것입니다 ... 치명적입니다.
Ven

7
당신이 바닥에 수영장을 그리면 @Fatalize 보너스 포인트;)
atlasologist

8
@atlasologist 혈액의 풀?
Neil

이것이 바보 같은 질문이지만 사과 아래의 두 가지 답변 (Python, JavaScript)은 문자열을 인쇄하는 대신 반환하는 함수를 정의합니다. 정결한가요?
Jordan

답변:


17

레티 나 , 81 72 52 바이트

바이트 수는 ISO 8859-1 인코딩을 가정합니다.

.+
$* /\    \
^.

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

온라인으로 사용해보십시오!

설명

이 프로그램은 4 단계로 구성되며,이 단계는 모두 정규식 대체 (Retina- 특정 기능 몇 개)입니다. 5설명을 위해 입력 을 예로 사용하겠습니다 .

스테이지 1

.+
$* /\    \

그러면 입력 nn공백 으로 바뀌고 /\ \사다리 / 슬라이드의 상단이됩니다.

     /\    \

지금은 슬라이드 전체를 표시하고 왼쪽 만 사다리를 나타냅니다 /.

2 단계

^.

불행히도 n공백은 필요한 것보다 하나 이상이므로 첫 번째 문자를 다시 제거합니다. 우리는 지금 :

    /\    \

3 단계

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

완전한 구조를 확장 할 시간입니다. 상단이 어디에 있는지 아는 것만으로도 전체를 구축하기에 충분합니다. 사다리와 슬라이드를 두 칸 띄워서 한 번에 한 줄씩 확장하면됩니다.

이 명령 +은 출력이 변경을 멈출 때까지 (이 경우 정규 표현식이 일치하지 않기 때문에) Retina에이 단계를 반복하여 반복하도록 지시합니다. 정규 표현식 자체 /는 마지막 줄과 그 이후의 모든 항목을 일치시키고 그 앞의 공백도 일치 /하므로 첫 번째 열에 도달하면 더 이상 일치 할 수 없습니다 .

우리가 이것을 대체하는 것은 다음과 같습니다.

 $&    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보다 1 바이트 짧습니다. \o/2sable과 연결! 1 바이트 단축!

다른 소식으로, 이것은 내가 만든 가장 긴 취소 선입니다.

설명:

Àé              "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

2 개 , 40 36 32 30 바이트

흠, 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

파이썬 2-79 76 75 바이트

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

내 프로그램을 실제로 인쇄하여 3 바이트를 절약 한 이후 "실격 처리"한 Hubert Grzeskowiak에게 감사드립니다! 1 바이트를 더 절약 한 Eʀɪᴋ ᴛʜᴇ Gᴏʟғᴇʀ에도 감사합니다!


좋은! 그건 그렇고, 람다는 괜찮습니다. 엄밀히 말하면 그것은 일종의 기능이기 때문입니다. 람다를 사용하면 줄 바꿈과 공백을 저장할 수 있습니다 :-)
Hubert Grzeskowiak

잠깐, 실제로 람다로 시도했지만 작동하지 못했습니다. 그것은 인쇄의 기원전입니다.
허버트

@HubertGrzeskowiak 글쎄 그것은 도전 사양에 달려 있습니다. 질문에 슬라이드의 문자열 표현을 반환하는 프로그램 / 기능을 요청한 경우 내 대답 중 하나가 유효합니다. 지적한대로 "print"를 지정하기 때문에 람다 함수의 이름을 지정하고 호출을 인쇄하거나 위에서 수행 한 작업 중 더 짧은 작업을 수행해야했습니다.
Cowabunghole

스펙은 함수의 이름을 지정하거나 ;-)라고 말하지 않습니다.
Hubert Grzeskowiak

전체 프로그램으로 변환 : 대신 def f(x):x=input(), 두 번째 줄에 들여 쓰기를 제거합니다. 이것은 1 바이트를 절약합니다.
Outgolfer 에릭

6

Vim, 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, 이스케이프 및 캐리지 리턴 (입력). 올바른 리터럴로 버전을 간단하게 요약하려면 다음 파일을 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                         \\...

시도해보십시오 (적절한 도구로 nix가 있다고 가정) 위를 수행 xxd -r하고 파일 을 실행 하십시오 ladder.keys. ladder.txt정수가 들어 있는 파일 을 작성하십시오 . 그런 다음 수행하십시오.

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

우리는 일반적 ^V으로 <c-v>여기에 쓴다 .
Leaky Nun

@Jordan 이들은 각각 하나의 키 스트로크로 수정 된 키 (다른 키로 Shift, Ctrl 또는 Alt)를 하나의 키 스트로크로 계산합니다. 키 입력은 Ctrl + v, 이스케이프 및 Enter입니다.
algmyr

@algmyr 내 실수. 나는 당신의 대답을 일찍 읽었습니다.
Jordan

6

강타, 61

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

^M문자 그대로의 캐리지 리턴은 어디에 있습니까?

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

/번째 행에서와 \ 사이에 하나의 공백이 있고 슬라이드 가장자리 사이에 하나의 공백이 있어야한다고 생각합니다 .
Leibrug

5가 아닌 4 개의 대시 여야합니다.
algmyr

@algmyr 2 바이트를 절약 해 주셔서 감사합니다
izabera

5

자바 스크립트 (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

루비, 61 바이트

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

언 골프

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

형식 문자열에 (문자 그대로 캐리지 리턴이있는 '%*s\ \^M%*s----/'^M) 을 사용하여 2 바이트를 절약 할 수 있지만 Ruby는 " 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

자바, 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에서 문자열을 쉽게 복제 할 수 없으므로 형식 함수가 남용됩니다.


2

스칼라, 95 바이트

def l(n:Int)=for(i<- 0 to n-1){println(" "*(n-i-1)+"/----/"+("  "*i+"\\    \\").substring(5))}

2

하스켈, 81 바이트

a n=[1..n]>>" "
f n=[1..n]>>=(\i->a(n-i)++"/----/"++drop 7(a(2*i)++"\\    \\\n"))

do i<-[1..n];a(n-i)++"/----/"++drop 7(a(2*i)++"\\ \\\n")2 바이트를 절약합니다.
Lynn

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

나는 공식적으로 가장 장황한 언어를 만들었습니다. 나는 농담과 풍자에 의견을했다. 진정하십시오. 헤더에 연결된 github repo에서 실행하는 방법에 대한 지침.

언 골프

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
" 공식적으로 가장 장황한 언어를 가능하게했습니다. "실례 합니다. AppleScript에 대해 들어 보셨습니까?
Addison Crump

@VTCAKAVSMoACE 좋아요, 거래합시다. 당신은 applescript로이 질문에 대답합니다. 그런 다음 더 자세한 정보를 알려 드리겠습니다.
코너 오브라이언

4
당신이 그것을 풀 수 있다면 그것은 충분히 장황하지 않습니다.
Neil

@VTC, TimmyD 및 Neil : Geez. 지금 행복하니?
코너 오브라이언

@ CᴏɴᴏʀO'Bʀɪᴇɴ 우리는 분명히 농담하고 있습니다, lol
Addison Crump
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.