コードへの(簡単な)道


30

入力:

  • 整数nであることが保証され、3
  • いずれかである整数d[101]

出力:

場合、北西方向のサイズの道路。場合は北方向。または場合は北東方向。道路の幅は常に3スペース(外側の境界線を含める場合は一般に5スペース)です。さらに、下部に道路の区切り線があり、その後、上に向かって交互に切り替わります。nd=1d=0d=1

いくつかの例:

入力: 出力:n=7,d=1

      / / /
     /   /
    / / /
   /   /
  / / /
 /   /
/ / /

入力:n=4,d=1 出力:

\   \
 \ \ \
  \   \
   \ \ \

チャレンジルール:

  • 画面のどこかに必要な道路を印刷する限り、任意の長さの先頭/末尾スペースおよび/または改行を使用できます。
  • 代わりに、オプションの[1,0,1]あなたはまた、オプションを使用することが許可されている[0,1,2]または[1,2,3]代わりに。また、3つのオプションのどれを3つの方向のどれにマップするかを選択できます。(それが異なる場合、あなたが使用したどのオプションに言及していることを確認し[1,0,1]のために[north-west, north, north-east]!この挑戦の説明で使用されるそれぞれ)
  • 妥当な出力形式であれば問題ありません。最も一般的なのは、もちろんSTDOUTに出力することですが、文字列または2D文字リストとして返すこともできます。

一般的なルール:

  • これはであるため、バイト単位の最短回答が優先されます。
    コードゴルフ言語では、コードゴルフ以外の言語で回答を投稿しないようにしないでください。「任意の」プログラミング言語の可能な限り短い答えを考えてみてください。
  • デフォルトのI / Oルールを使用した回答には標準ルールが適用されるため、STDIN / STDOUT、関数/メソッド、適切なパラメーター、戻り値型、完全なプログラムを使用できます。あなたの電話。
  • デフォルトの抜け穴は禁止されています。
  • 可能であれば、コードのテスト(TIOなど)へのリンクを追加してください。
  • また、回答の説明を追加することを強くお勧めします。

テストケース:

上記の2つの例、および:

入力:n=10,d=0
出力:

|   |
| | |
|   |
| | |
|   |
| | |
|   |
| | |
|   |
| | |

3
代替タイトル:「マッドマックスコードウォリアー」
akozi

1
最初の例は間違っていませんか?すべての偶数行ではなく、奇数行ごとに中間ストリップがあります
moonheart08

2
@ moonheart08いいえ。入力が奇数であっても偶数であっても、一番下には常に道路区切り線があります。その後、上に向かって交互に変化します。願わくばわかりやすくするために、テキストを少し修正しました。
ケビンクルイッセン

ああ、だから私は間違っている。わかった。明確にしてくれてありがとう。
moonheart08

回答:


2

キャンバス23 22 バイト

B}⁴H‟m↶⁷?/|∙/╋]\|∙\╋]}

ここで試してみてください!

方向入力0、1、2を使用します。

説明:

...‟    push "--¶¶- ¶¶--"
    m   mold the horizontal length to the 1st input - a horizontal road
     ↶  rotate counter-clockwise - so the separator is on the bottom
        also replaces the dashes with bars

⁷?     ]     ]}  switch over the 2nd input:
                 default case (input 2):
  /                pad with spaces to a "/" diagonal
   |∙/╋            replace "|" with "/"
                 case 0:
        \          pad with spaces to a "\" diagonal
         |∙\╋      replace "|" with ""

case 1 is empty, but because of a bug, the trailing "}" is still required

説明を追加しますか?:)
ケビン・クルーッセン

1
@KevinCruijssenが追加されました。
dzaima


7

Python 2、66バイト

n,d=input()
s=' '+'|\/'[d]
for c in(s*n)[n:]:print' '*n+s,c+s;n+=d

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

用途d=-1NEため、d=0Nのため、およびd=1NWのため。許可されている先頭のスペースを利用します。道路の一番下のセグメントにセパレータがあるという規則により、パリティを正しく取得するのが難しくなりました。それ(s*n)[n:]は、2nスペースと道路キャラクターの間の交代の後半を取るスライスによって達成されます。


6

1. Python 3.5、122 120バイト

スクリプトは、n、dの2つのパラメーターを取ります。

d:0、1、2-> \ | /

tio.run

import sys;(n,d)=[*map(int,sys.argv[1:3])];c="\\|/"[d]
for i in range(n):j=n+~i;print(" "*(i,0,j)[d],c,c*(j%2<1)or" ",c)

出力:

