El camino (fácil) al código


30

Entrada:

  • Un entero , que se garantiza que es .n3
  • Un número entero , que es uno de .d[1,0,1]

Salida:

Una carretera de tamaño , que estará en dirección noroeste si ; una dirección norte si ; o una dirección noreste si . El camino siempre tendrá tres espacios de ancho (o cinco en general si incluimos los bordes exteriores). Además, habrá una línea de separación de carreteras en la sección inferior, y luego se alternará mientras va hacia arriba.nd=1d=0d=1

Algunos ejemplos:

Entrada: Salida:n=7,d=1

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

Entrada: Salida:n=4,d=1

\   \
 \ \ \
  \   \
   \ \ \

Reglas de desafío:

  • Cualquier cantidad de espacios iniciales / finales y / o nuevas líneas son aceptables, siempre que imprima la carretera requerida en algún lugar de la pantalla.
  • En lugar de las opciones , también puede usar las opciones o lugar. Además, puede elegir cuál de las tres opciones se asigna a cuál de las tres direcciones. (Asegúrese de mencionar las opciones que ha utilizado si difiere de la para , respectivamente, que se utiliza en esta descripción desafío!)[1,0,1][0,1,2][1,2,3][-1,0 0,1][north-west, north, north-east]
  • Cualquier formato de salida razonable es aceptable. Por supuesto, lo más común es imprimirlo en STDOUT, pero devolverlo como una cadena o una lista de caracteres 2D también está bien.

Reglas generales:

  • Este es el , por lo que la respuesta más corta en bytes gana.
    No permita que los lenguajes de code-golf lo desanimen a publicar respuestas con lenguajes que no sean codegolf. Trate de encontrar una respuesta lo más breve posible para 'cualquier' lenguaje de programación.
  • Las reglas estándar se aplican a su respuesta con las reglas de E / S predeterminadas , por lo que puede usar STDIN / STDOUT, funciones / método con los parámetros adecuados y programas completos de tipo retorno. Tu llamada.
  • Las lagunas predeterminadas están prohibidas.
  • Si es posible, agregue un enlace con una prueba para su código (es decir, TIO ).
  • Además, se recomienda agregar una explicación para su respuesta.

Casos de prueba:

Los dos ejemplos anteriores y:

Entrada: Salida:norte=10,re=0 0

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

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

1
¿No es incorrecto el primer ejemplo? Tiene una franja central en cada línea impar en lugar de cada línea par
moonheart08

2
@ moonheart08 No. El de abajo siempre tendrá una línea de separación de carreteras, ya sea que la entrada sea impar o par. Después de eso se alterna mientras va hacia arriba. Modifiqué un poco el texto para que sea más claro.
Kevin Cruijssen

Oh, entonces estoy equivocado. Bien. Gracias por aclararlo.
moonheart08

Respuestas:


2

Lienzo , 23 22 bytes

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

Pruébalo aquí!

Utiliza las entradas de dirección 0, 1 y 2.

Explicación:

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

¿Te importaría agregar una explicación? :)
Kevin Cruijssen

1
@KevinCruijssen agregado.
dzaima

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

Pruébalo en línea!

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

-1 byte, gracias a Neil


3
Por Dios, lo que no daría por cortar Python en Kotlin
Adam

i%2*c or' 'guarda un 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

Pruébalo en línea!

Usos d=-1para NE, d=0para N y d=1para NW. Aprovecha que se permiten espacios principales. La regla de que el segmento inferior de la carretera tiene un separador dificultaba la correcta paridad; se logra cortando (s*n)[n:]la segunda mitad de las 2nalternancias entre el espacio y el personaje del camino.


6

1. Python 3.5, 122 120 bytes

La secuencia de comandos toma dos 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)

salida:

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

Explicación

# 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 gracias a Kevin Cruijssen


3
¡Buena respuesta! :) Dos cosas pequeñas para el golf: n-1-ipuede ser n+~i( consejo relevante ) y j%2==0puede ser j%2<1. Si aún no los ha visto, los consejos para jugar golf en Python y los consejos para jugar golf en <todos los idiomas> pueden ser interesantes de leer.
Kevin Cruijssen

1
Gracias :) Todavía no he visto esto n+~i, pero parece útil. También gracias por resaltar el código.
René

¡De nada! Disfrute de su estancia y jugando al golf con muchas respuestas. :) Ah, y que tengan un buen fin de semana.
Kevin Cruijssen

j%2*" "or cguarda otro par de bytes.
Neil

5

PowerShell , 88 82 80 74 71 bytes

-8 bytes gracias a Mazzy
-6 bytes gracias a AdmBorkBork y Mazzy
-3 bytes gracias a AdmBorkBork

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

Pruébalo en línea!

Utiliza [0,1,2] para NW, NE, N. Se usa dcomo índice de lista dos veces para obtener primero el método de espaciado (se elimina de la lista cuando se usa 2 que devuelve 0) y luego qué carácter usar al dibujar las líneas. Agrega una lista a la cadena de espacios (que de forma innata tiene espacios entre los miembros cuando se adjunta como tal) que construye el camino. También intercambia entre un carril abierto o un guión según el módulo matemático.


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

