(轻松)编码之路


30

输入:

  • 整数,它保证为。ñ3
  • 整数,它是。d[-1个01个]

输出:

大小为的道路,如果,则为西北方向;如果,则为北方向;如果则为东北方向。道路将始终为三处宽(如果包括外部边界,则通常为五处)。此外,底部将有一条道路分隔线,此后向上交替显示。ñd=-1个d=0d=1个

一些例子:

输入: 输出:ñ=7d=1个

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

输入: 输出:ñ=4d=-1个

\   \
 \ \ \
  \   \
   \ \ \

挑战规则:

  • 只要可以在屏幕上的某处打印所需的道路,任何数量的前导/尾随空格和/或换行符都是可以接受的。
  • 除了选项您还可以使用选项或。另外,您可以选择三个选项中的哪个映射到三个方向中的哪个。(如果挑战说明中分别使用的选项不同于,请务必提及您使用了哪些选项!)[-1个01个][01个2][1个23][-1个01个][north-west, north, north-east]
  • 任何合理的输出格式都是可以接受的。当然,最常见的做法是将其打印到STDOUT,但也可以将其作为字符串或2D字符列表返回。

一般规则:

  • 这是,因此最短答案以字节为单位。
    不要让代码高尔夫球语言阻止您发布使用非代码高尔夫球语言的答案。尝试针对“任何”编程语言提出尽可能短的答案。
  • 标准规则适用于具有默认I / O规则的答案,因此允许您使用STDIN / STDOUT,具有适当参数的函数/方法以及返回类型的完整程序。你的来电。
  • 默认漏洞是禁止的。
  • 如果可能的话,请添加一个带有测试代码的链接(即TIO)。
  • 另外,强烈建议为您的答案添加说明。

测试用例:

上面的两个示例,以及:

输入:ñ=10d=0
输出:

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

3
替代标题:“疯狂的麦克斯密码勇士”
akozi

1
第一个例子不正确吗?它在每条奇数行而不是每条偶数行上都有一个中间条
moonheart08

2
@ moonheart08否。无论输入是奇数还是偶数,最下面的总会有一条道路分隔线。之后,它交替向上移动。我对文本进行了一些修改,以期使其更加清晰。
凯文·克鲁伊森

哦,所以我错了。好的。感谢您的澄清。
moonheart08

Answers:


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

您介意添加解释吗?:)
Kevin Cruijssen

1
@KevinCruijssen添加了。
dzaima

16

Python 2中79个 78 73 72字节

n,d=input()
c='|\/'[d]
i=n
while i:print' '*(n-i*d)+c,i%2*c or' ',c;i-=1

在线尝试!

需要[1,0,-1][north-west, north, north-east]

-1字节,感谢尼尔


3
哎呀,我不会放弃为Python样切片在科特林
亚当

i%2*c or' '保存一个字节。
尼尔

7

Python 2,66字节

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

在线尝试!

用途d=-1为NE,d=0为N,和d=1为NW。利用允许的前导空格。道路底部有分隔线的规则使正确设置奇偶校验变得很棘手。这是通过将空间和道路特征之间(s*n)[n:]2n交替的后半部分进行切片来实现的。


6

1. Python 3.5,122 120字节

脚本有两个参数:n,d。

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)

编辑:-2字节感谢凯文·克鲁伊森


3
好答案!:)打高尔夫的两件事:n-1-i可以n+~i相关提示)和j%2==0可以j%2<1。如果您还没有看到它们,那么通读Python高尔夫球技巧<all language>高尔夫球技巧都可能很有趣。
凯文·克鲁伊森

1
谢谢:)我还没有看到这个n+~i,但是看起来很有帮助。也感谢代码突出显示。
雷内

别客气!享受您的住宿和打高尔夫球的许多答案。:)哦,祝你周末愉快。
Kevin Cruijssen

j%2*" "or c保存另外两个字节。
尼尔

5

PowerShell88 82 80 74 71字节

-8字节归功于Mazzy,
-6字节归功于AdmBorkBork,而Mazzy
-3字节归功于AdmBorkBork

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

在线尝试!