$ ./script.py 6 2
      /   /
     / / /
    /   /
   / / /
  /   /
 / / /
$ ./script.py 6 1
 |   |
 | | |
 |   |
 | | |
 |   |
 | | |
$ ./script.py 6 0
 \   \
  \ \ \
   \   \
    \ \ \
     \   \
      \ \ \

説明

# parse input params
(n,d)=[*map(int,sys.argv[1:3])]

# select char for "road"
c="\\|/"[d]

# loop n-times
for i in range(n):

    # complement (how many lines to end)
    j=n+~i

    # print
    #   space i or 0 or j times
    #   road, center of road if j is even else space, road
    print(" "*(i,0,j)[d], c, c*(j%2<1) or " ", c)

編集:Kevin Cruijssenのおかげで-2バイト


3
いい答えだ!:)ゴルフへの2つの小さなものは:n-1-iすることができn+~i関連先)とj%2==0することができj%2<1。あなたがそれらをまだ見ていない場合は、Pythonでゴルフのヒントでゴルフのヒント<すべての言語>のかもしれないの両方をお読み興味深いものになります。
ケビンクルーッセン

1
ありがとう:)私はn+~iまだこれを見ていませんが、役に立ちそうです。また、コードのハイライトをありがとう。
ルネ

どういたしまして!ご滞在とゴルフの多くの答えをお楽しみください。:)ああ、いい週末を。
ケビンクルーッセン

j%2*" "or cさらに数バイト節約します。
ニール

5

PowerShell88 82 80 74 71バイト

Mazzyのおかげで-8バイト
、AdmBorkBorkのおかげで-6バイト、AdmBorkBorkのおかげでMazzy
-3バイト

param($n,$d)$n..1|%{' '*($_,($n-$_))[$d]+($y='/\|'[$d])," $y"[$_%2],$y}

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

NW、NE、Nに対して[0,1,2]を使用dします。リストインデックスとして2回使用して、最初にスペーシングメソッド(0を返す2を使用するとリストから削除されます)を取得します。道路を構築するスペースの文字列にリストを追加します(スペースは文字列として追加されると元々メンバー間にスペースがあります)。また、モジュロ演算に基づいて、オープンレーンまたはダッシュを切り替えます。


1
80バイト [NW、NE、N]の用途[0,1,2]場合
mazzy

1
@mazzyスマート。意図的にリストから脱落することを完全に忘れていました。
ベスカ

1
AdmBorkBorkのarray.toStringを使用した素晴らしいアイデア!ありがとう。74バイト
mazzy

3
中間部分を配列ではなく文字列にインデックス付けすることにより、71バイト
AdmBorkBork


5

33 29 23バイト

↷NNη⊘⊕ηUE¹¦¹F⟦²±²⟧«Jι⁰η

オンラインでお試しください!リンクは、コードの詳細バージョンです。基になるCharcoalのバグがすべて修正されたようになったので、最適なコードを宣伝できます。説明:

↶N

最初の入力に従ってカーソルの方向を反時計回りに回転し、1が北東、2が北、3が北西になるようにします。

Nη

道路の長さを入力します。

⊘⊕ηUE¹¦¹

道路の長さの半分を印刷してから、道路の区切り線になるように伸ばします。

F⟦²±²⟧«Jι⁰η

道路の両側を印刷します。

@KevinCruijssenその後削除されたことからでした。この問題の難しいバージョンを提出したが、十分な担当者を持つユーザーは、ここでそれを見ることができます:コードへの(ハード)の道、私はこの答えに使用されるストレッチングトリックは非常に代わり、私、その質問には適用されません次の47 45バイトプログラムを作成しました。

F³«J×ι⊘⊕θ⁰≔…⟦¹ ⟧⊕﹪ι²ιFη«↶§κ⁰F⊖§κ¹§ιⅉP§ιⅉ↑↷§κ⁰

オンラインでお試しください!リンクは、コードの詳細バージョンです。説明:

F³«

側面とセパレータをループします。

J×ι⊘⊕θ⁰

サイドの先頭にジャンプします。

≔…⟦¹ ⟧⊕﹪ι²ι

1とスペースを含む配列を作成しますが、セパレーターではなく側面を描画する場合は、スペースを再度削除します。

Fη«

各道路セクションをループします。

↶§κ⁰

それに応じてカーソルの方向を回転させます。

F⊖§κ¹

道路セクションの長さより1つ短いループ...

§ιⅉ

...配列の交互要素を印刷します。交替は、カーソルのY座標を使用して配列に周期的にインデックスを付けることによって実現されます。

P§ιⅉ

