O (fácil) caminho para o código


30

Entrada:

  • Um número inteiro , que é garantido como .n3
  • Um número inteiro , que é um de .d[1,0,1]

Saída:

Uma estrada de tamanho , que estará na direção noroeste se ; uma direção norte se ; ou uma direção nordeste se . A estrada sempre terá três espaços de largura (ou cinco em geral, se incluirmos as bordas externas). Além disso, haverá uma linha separadora de estradas na seção inferior e, depois disso, alternando enquanto sobe.nd=1d=0d=1

Alguns exemplos:

Entrada: Saída:n=7,d=1

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

Entrada: Saída:n=4,d=1

\   \
 \ \ \
  \   \
   \ \ \

Regras do desafio:

  • Qualquer quantidade de espaços iniciais / finais e / ou novas linhas são aceitáveis, desde que imprima a estrada necessária em algum lugar na tela.
  • Em vez das opções você também pode usar as opções ou . Além disso, você pode escolher qual das três opções é mapeada para qual das três direções. (Certifique-se de mencionar quais as opções que usei se difere do para , respectivamente, que é usado nesta descrição desafio!)[1,0,1][0,1,2][1,2,3][1,0,1][north-west, north, north-east]
  • Qualquer formato de saída razoável é aceitável. Obviamente, o mais comum é imprimi-lo no STDOUT, mas também é bom retorná-lo como uma string ou lista de caracteres 2D.

Regras gerais:

  • Isso é , então a resposta mais curta em bytes vence.
    Não permita que idiomas com código de golfe o desencorajem a postar respostas com idiomas que não sejam codegolf. Tente encontrar uma resposta o mais curta possível para 'qualquer' linguagem de programação.
  • As regras padrão se aplicam à sua resposta com as regras de E / S padrão , para que você possa usar STDIN / STDOUT, funções / método com os parâmetros adequados e programas completos do tipo retorno. Sua chamada.
  • As brechas padrão são proibidas.
  • Se possível, adicione um link com um teste para o seu código (ou seja, TIO ).
  • Além disso, é altamente recomendável adicionar uma explicação para sua resposta.

Casos de teste:

Os dois exemplos acima e:

Entrada: Saída:n=10,d=0

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

3
Título alternativo: "Mad Max Code Warrior"
akozi

1
O primeiro exemplo não está incorreto? Tem uma faixa do meio em todas as linhas ímpares, em vez de todas as linhas pares
moonheart08

2
@ moonheart08 Não. A parte inferior sempre terá uma linha separadora de estradas, independentemente de a entrada ser ímpar ou par. Depois disso, alterna-se enquanto sobe. Modifiquei o texto um pouco para torná-lo mais claro.
Kevin Cruijssen 7/03

Oh, então eu estou errado. Bem. Agradeço por ter esclarecido.
moonheart08

Respostas:


2

Tela , 23 22 bytes

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

Experimente aqui!

Utiliza as entradas de direção 0, 1 e 2.

Explicação:

...‟    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

Você se importaria de adicionar uma explicação? :)
Kevin Cruijssen 13/03

1
@KevinCruijssen adicionou.
dzaima 13/03

16

Python 2 , 79 78 73 72 bytes

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

Experimente online!

Leva [1,0,-1]para[north-west, north, north-east]

-1 byte, graças a Neil


3
Caramba, o que eu não daria por fatiar como Python no Kotlin
Adam

i%2*c or' 'salva um byte.
Neil

7

Python 2 , 66 bytes

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

Experimente online!

Usa d=-1para NE, d=0para N e d=1para NW. Aproveita os espaços principais permitidos. A regra de que o segmento inferior da estrada possui um separador dificultou a correção da paridade; isso é alcançado com o fatiamento, (s*n)[n:]fazendo a segunda metade das 2nalternâncias entre o espaço e o caráter da estrada.


6

1. Python 3.5, 122 120 bytes

O script usa dois parâmetros: 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)

saída:

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

Explicação

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

