はしごを描いてスライドさせる


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
そのスライドの最後で足を折るでしょう!
16

13
@Fatalizeそれは...致命的です。
ヴェン

7
一番下にプールを引くと、ボーナスポイントがファタライズされます;)
アトラロジスト

8
@atlasologist血液のプール?
ニール

これは馬鹿げた質問ですが、以下の回答(Python、JavaScript)が、文字列を出力するのではなく返す関数を定義している場合はおApびします。そのコーシャですか?
ヨルダン

回答:


17

網膜81 72 52バイト

バイトカウントはISO 8859-1エンコードを前提としています。

.+
$* /\    \
^.

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

オンラインでお試しください!

説明

このプログラムは4つのステージで構成され、そのすべてが正規表現の置換です(Retina固有の機能がいくつかあります)。5説明の例として入力を使用します。

ステージ1

.+
$* /\    \

これにより、入力nnスペースに変わり、その後に/\ \ラダー/スライドの上部が続きます。

     /\    \

ここでは、スライドを完全に表示し、ラダーを左側のみで表し/ます。

ステージ2

^.

あいにく、nスペースは必要なスペースよりも1つ多いため、最初の文字を再度削除します。私たちは今持っています:

    /\    \

ステージ3

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

完全な構造を展開する時間です。最上部がどこにあるかを知ることは、全体を構築するのに十分です。なぜなら、ラダーとスライドを2つのスペースだけ離して、一度に1行ずつ単純に拡張できるからです。

+出力は、(正規表現のマッチングを停止するため、この場合には)変化しなくなるまでループでこの段階を繰り返す網膜に伝えます。正規表現自体/については、最後の行とそれ以降のすべてを一致させるだけでなく、その前にある1つのスペースも一致させ/ます。つまり、最初の列に到達すると一致しなくなります。

これを次のものに置き換えます。

 $&    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.

したがって、各反復で、これで文字列に1行が追加されます。

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

ステージ4

/.{5}
/----/

残っているのは、はしごを正しくすることです。これは本当に簡単です。/次の5文字と一致して正しいラダー表現を挿入するだけで、既に存在するスライドまたはスペースをオーバーライドします。

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

9

V38、37、36、34、33、32、31、30 29バイト

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

オンラインでお試しください!

私は可能性がある Osabieに追いつきます。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

2sable40 36 32 30バイト

うーん、Vはひどく近くに来ています...

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

CP-1252エンコードを使用します。05AB1E互換バージョンをお試しください!


そして、戦いは激化している:codegolf.stackexchange.com/a/85985/31716 :P
DJMcMayhem

@DrGreenEg​​gsandIronManうーん!!?!?!
アドナン

もう1つ、そして家に帰るともう1つあります。また、私は言語を切り替えいません。:P
DJMcMayhem

7

PowerShell v2 +、99 90 82バイト

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

入力を受け取り$n、からループを開始1する$n|%{...}。繰り返しごとに、文字列を作成しています。適切な数のスペース" "*($n-$_)とはしごから始めます"/----/"

そのために、我々はスライスされています別の文字列を追加[...]し、-join一緒にバック編を。2番目の文字列はスライドです。スライド全体が常に表示されていると想定しています。これは、スライドが開始される前のスペースの数で" "*($_+$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フォルダに非常に組織化されなければならない._.
コナー・オブライエン

6

Python 2-79 76 75バイト

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

プログラムを印刷すると実際に3バイト節約されたので、私を「失格」にしたHubert Grzeskowiakに感謝します。さらに1バイトを節約してくれたEʀɪᴋᴛʜᴇGᴏʟғᴇʀにも感謝します!


いいね!ちなみに、厳密にはラムダは一種の機能なので、ラムダは大丈夫だったと思います。ラムダを使用して、あなたが改行やスペースを節約することができます:-)
ヒューバートGrzeskowiak

待って、私は実際にラムダでそれを試してみましたが、動作させることができませんでした。それは印刷の紀元前だと思う?
ユベール・グジェスコウィアック

@HubertGrzeskowiakまあ、チャレンジ仕様に依存します。質問がスライドの文字列表現を返すプログラム/関数を要求した場合、私の答えのいずれかが有効になります。あなたが指摘したように「印刷」を指定しているので、ラムダ関数に名前を付けて呼び出しを印刷するか、上記の短い方を実行する必要があります。
Cowabunghole

仕様では、関数に名前を
付ける

完全なプログラムに変換します置き換えるdef f(x):x=input()、2行目にインデントを削除します。これにより、1バイト節約できます。
エリックアウトゴルファー16

6

Vim、71キーストローク

これは非常に愚かなやり方ですが、少し楽しいです。入力は、整数を含む1行のテキストファイルとして提供されます。これはおそらくかなりゴルフに適していますが、今のところは実行します(編集:要求に応じて制御文字のスタイルを切り替えます

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、エスケープ、キャリッジリターン(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                         \\...

(適切なツールを使用してnixを想定して)試してみるには、上記の手順を実行xxd -rし、ファイルを実行しますladder.keysladder.txt整数を含むファイルを作成します。それから:

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

私たちは通常ここに書い^Vてい<c-v>ます。
リーキー修道女

@Jordanこれらはそれぞれ1つのキーストロークであり、変更されたキー(shift、ctrl、またはaltと別のキー)を1つのキーストロークとしてカウントします。キーストロークは、Ctrl + v、エスケープ、およびエンターです。
アルグミー

@algmyr私の間違い。先にあなたの答えを読み違えました。
ヨルダン

6

bash、61

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

^Mリテラルのキャリッジリターンはどこですか

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

/4行目には「と」の間に1つのスペースがあり、スライドの端には1つ少ないスペースが必要だと思います。
ライブルグ

5ではなく4つのダッシュにする必要があります。
algmyr16年

@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,?/]}}

非ゴルフ

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

を使用して2バイト節約できました '%*s\ \^M%*s----/'^Mフォーマット文字列に(リテラルキャリッジリターン)をましたが、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

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で文字列を(簡単に)複製することはできないので、フォーマット関数を乱用することになります。


2

Scala、95バイト

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

2

Haskell、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バイト節約します。
リン

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

私は公式に可能な限り最も冗長な言語を作成しました。コメントをjestとsarcasmで作成しました。落ち着いてください。ヘッダーにリンクされたgithubリポジトリでの実行方法に関する指示。

非ゴルフ

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について聞いたことがありますか
アディソンクランプ

@VTCAKAVSMoACEよし、取り引きしよう。Applescriptでこの質問に答えます。次に、これがより冗長であることを伝えます。
コナーオブライエン

4
あなたがそれをアンゴルフできるなら、それは十分に冗長ではありません。
ニール

@ VTC、TimmyD、およびニール:そうね。あなたは今幸せですか?
コナーオブライエン

@CᴏɴᴏʀO'Bʀɪᴇɴ私たちは明らかに冗談を言っています、笑
Addison Crump
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.