Si toma una hoja de papel cuadriculado y dibuja una línea inclinada que va m
unidades a la derecha y n
unidades hacia arriba, cruza las líneas de cuadrícula n-1
horizontales y m-1
verticales en alguna secuencia. Escribir código para generar esa secuencia.
Por ejemplo, m=5
y n=3
da:
Posiblemente relacionado: Generar ritmos euclidianos , inclinaciones de Fibonacci , FizzBuzz
Entrada: dos enteros positivos m,n
que son relativamente primos
Salida: Devuelve o imprime los cruces como una secuencia de dos tokens distintos. Por ejemplo, podría ser una cadena de H
y V
, una lista de True
y False
, o 0
'sy 1
' impresa en líneas separadas. Puede haber un separador entre tokens siempre que sea siempre el mismo y no, digamos, un número variable de espacios.
Casos de prueba:
El primer caso de prueba da salida vacía o sin salida.
1 1
1 2 H
2 1 V
1 3 HH
3 2 VHV
3 5 HVHHVH
5 3 VHVVHV
10 3 VVVHVVVHVVV
4 11 HHVHHHVHHHVHH
19 17 VHVHVHVHVHVHVHVHVVHVHVHVHVHVHVHVHV
39 100 HHVHHHVHHVHHHVHHVHHHVHHVHHHVHHHVHHVHHHVHHVHHHVHHVHHHVHHHVHHVHHHVHHVHHHVHHVHHHVHHVHHHVHHHVHHVHHHVHHVHHHVHHVHHHVHHHVHHVHHHVHHVHHHVHHVHHHVHH
En el formato (m,n,output_as_list_of_0s_and_1s)
:
(1, 1, [])
(1, 2, [0])
(2, 1, [1])
(1, 3, [0, 0])
(3, 2, [1, 0, 1])
(3, 5, [0, 1, 0, 0, 1, 0])
(5, 3, [1, 0, 1, 1, 0, 1])
(10, 3, [1, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1])
(4, 11, [0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0])
(19, 17, [1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1])
(39, 100, [0, 0, 1, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0])
Respuestas:
Ruby, 92; Avestruz 0.7.0 , 38
La salida para ambos usa 1's y 0's (ej.
101101
).Aquí hay una explicación del avestruz:
Y una explicación de cómo funciona todo, usando el código Ruby como guía:
fuente
Python, 53
Esto utiliza la salida de la lista Verdadero / Falso. Nada especial aquí.
fuente
Pyth -
3224 bytesToma entrada a través de stdin con el formato
[m,n]
. Imprime el resultado en stdout como una lista de 0 y 1, donde 0 = V y 1 = H.Pruébelo en línea
Explicación:
fuente
eM
es el mismo quemed
.@"VH"
ya que puede imprimir0
y en1
lugar deV
yH
.J
. Esto es lo que tengo hasta ahora en 25 bytes: pyth.herokuapp.com/…jk
ya que el resultado puede ser una lista.Código de máquina IA-32, 26 bytes
Hexdump del código:
Empecé con el siguiente código C:
Escribe la salida en el búfer suministrado. No devuelve la longitud de la salida, pero en realidad no es necesaria: la longitud de salida siempre es
m + n - 2
:Para convertir el código C en código de máquina, primero hice algunos ajustes, para hacer que una de las
if/else
ramas esté vacía, y comparar con en0
lugar den
:Desde aquí, escribir el código de ensamblaje en línea es sencillo:
fuente
t
está la "distancia abuzz
". Si la distancia es al menosn
, vefizz
, de lo contrario vebuzz
; actualizar la distancia; repita hasta que sea 0.Python - 125 bytes
Utiliza un algoritmo muy simple, solo incrementa las coordenadas y detecta cuándo cruza las líneas e imprime. Estoy buscando traducir a Pyth.
Que mientras el bucle verifica el número de
l
ines y luego verifica si alguno de los valores superó un límite int restando.Toma entradas como
39, 100
de stdin e imprime comoHHVHHHVHHVHHHVHHVHHHVHHVHHHVHHHVHHVHHHVHHVHHHVHHVHHHVHHHVHHVHHHVHHVHHHVHHVHHHVHHVHHHVHHHVHHVHHHVHHVHHHVHHVHHHVHHHVHHVHHHVHHVHHHVHHVHHHVHH
stdout en una línea.fuente
CJam, 15 bytes
Pruébalo aquí
Imprime
01
para V y10
para H.Explicación
La línea diagonal cruza una línea horizontal por cada 1 / n de toda la línea diagonal, y cruza una línea vertical por cada 1 / m.
fuente
TI-BASIC, 32
Sencillo. Utiliza una secuencia de
0
y1
, separada por saltos de línea. Las ventajas de TI-BASIC son lagcd(
multiplicación implícita y de dos bytes , pero sus desventajas son el bucle For que incluye el valor final y los 5 bytes gastados para la entrada.fuente
Python, 47
Como el algoritmo de anatolyg , pero verificado directamente con módulos.
fuente
Haskell, 78 bytes
Ejemplo de uso:
Cómo funciona: haga una lista de los valores de x de todos los cruces verticales
(x,0)
parax
en [1,2, ..., m-1] (0
indica vertical) y agregue la lista de los valores de x de todos los cruces horizontales(y*m/n,1)
paray
en [1,2, ..., n-1] (1
indica horizontal). Ordenar y tomar los segundos elementos de los pares.Maldición del día: nuevamente tengo que gastar 17 bytes en el
import
porquesort
está dentroData.List
y no en la biblioteca estándar.fuente
KDB (Q), 44 bytes
Explicación
Encuentra todo x valores del eje de los puntos de intersección y ordénelos. Si mod 1 es cero, su "V", distinto de cero es "H".
Prueba
fuente
CJam,
2624 bytesPruébalo en línea
Muy sencillo, prácticamente una implementación directa de un algoritmo de tipo Bresenham.
Explicación:
El último
01
debe aparecer porque el bucle fue hasta el punto final, que no es parte de la salida deseada. Tenga en cuenta que podemos no sólo reducir el número de bucle 1. De lo contrario, paraN > M
, todos los0
s de la última iteración estarán ausentes, mientras que sólo necesitamos para deshacerse de la última0
.fuente
>
para;W<
.1
pila en la parte superior, también podría usarla productivamente.