この道路セクションの最後の行を印刷しますが、カーソルを移動しません...

...カーソルを上に移動して、代わりに次のセクションの準備ができるようにします。

↷§κ⁰

次のセクションの準備ができるようにカーソルの方向を回転させます。


4

Kotlin96 92バイト

{n,d->val c="\\|/"[d];(0..n-1).map{println(" ".repeat(n-it*(d-1))+ "$c ${" $c"[it%2]} $c")}}

[-1、0、1]の代わりに[0、1、2]を受け入れます

他の言語のソリューションと同様に機能しますが、残念ながらKotlinはこの言語ではあまり効果がありません。

val c=“\\|/“; Kotlinが文字列を文字の配列のように扱うという事実を利用して、道路建設で使用する文字を取得します(Javaを見て)

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


こんにちは、PPCGへようこそ!出力には小さな問題があります。道路の中央にある変更線は、偶数入力の場合、上部ではなく下部の線から開始する必要があります。あなたの出力4を私の例と比較して、4私が意味する違いを見ることができます。私はそれもKotlinを知らないが、私は、あなたが変更することにより、(同時に、ゴルフ4バイト)、それを解決することができると思います[(it+1)%2][it%2]。:)それとは別に、それはいい答えなので、私から+1。
ケビンクルーッセン

素晴らしい、歓迎と助けてくれてありがとう!変更します
アダム

4

TSQLコード、171 117バイト

これはコードとしてもっと短く書くことができることに気付きました。

DECLARE @n INT=7,@d INT=0

,@ INT=0a:PRINT
space(@n-@*@d)+stuff(replicate(substring('\|/',@d+2,1)+' ',3),3,@%2,space(@%2))SET
@+=1IF @n>@ GOTO a

TSQLクエリ、137バイト

USE master
DECLARE @n INT=6,@ INT=-1

SELECT space(@n-y*@)+z+iif(y%2=1,z,'  ')+z 
FROM(SELECT top(@n)row_number()over(order
by @)y,' '+substring('\|/',@+2,1)z FROM spt_values)x

データベースがすでにマスターの場合、USEマスターは必要ありません。ただし、一部のユーザーには異なるデフォルトのデータベースがあります。

試すときのスクリプトは少し異なります。スペースascii-32をascii-160に置き換える必要がありましたが、スペースは表示されませんでした。

やってみて

いくつかの調整を行い、私が交換できることに気づいた

1/0で注文する

@で注文


2
どうしてorder by 1/0ゼロ除算エラーが発生することはありませんか?
HoneyBadger

1/0は計算されていないためです。exists(select 1/0)は同じ効果があります
t-clausen.dk

Moved my question to StackOverflow
HoneyBadger

3

JavaScript (ES8),  90 87  85 bytes

Takes input as (direction)(length). Expects 0 for North-West, 1 for North or 2 for North-East.

d=>g=(n,w=n)=>n?(c='/|\\'[d]).padStart([n--,,w-n][d])+` ${n&1?' ':c} ${c}
`+g(n,w):''

Try it online!


JavaScript (ES6), 90 bytes

This one draws the output character by character with a little more maths instead of the .padStart() method.

Takes input as (direction)(length). Expects 1 for North-West, 2 for North or 3 for North-East.

d=>n=>(g=x=>y?` /|\\
`[x+5?17+y%2*4>>--x+5-[,n+1-y,n,y][d]&1&&d:(x=n,y--,4)]+g(x):'')(y=n)

Try it online!


3

Jelly,  31  30 bytes

⁶ẋẋƤḂ};€ị“\/|”ẋ3KƊ}Ṛ⁹¡⁶-2¦€ÐeṚ

A dyadic Link accepting the length on the left and the negated-direction* on the right which yields a 2d array of characters.
* [north-west, north, north-east]=[1, 0, -1]

Try it online! (footer calls the Link, joins with newline characters and prints the result)

How?

⁶ẋẋƤḂ};€ị“\/|”ẋ3KƊ}Ṛ⁹¡⁶-2¦€ÐeṚ - Link: integer, L; integer, D
⁶                              - space character
 ẋ                             - repeat L times
     }                         - using the right argument (D):
    Ḃ                          -   mod 2 (0 if D = 0, 1 otherwise ...A would work too)
   Ƥ                           - for each prefix (of the list of spaces):
  ẋ                            -   repeat (D mod 2 times)
                  }            - using the right argument (D):
                 Ɗ             -   last three links as a monad:
        ị“\/|”                 -     index into "\/|" (1-indexed & modular)
              ẋ3               -     repeat three times - e.g. "\\\"
                K              -     join with spaces          "\ \ \"
      ;€                       - concatenate €ach (altered prefix with that list)
                     ¡         - repeat action...
                    ⁹          - ...number of times: right argument (-1 repeats 0 times)
                   Ṛ           - ...action: reverse (i.e. reverse if north-west)
                           Ðe  - for even indexes:
                         ¦€    -   sparse application for €ach...
                       -2      -   ...to indices: [-2] (the middle of the road)
                      ⁶        -   ...action: a space character
                             Ṛ - reverse