对NW,NE,N使用[0,1,2]。d两次用作列表索引,首先获取间距方法(使用2返回0时从列表中删除,然后绘制线条时使用哪个字符。将一个列表附加到构建道路的空格字符串(当这样添加时,在成员之间本来就有空格)。还可以基于模数学在开放车道或破折号之间交换。


1
如果对[NW,NE,N]使用[0,1,2],则为80个字节
令人困惑

1
@mazzy聪明。我完全忘了故意落空名单。
维斯卡

1
来自AdmBorkBork的array.toString很棒的主意!谢谢。74个字节
MAZZY

3
通过将中间部分索引为字符串而不是数组来索引为71个字节
AdmBorkBork


5

木炭33 29 23字节

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

在线尝试!链接是详细版本的代码。现在,所有潜在的木炭错误似乎都已修复,我可以公布最佳代码。说明:

↶N

根据第一个输入逆时针旋转光标方向,以使1变为东北,2变为北,3变为西北。

Nη

输入道路长度。

⊘⊕ηUE¹¦¹

打印道路长度的一半,然后将其拉伸以形成道路分隔符。

F⟦²±²⟧«Jι⁰η

打印路边。

@KevinCruijssen随后提交了该问题的较硬版本,此版本已删除,但具有足够代表的用户可以在此处看到:(硬)代码我在此答案中使用的拉伸技巧不适用于该问题,所以我改为编写了以下47个 45字节程序:

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

在线尝试!链接是详细版本的代码。说明:

F³«

在侧面和隔板上循环。

J×ι⊘⊕θ⁰

跳到一侧的起点。

≔…⟦¹ ⟧⊕﹪ι²ι

制作一个包含a 1和一个空格的数组,但是如果要绘制边而不是分隔符,请再次删除该空格。

Fη«

绕过每个路段。

↶§κ⁰

相应地旋转光标方向。

F⊖§κ¹

比路段的长度短一圈...

§ιⅉ

...并打印数组的交替元素。通过使用光标的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")}}

接受[0,1,2]而不是[-1,0,1]

它的工作方式与其他语言的解决方案类似,但是不幸的是Kotlin并没有真正在这种语言中大放异彩。

val c=“\\|/“; 通过利用Kotlin将字符串像一个字符数组一样对待的事实来检索要在道路建设中使用的字符(应该,看一下Java)

在线尝试!


嗨,欢迎来到PPCG!您的输出中有一个小问题。道路中心的变更线应从底部开始输入,而不是从顶部开始。您可以将的输出4与我的示例进行比较,4以了解我的意思。我不太了解Kotlin,但我认为您可以通过更改[(it+1)%2]为来解决它(同时打4个字节)[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

如果您的数据库已经是master,则不需要USE master。但是,某些用户具有不同的默认数据库。

试用时的脚本略有不同。我不得不将ascii-32替换为ascii-160,未显示空格。

试试看

进行了一些调整,意识到我可以替换

按1/0订购

由@订购


2
怎么order by 1/0不会导致被零除的错误?
HoneyBadger

因为未计算1/0。存在的位置(选择1/0)将具有相同的效果
t-clausen.dk

我的问题移至StackOverflow
HoneyBadger,

3

JavaScript(ES8), 90 87  85字节

(direction)(length)01个2

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

在线尝试!


JavaScript(ES6),90个字节

此函数用更多的数学.padStart()方法而不是方法逐个字符地绘制输出字符。

(direction)(length)1个23

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)

在线尝试!


3

果冻 31  30 字节

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

双向链接,在左侧接受长度,在右侧接受取反方向*,这将产生二维字符数组。
*[north-west, north, north-east]=[1, 0, -1]

在线尝试!(页脚调用链接,与换行符连接并打印结果)

怎么样?

⁶ẋẋƤḂ};€ị“\/|”ẋ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字节

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))

在线尝试!

前两行来自@TFeld。


1
嗨,欢迎来到PPCG!恐怕提交必须是带有参数的函数或带有STDIN参数或输入的完整程序。恐怕不允许使用像您现在正在使用的代码片段。您可以添加引号D,N=input()(并使用Python 2而不是3)来解决此问题。或者,您可以将其更改为采用这两个参数的lambda函数。
凯文·克鲁伊森

1
不错的解决方案。使用相当" ".join(..).format
快的速度将

1
i%2*c or' '尽管我确实注意到分隔符对于奇数长度的道路是错误的,但它节省了更多的字节。
尼尔·

2

Python 2,93字节

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

在线尝试!


更改+' %s '+,'%s',保存2个字节
TF于

@TFeld在这种情况下,您最好将其'%s'%完全删除。
尼尔





1

迅速4.2112 108个字节

-4个字节归功于Sriotchilism O'Zaic

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

[0,1,2],而不是[-1,0,1]。

在线尝试!

说明

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

确定要使用的路牌。(我敢打赌,可以通过某种方式将其缩短)

(0..<n).map{

遍及街道的整个长度。

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

在街道前面添加空间。

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

在每隔一行添加中间符号。

我的第一个☝️,我对任何优化建议感到满意。从该线程中学到的最多:在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),他指出我的原始提交的内容是缺少道路边缘和标记之间的空间(即3宽度的道路,而不是5宽度的道路)。 c+' '+...+' '+c

方向信息: -1, 0, 1映射到{ north-west, north, north-east }

参数:读取命令行参数,例如 4 -1(四行路,向西北倾斜)。

附加说明:这已在Ruby v2.6.1上进行了本地测试,并且“ 在线试用”似乎使用了Ruby v2.5.3。我没有理由认为它不适用于所有其他Ruby版本。


嗨,欢迎来到PPCG!方向和变更道路在您的输出中是正确的,所以做得很好。当前输出中只有一个小错误:道路的宽度应为3个而不是1个。当前,您的道路为||||<sp>|,但应为|<sp>|<sp>||<sp><sp><sp>|(其中<sp>为一个空格)。我不了解Ruby,但是您似乎可以通过更改c+[' ',c][i%2]+c为来解决c+' '+[' ',c][i%2]+' '+c。:)
Kevin Cruijssen

好抓啊!感谢您指出@KevinCruijssen。
Spencer 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啊,谢谢。在我更新我的答案之前,您可以确认这个解决方案还可以吗?
奥利弗

是的,这看起来完全正确。:)
Kevin Cruijssen

1
@KevinCruijssen添加了一个解释,因为我知道您喜欢:P
Oliver

谢谢,谢谢。:)我的确很喜欢打高尔夫球的语言。有时候我已经很难理解JavaScript的答案,更不用说JS的惯用语言了。;)
Kevin Cruijssen

1

Stax,23 个字节

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

运行并调试

输入是两个由空格分隔的整数。
首先是d。-1指定东北。北方为0。1代表西北。第二个参数是n。这两个值将从输入中隐式解析,并放在输入堆栈的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

运行这个


您介意添加解释吗?:)
Kevin Cruijssen

1
@KevinCruijssen:完全没有。
递归

0

perl -M5.010 -Mfeature =签名,97个字节

sub f($n,$d){$x=qw[| / \\][$d];say" "x($d<1?$_*-$d:$n-$_),$x,$",($n-$_)%2?$":$x,$",$x for 1..$n;}
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.