1
@mazzy Smart. Me olvidé por completo de caer intencionalmente de una lista.
Veskah

1
¡Impresionante idea con array.toString de AdmBorkBork! Gracias. 74 bytes
mazzy

3
71 bytes indexando la parte media en una cadena en lugar de una matriz.
AdmBorkBork


5

Carbón , 33 29 23 bytes

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

Pruébalo en línea! El enlace es a la versión detallada del código. Ahora que todos los errores subyacentes de Charcoal parecen corregidos, puedo anunciar el código óptimo. Explicación:

↶N

Gire la dirección del cursor en sentido antihorario según la primera entrada, de modo que 1 se convierta en noreste, 2 norte y 3 noroeste.

Nη

Ingrese la longitud del camino.

⊘⊕ηUE¹¦¹

Imprima la mitad del largo del camino y luego estírelo dando el separador del camino.

F⟦²±²⟧«Jι⁰η

Imprime los lados del camino.

@KevinCruijssen posteriormente envió una versión más difícil de esta pregunta que fue eliminada desde entonces, pero los usuarios con suficiente representante pueden verla aquí: El camino (difícil) al código El truco de estiramiento que utilicé en esta respuesta no es aplicable a esa pregunta, así que en su lugar escribió el siguiente programa de 45 45 bytes:

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

Pruébalo en línea! El enlace es a la versión detallada del código. Explicación:

F³«

Pase por los lados y separador.

J×ι⊘⊕θ⁰

Salta al inicio del lado.

≔…⟦¹ ⟧⊕﹪ι²ι

Haga una matriz que contenga ay 1un espacio, pero elimine el espacio nuevamente si estamos dibujando los lados en lugar del separador.

Fη«

Pase sobre cada sección del camino.

↶§κ⁰

Gire la dirección del cursor en consecuencia.

F⊖§κ¹

Pase sobre uno menos que la longitud de la sección del camino ...

§ιⅉ

... e imprime elementos alternos de la matriz. La alternancia se logra indexando cíclicamente en la matriz con la coordenada Y del cursor.

P§ιⅉ

Imprima la última fila de esta sección de carretera, pero sin mover el cursor ...

... para que el cursor pueda moverse hacia arriba listo para la siguiente sección.

↷§κ⁰

Gire la dirección del cursor hacia atrás, listo para la siguiente sección.


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

Acepta [0, 1, 2] en lugar de [-1, 0, 1]

Funciona de manera similar a las soluciones en otros idiomas, pero desafortunadamente Kotlin realmente no brilla en este.

val c=“\\|/“; recupera el carácter para usar en la construcción de carreteras aprovechando el hecho de que Kotlin trata las cadenas como una matriz de caracteres (como debería, mirándote Java)

Pruébalo en línea!


Hola, bienvenido a PPCG! Hay un problema menor en su salida. Las líneas alteradas en el centro de la carretera deben comenzar con una línea en la parte inferior para entradas uniformes, en lugar de en la parte superior. Puede comparar su salida 4con mi ejemplo de 4para ver la diferencia que quiero decir. No conozco a Kotlin tan bien, pero creo que puedes resolverlo (y jugar 4 bytes al mismo tiempo) cambiando [(it+1)%2]a [it%2]. :) Aparte de eso, es una buena respuesta, así que +1 de mi parte.
Kevin Cruijssen

Impresionante, muchas gracias por la bienvenida y ayuda! Lo cambiaré
Adam

4

Código TSQL, 171 117 bytes

Me di cuenta de que esto podría escribirse mucho más corto 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 no es necesario, si su base de datos ya es master. Sin embargo, algunos usuarios tienen una base de datos predeterminada diferente.

El guión al probarlo es ligeramente diferente. Tuve que reemplazar el espacio ascii-32 con ascii-160, los espacios no se mostraban.

Pruébalo

Hice algunos ajustes y me di cuenta de que podía reemplazar

ordenar por 1/0

con

ordenar por @


2
¿Cómo order by 1/0es que no causa un error de división por cero?
HoneyBadger

porque 1/0 no se está calculando. donde existe (seleccione 1/0) tendrá el mismo efecto
t-clausen.dk

Moví mi pregunta a StackOverflow
HoneyBadger

3

JavaScript (ES8),  90 87  85 bytes

(direction)(length)0 012

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

Pruébalo en línea!


JavaScript (ES6), 90 bytes

Este dibuja el carácter de salida por carácter con un poco más de matemáticas en lugar del .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)

Pruébalo en línea!


3

Jalea ,  31  30 bytes

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

Un enlace diádico que acepta la longitud a la izquierda y la dirección negada * a la derecha que produce una matriz 2D de caracteres.
* *[north-west, north, north-east]=[1, 0, -1]

Pruébalo en línea! (el pie de página llama al Enlace, se une con los caracteres de nueva línea e imprime el resultado)

¿Cómo?

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

Pruébalo en línea!

Primeras dos líneas tomadas de @TFeld.