2

Python 2, 127 bytes

n,d=input()
c='|/\\'[d]
for i in range(n):t=0if d==0else(i if d<0else n-i);print(' '*t+'{} {} {}'.format(c,' 'if i%2==0else c,c))

Try it online!

First two lines taken from @TFeld.


1
Hi there, welcome to PPCG! I'm afraid submissions will have to be either a function taking parameters, or a full program taking arguments or input from STDIN. Snippets like you're using right now aren't allowed I'm afraid. You could add a leading D,N=input() (and use Python 2 instead of 3) to fix this. Or you could change it to a lambda function taking these two parameters.
Kevin Cruijssen

1
Nice solution. Got it to 122 using " ".join(..) rather ran .format
akozi

1
i%2*c or' ' saves a few more bytes, although I did notice that the separator is wrong for odd length roads.
Neil

2

Python 2, 93 bytes

n,d=input();p=''
while n:g='|/\\'[d];n-=1;print['',' '*n,p][d]+g+' %s '%(g,' ')[n%2]+g;p+=' '

Try it online!


Changing +' %s '+ to ,'%s', saves 2 bytes
TFeld

@TFeld In that case you might as well remove the '%s'% completely.
Neil



1

Red, 157 bytes

func[s d][p: pick"\|/"d set[a b]reduce pick[[4 1]0[5 + s -1]]d 
repeat n s[print pad/left form reduce pick[[p" "p][p p p]]odd?(n + pick[1 0]odd? s)a: a + b]]

Try it online!

  • 1 North-West
  • 2 North
  • 3 North-East


1

Swift 4.2, 112 108 bytes

Sriotchilism O'Zaicのおかげで-4バイト

let c=["\\","|","/"][d];(0..<n).map{print((0..<n-$0*(d-1)).map{_ in" "}.joined()+c+" \($0%2==0 ?c:" ") "+c)}

[0,1,2] instead of [-1,0,1].

Try it online!

説明

let c=["\\","|","/"][d]

使用する道路標識を決定します。(これはどういうわけか短縮できると思います)

(0..<n).map{

通りの長さにわたって反復します。

(0..<n-$0*(d-1)).map{_ in" "}.joined()

通りの前にスペースを追加します。

\($0%2==0 ?c:" ")"

中間記号を1行おきに追加します。

私の非常に最初の1つ☝️、最適化のアドバイスに満足しています。主にそのスレッドから学んだ:Swiftでのゴルフのヒント


1
サイトへようこそ!あなたが間にスペースを削除するのを忘れたようだin" "、あなたの例では、それを削除したにもかかわらず、あなたのコードインチ
ウィートウィザード

1
私は迅速にはわかりませんが、文字列の両端での補間のように見えます(\(c)両方の場合)。をc文字列に連結するだけでバイトを節約できます。オンラインでお試しください!
ウィートウィザード

1
ありがとう、あなたは正しいです!3バイト🚀救っ
パルメ

1

Perl 6、66バイト

->\n,\d{{(' 'x--$ *d%-+^n~(' ',<\ | />[d+1])[1,(n+$++)%2,1])xx n}}

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

行のリストを返します。

説明

->\n,\d{                                                         }  # Block taking n, d
        {                                                       }   # Reset $ variables
         (                                                 )xx n    # Repeat n times
          ' 'x  # Space times
              --$ *d  # (-1,-2,-3,...) if d=1
                      # (0,0,0,...) if d=0
                      # (1,2,3,...) if d=-1
                    %-+^n  # modulo -~n = n+1
                         ~  # Concat
                          (' ',<\ | />[d+1])  # Space or line
                                            [1,(n+$++)%2,1]  # Alternate middle char

1

ルビー、90バイト

n,a=*$*.map{|i|-i.to_i}
c='|\/'[a]
n.upto(-1){|i|puts' '*(i*a-n)+c+' '+[' ',c][i%2]+' '+c}

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

更新:Kevin、元の投稿では道路の端とマーカーの間のスペースが欠落していたことを指摘していただきありがとうございます(つまり、5幅ではなく3幅の道路)。 c+' '+...+' '+c

方向情報:への-1, 0, 1マップ{ north-west, north, north-east }

引数:(4 -1北西に傾斜した4列の道路)などのコマンドライン引数を読み取ります。

追記:これはRuby v2.6.1でローカルにテストされ、Try It OnlineはRuby v2.5.3を使用しているようです。他のすべてのRubyバージョンでは動作しないと考える理由はありません。


こんにちは、PPCGへようこそ!出力では、方向と道路の変更が正しいので、よくできています。現在の出力にはマイナーエラーが1つだけあります。道路の幅は1ではなく3スペースである必要があります。現在、道路は|||またはですが、または(場所はスペース)である|<sp>|必要があります。Rubyはわかりませんが、に変更することで解決できるようです。:)|<sp>|<sp>||<sp><sp><sp>|<sp>c+[' ',c][i%2]+cc+' '+[' ',c][i%2]+' '+c
ケビンクルーッセン