editar: -2 bytes graças a Kevin Cruijssen


3
Boa resposta! :) Duas pequenas coisas para o golfe: n-1-ipode ser n+~i( dica relevante ) e j%2==0pode ser j%2<1. Se você ainda não os viu, dicas para jogar golfe em Python e Dicas para jogar em <todos os idiomas> podem ser interessantes para ler.
Kevin Cruijssen 7/03

1
Obrigado :) Ainda não vi isso n+~i, mas parece útil. Também obrigado pelo destaque do código.
Rene

De nada! Aproveite a sua estadia e jogue muitas respostas. :) Ah, e tenha um bom final de semana.
Kevin Cruijssen 9/03

j%2*" "or csalva outro par de bytes.
Neil

5

PowerShell , 88 82 80 74 71 bytes

-8 bytes graças ao Mazzy
-6 bytes graças ao AdmBorkBork e Mazzy
-3 bytes graças ao AdmBorkBork

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

Experimente online!

Usa [0,1,2] para NW, NE, N. Usa dcomo índice de lista duas vezes para obter primeiro o método de espaçamento (Retira a lista ao usar 2 que retorna 0) e depois qual caractere usar ao desenhar as linhas. Anexa uma lista à cadeia de espaços (que possui espaços entre os membros quando anexados como tal) que constrói a estrada. Também alterna entre uma faixa aberta ou um traço baseado no módulo de matemática.


1
80 bytes se usa [0,1,2] para [NW, NE, N]
mazzy

1
@mazzy Smart. Eu esqueci completamente de cair intencionalmente de uma lista.
Veskah 7/03

1
Ideia impressionante com array.toString de AdmBorkBork! Obrigado. 74 bytes
mazzy 7/03

3
71 bytes , indexando a parte do meio em uma string em vez de em uma matriz.
AdmBorkBork 7/03


5

Carvão , 33 29 23 bytes

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

Experimente online! Link é a versão detalhada do código. Agora que todos os erros subjacentes do Charcoal parecem estar corrigidos, posso anunciar o código ideal. Explicação:

↶N

Gire a direção do cursor no sentido anti-horário, de acordo com a primeira entrada, para que 1 se torne nordeste, 2 norte e 3 noroeste.

Nη

Insira o comprimento da estrada.

⊘⊕ηUE¹¦¹

Imprima metade da extensão da estrada e estique-a, dando o separador de estradas.

F⟦²±²⟧«Jι⁰η

Imprima as margens da estrada.

O @KevinCruijssen enviou posteriormente uma versão mais difícil desta pergunta, que foi excluída desde então, mas os usuários com representantes suficientes podem vê-la aqui: O (difícil) caminho para o código O truque de alongamento que usei nesta resposta não é aplicável a essa pergunta. escreveu o seguinte programa de 45 bytes de 47 :

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

Experimente online! Link é a versão detalhada do código. Explicação:

F³«

Laço sobre os lados e separador.

J×ι⊘⊕θ⁰

Ir para o início do lado.

≔…⟦¹ ⟧⊕﹪ι²ι

Faça uma matriz que contenha a 1e um espaço, mas remova o espaço novamente se estivermos desenhando os lados em vez do separador.

Fη«

Faça um loop sobre cada trecho da estrada.

↶§κ⁰

Gire a direção do cursor de acordo.

F⊖§κ¹

Passe um menos do que o comprimento da seção da estrada ...

§ιⅉ

... e imprima elementos alternativos da matriz. A alternância é obtida indexando ciclicamente na matriz com a coordenada Y do cursor.

P§ιⅉ

Imprima a última linha desta seção da estrada, mas sem mover o cursor ...

... para que o cursor possa ser movido para cima, pronto para a próxima seção.

↷§κ⁰

Gire a direção do cursor de volta para a próxima seção.


4

Kotlin , 96 92 bytes

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

Aceita [0, 1, 2] em vez de [-1, 0, 1]