1
Hola, bienvenido a PPCG! Me temo que las presentaciones tendrán que ser una función que tome parámetros o un programa completo que tome argumentos o aportes de STDIN. Me temo que no se permiten fragmentos como los que estás usando en este momento. Puede agregar un líder D,N=input()(y usar Python 2 en lugar de 3) para arreglar esto. O podría cambiarlo a una función lambda tomando estos dos parámetros.
Kevin Cruijssen

1
Buena solución Lo tengo a 122" ".join(..).format
Llegó

1
i%2*c or' 'guarda algunos bytes más, aunque noté que el separador es incorrecto para carreteras de longitud impar.
Neil




1

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

Pruébalo en línea!

  • 1 noroeste
  • 2 norte
  • 3 noreste


1

Swift 4.2 , 112 108 bytes

-4 bytes gracias al 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] en lugar de [-1,0,1].

Pruébalo en línea!

Explicación

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

Determina el letrero de la calle a usar. (Apuesto a que esto se puede acortar de alguna manera)

(0..<n).map{

Itera a lo largo de la calle.

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

Agrega los espacios en frente de la calle.

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

Agrega el signo del medio a cualquier otra línea.

Mi primera ☝️, estoy contento con los consejos de optimización. Aprendí principalmente de ese hilo: consejos para jugar al golf en Swift .


1
Bienvenido al sitio! Parece que olvidó eliminar el espacio entre iny " "en su código aunque lo haya eliminado en sus ejemplos.
Wheat Wizard

1
No sé rápido, pero parece ser por sus interpolaciones en los extremos de las cadenas ( \(c)en ambos casos). Guardaría bytes simplemente concatenando el ca la cadena. Pruébalo en línea!
Wheat Wizard

1
Gracias, tienes razon! nos salvó 3 bytes 🚀
palme

1

Perl 6 , 66 bytes

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

Pruébalo en línea!

Devuelve una lista de líneas.

Explicació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

Rubí , 90 bytes.

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

Pruébalo en línea!

ACTUALIZACIÓN: Gracias, Kevin, por señalar que en mi presentación original faltaban espacios entre los bordes de la carretera y los marcadores (es decir, carreteras de 3 anchos en lugar de 5 anchos). Dicho esto, podría haber una solución más corta para eso que c+' '+...+' '+c .

Información direccional: -1, 0, 1mapas a{ north-west, north, north-east }

Argumentos: esto lee argumentos de línea de comandos como 4 -1 (un camino de cuatro filas, inclinado hacia el noroeste).

Nota adicional: Esto se probó localmente con Ruby v2.6.1, y parece que Try It Online usa Ruby v2.5.3. No tengo ninguna razón para pensar que no funcionaría con todas las demás versiones de Ruby.


Hola, bienvenido a PPCG! Las direcciones y las carreteras que alteran son correctas en su salida, muy bien hecho. Solo hay un error menor en la salida actual: el camino debe tener tres espacios de ancho en lugar de 1. Actualmente su camino es |||o |<sp>|, pero debería ser |<sp>|<sp>|o |<sp><sp><sp>|(donde <sp>hay un espacio). No conozco a Ruby, pero parece que puedes resolverlo cambiando c+[' ',c][i%2]+ca c+' '+[' ',c][i%2]+' '+c. :)
Kevin Cruijssen

Ah buena captura! Gracias por señalar eso, @KevinCruijssen.
Spencer D


1

Japt -R , 40 bytes

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

Pruébalo en línea!

Explicación:

Æ=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 haber un pequeño error en la salida. Actualmente, el separador de camino para entradas pares comienza en la parte superior en lugar de en la parte inferior. Todo lo demás se ve bien, así que espero que no sea una solución demasiado difícil.
Kevin Cruijssen

@KevinCruijssen Ah, gracias por atrapar eso. Antes de actualizar mi respuesta, ¿puede confirmar que esta solución está bien?
Oliver

Sí, eso se ve completamente correcto. :)
Kevin Cruijssen

1
@KevinCruijssen Se agregó una explicación ya que sé que te gustan: P
Oliver

Gracias apreciado :) De hecho, siempre me gusta tener una explicación para los idiomas de golf. A veces ya tengo problemas para comprender las respuestas de JavaScript, y mucho menos el lenguaje de golf de JS. ;)
Kevin Cruijssen

1

Stax , 23 bytes

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

Ejecutar y depurarlo

La entrada es dos enteros separados por un espacio.
La primera es d. -1 especifica noreste. 0 para el norte. 1 para el noroeste. El segundo parámetro es n. Estos dos valores se analizarán implícitamente desde la entrada y se colocarán en la pila de entrada con la nparte superior. Además dserá accesible desde el registro de stax xya que es el primer valor analizado implícitamente.

Por ejemplo, ingrese "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

Ejecute este


¿Te importaría agregar una explicación? :)
Kevin Cruijssen

1
@KevinCruijssen: Para nada.
recursivo

0

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

sub f($n,$d){$x=qw[| / \\][$d];say" "x($d<1?$_*-$d:$n-$_),$x,$",($n-$_)%2?$":$x,$",$x for 1..$n;}
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.