Esta es la versión ASCII de este desafío . La publicación inicial fue separada por solicitud por Martin Ender
Introducción
Similar a la secuencia de Fibonacci, la secuencia de Padovan ( OEIS A000931 ) es una secuencia de números que se produce al agregar términos anteriores en la secuencia. Los valores iniciales se definen como:
P(0) = P(1) = P(2) = 1
Los términos 0º, 1º y 2º son todos 1. La relación de recurrencia se establece a continuación:
P(n) = P(n - 2) + P(n - 3)
Por lo tanto, produce la siguiente secuencia:
1, 1, 1, 2, 2, 3, 4, 5, 7, 9, 12, 16, 21, 28, 37, 49, 65, 86, 114, 151, 200, 265, 351, ...
El uso de estos números como longitudes laterales de triángulos equiláteros produce una espiral agradable cuando los coloca todos juntos, al igual que la espiral de Fibonacci:
Imagen cortesía de Wikipedia.
Tarea
Su tarea es escribir un programa que recrea esta espiral mediante el arte ASCII, con la entrada correspondiente a qué término. Dado que un triángulo de longitud lateral 1 (1 carácter) es imposible de representar muy bien en ASCII, las longitudes laterales se han dilatado por un factor de 2. Por lo tanto, el triángulo de longitud lateral 1 se representa realmente así:
/\
/__\
Entonces, por ejemplo, si la entrada fue 5 (el quinto término), la salida debería ser:
/\
/ \
/ \
/______\
\ /\
\ /__\
\ /\ /
\/__\/
Los primeros 5 términos fueron 1, 1, 1, 2, 2, por lo que el triángulo tenía longitudes laterales 2, 2, 2, 4, 4 debido a la dilatación. Otro ejemplo para la entrada 8:
__________
/\ /\
/ \ / \
/ \ / \
/______\ / \
\ /\ / \
\ /__\/ \
\ /\ / \
\/__\/______________\
\ /
\ /
\ /
\ /
\ /
\ /
\ /
\ /
\ /
\/
Reglas
- Debe imprimir el resultado, y la entrada debe ser un número entero correspondiente al número de término
- Se permiten líneas nuevas y finales nuevas, también se permiten espacios finales después de las líneas
- Su envío debe ser capaz de manejar al menos hasta el décimo término (9)
- Su envío debe ser un programa completo o una función que tome datos e imprima el resultado
- Se permiten rotaciones de la salida, en múltiplos de 60 grados, pero el tamaño de los triángulos debe permanecer igual, junto con la representación
- Ir en sentido antihorario también está permitido
- Las lagunas estándar están prohibidas
Puede suponer que la entrada será> 0 y que se dará el formato correcto de entrada.
Tanteo
Este es el código de golf , por lo que gana el código más corto en bytes. ¡Feliz Año Nuevo a todos!
Respuestas:
Befunge,
871836798 bytesPruébalo en línea!
Como suele ser el caso con Befunge, el truco está surgiendo con un algoritmo que nos permite renderizar el patrón de arriba a abajo, ya que no es posible renderizarlo primero en la memoria con el espacio limitado disponible.
La forma en que esto funciona es primero creando una estructura de datos simple que represente los bordes necesarios para dibujar la espiral. La segunda etapa analiza esa estructura de arriba a abajo, mostrando los fragmentos de borde necesarios para cada línea de salida.
Con esta técnica, podemos admitir hasta n = 15 en la implementación de referencia antes de comenzar a tener problemas de desbordamiento en las celdas de memoria de 8 bits. Los intérpretes con un tamaño de celda mayor deberían poder admitir hasta n = 25 antes de quedarse sin memoria.
fuente
ir, 768 bytes
Por supuesto, esto no es óptimo, pero no es un mal comienzo. Sé que probablemente sea un poco simple para los estándares de golf, pero fue divertido y espero que no le importe si dejo algunas notas para el futuro.
Cómo funciona
Básicamente simulo una 'tortuga de dibujo' como en LOGO en una cuadrícula de píxeles ASCII, pero la tortuga solo puede hacer estos tres comandos:
Ahora para cada triángulo, voy así, donde P es 2 veces el enésimo número de Padovan:
El cuarto 'fd' significa que estoy volviendo a trazar el primer lado de cada triángulo. Esto ayuda a volver a un buen punto de partida para el próximo triángulo. La media vuelta a la derecha asegura que el próximo triángulo estará en la orientación adecuada.
Para jugar golf a la tortuga, almaceno 5 variables de estado en la matriz 态: posición x, posición y, velocidad x, velocidad y y 'runa de dibujo'. En cada cuadro de animación, x + = velocidad x, y + = velocidad y, y se dibuja la runa.
Luego configuré la tabla 表 que dice cómo realizar el turno. El código de giro es complicado debido a la forma en que funciona el arte ASCII. No es un movimiento directo como en una pantalla de píxeles. La dirección de la tortuga, determinada por la velocidad xey, determina los cambios necesarios para que el giro se vea bien.
Para girar, observa la velocidad actual de x e y, y las combina en un índice.
Este índice se utiliza para buscar un conjunto de 5 valores en la tabla 表. Esos 5 valores en la tabla 表 luego se agregan a cada una de las 5 variables en el estado 态. La tortuga se gira efectivamente y está lista para el próximo 'fd'.
Para rth, la mitad del giro a la derecha, hay una sección separada de la tabla 表. Está compensado por 7 * 5, o 35, entradas de la primera tabla en 表.
Por último, hice una codificación simple de los enteros de la tabla en una cadena ascii.
Sé que podría 'guardar bytes' eliminando el Hanzi, pero como dije, esto no es óptimo y hay más golf posible ... Los eliminaré cuando no haya otra optimización posible. Esos Hanzi en realidad tienen un significado vago basado en su significado real, y aunque no sé chino, me ayuda a pensar en el programa.
Para probar el código, necesitará un archivo golang completo, con este encabezado
y este pie de página
Gracias
fuente