Funciona de maneira semelhante a soluções em outros idiomas, mas infelizmente o Kotlin não brilha realmente neste.

val c=“\\|/“; recupera o caractere a ser usado na construção de estradas, aproveitando o fato de o Kotlin tratar Strings como uma matriz de caracteres (como deveria, olhando para você Java)

Experimente online!


Olá, seja bem-vindo ao PPCG! Há um pequeno problema em sua saída. As linhas alteradoras no centro da estrada devem começar com uma linha na parte inferior para entradas uniformes, em vez de na parte superior. Você pode comparar sua saída 4com o meu exemplo de 4para ver a diferença que eu quero dizer. Não conheço Kotlin tão bem, mas acho que você pode resolvê-lo (e jogar 4 bytes ao mesmo tempo) mudando [(it+1)%2]para [it%2]. :) Além disso, é uma boa resposta, então +1 de mim.
Kevin Cruijssen 7/03

Incrível, muito obrigado pela ajuda e boas-vindas! Eu vou mudar isso
Adam

4

Código TSQL, 171 117 bytes

Percebi que isso poderia ser escrito muito mais curto como código.

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

Consulta TSQL, 137 bytes

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 master não é necessário, se seu banco de dados já for master. Alguns usuários, no entanto, têm um banco de dados padrão diferente.

O script ao testá-lo é um pouco diferente. Eu tive que substituir o espaço ascii-32 por ascii-160, os espaços não foram mostrados.

Experimente

Fiz alguns ajustes e percebi que eu poderia substituir

encomendar por 1/0

com

ordenar por @


2
Como é order by 1/0que não causa um erro de divisão por zero?
HoneyBadger 7/03

porque 1/0 não está sendo calculado. onde existe (selecione 1/0) terá o mesmo efeito
t-clausen.dk

Movi

3

JavaScript (ES8),  90 87  85 bytes

(direction)(length)012

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

Experimente online!


JavaScript (ES6), 90 bytes

Este desenha o caractere de saída por caractere com um pouco mais de matemática, em vez do .padStart()método.

(direction)(length)123

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)

Experimente online!


3

Geléia ,  31  30 bytes

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

Um link diádico que aceita o comprimento à esquerda e a direção negada * à direita, o que gera uma 2ª matriz de caracteres.
*[north-west, north, north-east]=[1, 0, -1]

Experimente online! (o rodapé chama o link, junta-se a caracteres de nova linha e imprime o resultado)

Quão?

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

Experimente online!

Primeiras duas linhas retiradas de @TFeld.


1
Olá, bem-vindo ao PPCG! Receio que os envios terão que ser uma função que aceita parâmetros ou um programa completo que aceita argumentos ou informações do STDIN. Trechos como você está usando agora não são permitidos, receio. Você pode adicionar um líder D,N=input()(e usar o Python 2 em vez de 3) para corrigir isso. Ou você pode alterá-lo para uma função lambda usando esses dois parâmetros.
Kevin Cruijssen 7/03

1
Ótima solução. Chegou a 122 usando um " ".join(..)pouco correu.format
akozi 7/03

1
i%2*c or' 'economiza mais alguns bytes, embora tenha notado que o separador está errado para estradas com comprimentos ímpares.
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+=' '

Experimente online!


Alterar +' %s '+para ,'%s',salvar 2 bytes
TFeld 7/03

@TFeld Nesse caso, você também pode remover '%s'%completamente.
Neil



1

Vermelho , 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]]

Experimente online!

  • 1 Noroeste
  • 2 Norte
  • 3 Nordeste


1

Swift 4.2 , 112 108 bytes

-4 bytes graças ao 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] em vez de [-1,0,1].

Experimente online!

Explicação

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

Determina a placa de rua a ser usada. (Aposto que isso pode ser reduzido de alguma forma)