良いキャッチ!@KevinCruijssen、指摘してくれてありがとう。
スペンサーD


1

Japt -R、40バイト

Æ=Vg"|\\/";²i1S+iX%2?S:U)iSp[TZÊ-YY]gVÃw

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

説明:

Æ=Vg"|\\/";²i1S+iX%2?S:U)iSp[TZÊ-YY]gVÃw
                                            // U = road size
                                            // V = direction
Æ                                     Ã     // Loop X through [0...U]
 =        ;                                 //   Set U to:
    "|\\/"                                  //       "|\/"
  Vg                                        //            [V]
           ²                                //  Double U
            i1          )                   //  Insert at index 1:
              S+                            //    " " +
                 X%2?S:U                    //         X%2?" ":U
                i                           //                  + " "
                         i                  //  Insert at index 0:
                          Sp                //    " " repeated this many times:
                            [TZÊ-YY]        //      [0,U.length - X,X]
                                    gV      //                        [V]
                                        w   // Reverse output

出力に小さな間違いがあるようです。現在、偶数入力の道路区切りは、下ではなく上から始まります。他のすべては大丈夫に見えるので、修正がそれほど難しくないことを願っています。
ケビンクルーッセン

@KevinCruijssenああ、それをキャッチしてくれてありがとう。回答を更新する前に、この解決策が問題ないことを確認できますか?
オリバー

うん、それは完全に正しいようです。:)
ケビンクルーッセン

1
@KevinCruijssenあなたがそれらを好きだと知っているので説明を追加しました:P
オリバー

ありがとう、感謝します。:)ゴルフ言語の説明が本当に欲しいです。JSのゴルフ言語はもちろん、JavaScriptの答えを理解するのに苦労することがあります。;)
Kevin Cruijssen

1

スタックス、23 バイト

ù╒←∩♂2Ωⁿ¡├∩22♀Ç○=÷â╧δÖ↑

実行してデバッグする

入力は、スペースで区切られた2つの整数です。
最初はdです。-1は北東を示します。北の場合は0。北西の場合は1。2番目のパラメーターはnです。これらの2つの値は、入力から暗黙的に解析され、入力スタック上に配置されますn。さらに、暗黙的に解析された最初の値であるためd、staxのxレジスタからアクセスできます。

たとえば、「1 7」と入力します

            Main stack      Explanation
            ----------      -----------
;           [7]             peek from input stack
m                           map over integers [1..n] using the rest of the program
                            output each produced value implicitly
  ;         [1 7]           peek from input stack
  +         [8]             add
  .*"       [8 [42 34]]     2 character string literal with codepoints 42 and 34
  @         [42]            get the element at the specified modular index (8)
  0         [42 0]          literal zero
  "|\/"x@   [42 0 92]       get codepoint from string literal at input d (from x register)
  \         [42 [0 92]]     make pair
  :B        ['\ \ \ ']      encode in custom base; it's binary with custom codepoints
  _x*       ['\ \ \ ' 1]    (loop variable) * (input d)
  ;^        ['\ \ \ ' 1 8]  peek from input stack and increment
  %         ['\ \ \ ' 1]    modulus
  6+        ['\ \ \ ' 7]    add 6
  )         [' \ \ \ ']     left-pad to length

これを実行する


Would you mind adding an explanation? :)
Kevin Cruijssen

1
@KevinCruijssen: Not at all.
recursive

0

perl -M5.010 -Mfeature=signatures, 97 bytes

sub f($n,$d){$x=qw[| / \\][$d];say" "x($d<1?$_*-$d:$n-$_),$x,$",($n-$_)%2?$":$x,$",$x for 1..$n;}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.