(0..<n).map{

Repete o comprimento da rua.

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

Adiciona os espaços em frente à rua.

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

Adiciona o sinal do meio a todas as outras linhas.

Meu primeiro ☝️, estou feliz com os conselhos de otimização. Aprendemos principalmente com esse tópico: dicas para jogar golfe no Swift .


1
Bem vindo ao site! Parece que você esqueceu de remover o espaço entre ine " "no seu código, mesmo que você o tenha removido em seus exemplos.
Wheat Wizard

1
Eu não sei rápido, mas parece que as suas interpolações nas extremidades das strings ( \(c)nos dois casos). Você salvaria bytes apenas concatenando o cpara a string. Experimente online!
Wheat Wizard

1
Obrigado, você está certo! salvou-nos 3 bytes 🚀
palme

1

Perl 6 , 66 bytes

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

Experimente online!

Retorna uma lista de linhas.

Explicação

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

Ruby , 90 bytes

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

Experimente online!

ATUALIZAÇÃO: Obrigado, Kevin, por apontar que meu envio original estava faltando espaços entre as bordas e os marcadores da estrada (ou seja, estradas de 3 larguras em vez de 5). Dito isso, pode haver uma solução mais curta para isso c+' '+...+' '+c.

Informações direcionais: -1, 0, 1mapeia para{ north-west, north, north-east }

Argumentos: lê argumentos da linha de comando, como 4 -1(uma estrada de quatro linhas, inclinada para o noroeste).

Nota adicional: Isso foi testado localmente com Ruby v2.6.1 e parece que o Try It Online usa Ruby v2.5.3. Não tenho motivos para pensar que não funcionaria com todas as outras versões do Ruby.


Olá, bem-vindo ao PPCG! As direções e as estradas alteradas estão corretas em sua saída, muito bem. Há apenas um pequeno erro na saída atual: a estrada deve ter três espaços em vez de 1. Atualmente, sua estrada é |||or |<sp>|, mas deve ser |<sp>|<sp>|or |<sp><sp><sp>|(onde <sp>é um espaço). Não conheço Ruby, mas parece que você pode resolvê-lo mudando c+[' ',c][i%2]+cpara c+' '+[' ',c][i%2]+' '+c. :)
Kevin Cruijssen 10/03

Ah boa captura! Obrigado por apontar isso, @KevinCruijssen.
Spencer D


1

Japonês -R , 40 bytes

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

Experimente online!

Explicação:

Æ=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

Parece haver um pequeno erro na saída. Atualmente, o separador de estradas para entradas pares começa no topo, em vez de no fundo. Todo o resto parece ok, então espero que não seja muito difícil de corrigir.
Kevin Cruijssen 12/03

@KevinCruijssen Ah, obrigado por entender isso. Antes de atualizar minha resposta, você pode confirmar que esta solução está correta?
Oliver

Sim, isso parece completamente correto. :)
Kevin Cruijssen 12/03

1
@KevinCruijssen Adicionada uma explicação, já que eu sei que você gosta: P
Oliver

Obrigado, apreciado. :) Na verdade, eu sempre gosto de ter explicações para idiomas de golfe. Às vezes, já tenho problemas para entender as respostas do JavaScript, sem falar na linguagem do JS. ;)
Kevin Cruijssen 13/03

1

Stax , 23 bytes

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

Execute e depure

A entrada é dois números inteiros separados por um espaço.
O primeiro é d. -1 especifica nordeste. 0 para o norte. 1 para noroeste. O segundo parâmetro é n. Esses dois valores serão analisados ​​implicitamente da entrada e colocados na pilha de entrada npor cima. Além disso d, será acessível a partir do registro do stax, xpois é o primeiro valor analisado implicitamente.

Por exemplo, insira "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

Execute este


Você se importaria de adicionar uma explicação? :)
Kevin Cruijssen 13/03

1
@KevinCruijssen: De maneira alguma.
recursivo

0

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

sub f($n,$d){$x=qw[| / \\][$d];say" "x($d<1?$_*-$d:$n-$_),$x,$",($n-$_)%2?$":$x,$",$x for 1..$n;}
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.