¿A quién no le gustan las películas de acción con autos rápidos y ruidosos, especialmente aquellos con muchos accidentes? ¿Quién no ama las tomas de acción en el arte ascii?
La escena es:
Dos autos comienzan en lados opuestos de una carretera recta (con 60 espacios entre ellos). Comienzan a conducir uno hacia el otro a velocidades constantes. El automóvil a la izquierda conduce a 1 espacio por segundo, y el de la derecha conduce a 2 espacios por segundo.
Obviamente, los autos no pueden cruzarse entre sí, por lo que n ≥ 20
la escena será dos autos chocados con capó en la posición donde ocurrió el accidente.
Como amante del cine, quiero pausar la escena de vez en cuando, solo para disfrutar de su belleza.
Dado un número entero n
(argumento de función o STDIN), que representa el número de segundos desde el comienzo de la escena, muestra la escena en ese momento.
Esta es la escena inicial, con 60 espacios entre las ruedas delanteras:
__ __
_/ \_ _/ \_
o o o o
Esta es la escena después de 11 segundos:
__ __
_/ \_ _/ \_
o o o o
y esto es lo que parece después del bloqueo (tenga en cuenta que los capó están arriba después del bloqueo):
__ __
_/ \/\/ \_
o oo o
Solo estoy interesado en ver dos autos chocando, por lo que los espacios, las nuevas líneas, ++ no importan.
Este es el código de golf, por lo que gana el código más corto en bytes. Las respuestas agregadas más tarde aún pueden ganar si son más cortas que la respuesta actual aceptada.
/ \
en lugar de abajo_ _
?Respuestas:
CJam,
6866 bytesPruébalo en línea
¡Cualquiera que vea el inicio del código lo asegurará
liKe
!Explicación:
fuente
Laberinto ,
394386bytesOs presento con orgullo ...
... mi nuevo laberinto bidimensional esolang! El código anterior no es increíblemente bueno (hay 161 espacios y 25 NOP, por lo que un mejor diseño podría acortar mucho esto), pero al menos logré demostrar que el lenguaje es utilizable para tareas no triviales. :)
Cómo funciona
Primero, una descripción rápida del idioma:
"
es un NOP que no es un muro y puede ser útil para rellenar ciertas rutas en el código. A diferencia de muchos otros lenguajes 2D, los bordes no se ajustan.@
termina el programa>v<^
que desplazarán una fila o columna del código fuente cíclicamente por una celda. La fila o columna afectada depende de la parte superior de la pila. Si la propia fila o columna de la IP se desplaza, se moverá con el cambio. Esto hace posible saltar de un borde del código fuente al otro.Ahora para este desafío particular, aquí está la idea general del algoritmo:
/ \_o oo o
) en la pila auxiliar.__
o el/\
siguiente.__ __ _/ \
y dos espacios principales) en la pila auxiliar.20
, Llamemos a esto N .Finalmente, veamos algunas partes del código. La IP comienza en la esquina superior izquierda, en un comando de cambio de cuadrícula. La parte superior de la pila principal es
0
(que se usa como índice relativo), por lo que la primera fila se desplaza hacia la izquierda, lo que también mueve la IP al extremo derecho de la cuadrícula. Ahora la primera fila simplemente se ejecuta de derecha a izquierda, lo que empuja el primer conjunto de caracteres fijos a la pila auxiliar:Este cambio de fila es útil para jugar al golf cuando desea comenzar con una gran cantidad de código lineal.
A continuación, leemos la entrada y empujamos los sombreros correctos:
El bit de la izquierda con los tres NOP envía resultados negativos a lo largo de la rama superior y resultados no negativos a lo largo de la rama inferior. A la derecha se vuelven a unir.
Ahora sigue otra sección lineal grande (que probablemente podría jugar mucho con otro truco de cambio de fila):
Esto empuja el resto de los autos a la pila auxiliar.
A continuación, calculamos
min(20, input)
, que es similar a la primera rama:Finalmente, tenemos el bucle que se ejecuta tres veces para imprimir las líneas. Cada iteración del bucle contiene dos bucles pequeños (3x3) para imprimir los espacios, así como dos secciones para imprimir 6 caracteres desde la pila auxiliar:
Un ingenioso truco al que me gustaría llamar la atención es
.{.{.
en el borde derecho. Este es un callejón sin salida, por lo que, aparte del.
final, el código se ejecuta dos veces, una hacia adelante y otra hacia atrás. Esto proporciona una forma ordenada de acortar el código palindrómico (el problema es que debe asegurarse de que la IP tome el giro correcto cuando salga del callejón sin salida nuevamente).fuente
Python 2.7,
167164159 bytesEsto toma la entrada de stdin.
Demostración aquí
Probar esto -
fuente
(n,20)[n>20]
es simplementemin(n,20)
.(' \_',' \/')[s<1]
con' \\\\_/'[s<1::2]
.l
necesario? ¿Podrías simplemente hacerfor e in [' _',"_/ ","o "]:
y eliminar porl
completo?l
no es necesario ahora. Tuve que usarlo en una versión anterior. Gracias :)R, 191 bytes
Tan bueno como puedo conseguirlo ahora. Lleva los segundos de STDIN y gatos a STDOUT.
Explicación
Pruebas
fuente
formals()
. :)CJam, 120 bytes
Manifestación
Sin golf:
Manifestación
fuente
J
tiene un valor de 19,K
tiene un valor de 20, guardando un carácter cada una para esas constantes. Si necesita una matriz con un elemento, puede usar ela
operador para ajustar el elemento, en lugar de usar un par de corchetes.PHP,
160155 bytesEl código se muestra aquí en 3 líneas para adaptarse al diseño del cuadro de código. Esas nuevas líneas no son necesarias.
El código sin golf:
Obtiene el número de segundos de la línea de comando (primer argumento):
La opción CLI de PHP
-d error_reporting=0
es necesaria para ocultar algunos avisos que muestra PHP sobre constantes indefinidas (str_repeat
,_
) que convierte en cadenas (2 bytes guardados para cada aviso).Se puede guardar un byte adicional en PHP 7 apretando la inicialización
$f
en su primer uso ($m=($f=str_repeat)(...)
); no se compila en PHP 5.El caso de prueba y algunas de las técnicas utilizadas para reducir el código se pueden encontrar en github .
Actualizar:
@ ismail-miguel exprimió la inicialización
$left
e$c
incorporó los argumentos deecho
guardar 4 bytes (ver comentario más abajo).Al intercambiar el orden de las variables
$m
ys
se inicializan, eliminé un par de paréntesis y guardé 1 byte más.fuente
$f=str_repeat;$m=$f(' ',$r=60-3*($s=min(max($argv[1],0),20)));echo$l=$f(' ',$s)," __ $m __\n{$l}_/ \\",$r?_.$m._:'/\\',"/ \\_\n{$l}o o{$m}o o\n";
$f=str_repeat;echo$l=$f(' ',$s=min(max($argv[1],0),20))," __ ",$m=$f(' ',$r=60-3*$s)," __\n{$l}_/ \\",$r?_.$m._:'/\\',"/ \\_\n{$l}o o{$m}o o\n";
o o
en una variable pero obtuve la misma longitud o peor.\n
con nuevas líneas reales. Me habia olvidado de eso. Y cuenta como 1 byte cada unoJavaScript (ES6), 121 bytes
Usando la cadena de plantilla, las 2 nuevas líneas dentro de la cadena son significativas y contadas.
Para guardar bytes,
alert
imprima con , incluso si la fuente proporcional utilizadaalert
no es adecuada para el arte ASCII y el resultado es feo para n> = 20 (bloqueo).Prueba de ejecutar el fragmento en Firefox
fuente
Python 2, 148 bytes
Esto usa códigos de escape ANSI para colocar el cursor en el lugar correcto para dibujar los autos. Luego verifica si la entrada fue 20, si lo fue, retrocede y se basa en los capó del automóvil.
Toma un int de stdin, salida a stdout.
Sin golf:
fuente
Pyth, 67 bytes
Pruébalo aquí .
fuente
C,
180191168 bytessin golf:
Programa de prueba:
salida:
Pude jugar golf bastante duro. Creo que comencé con casi 300 bytes.
Pero no sé si esto aún cumple con todos los requisitos. Como puede ver después de 21 segundos, el primer automóvil empuja el segundo automóvil hacia la derecha. Necesitaría agregar algunos bytes si esto no está permitido.Editar: lo arregló. Esto debería ser más realista que Sharknado ;-)
Editar: podría acortar significativamente mi solución al echar un segundo vistazo a la
printf
página de manual. Si usa '*', puede suministrar la longitud del campo directamente a printf, sin la necesidad de crear una cadena de formato desprintf
antemano.fuente
> <> ,
538276 bytesHe bajado mucho el tamaño, estoy sorprendido de haber logrado reducir el tamaño a la mitad. El viejo está abajo. Este no es tan eficiente en cuanto al rendimiento debido al ancho de la cuadrícula, principalmente desde la primera línea.
Puedes probarlo aquí . ¡Ponga la cantidad de tiempo transcurrido en la "Pila inicial", no en la "Entrada"!
Aquí está la versión anterior.
fuente
Java, 258 caracteres
Sin golf
Resultados
fuente
Python 2, 102 bytes
Muy claro. Para cada fila del automóvil, imprimimos
n
espacios, esa fila,60-3*n
espacios y la fila nuevamente. Para detener los autos, en lugar de hacerlomin(n,20)
, fue un carácter más corto limitar la primera serie de espacios[:20]
, y el segundo está bien porque un negativo multiplicado por una cadena es la cadena vacía.Para subir las defensas, solo hacemos a
replace
. Como__
también aparece en el techo, necesitamos un poco de contexto para identificar los guardabarros, por lo que buscamos un/
seguimiento.fuente
Java,
270267 bytesEstoy bastante seguro de que hay una forma mejor / más corta de hacer esto, pero mi cerebro no está correctamente comprometido.
Para n = 19:
Para n = 20:
Sin golf
fuente
PHP 7, 140 bytes
Uso:
Guardar como ANSI en
file.php
(debe haber caracteres de ancho cero$o
) y ejecutar:con
x
como el número de segundos.Y una versión que funciona sin cambiar el informe de errores ( 148 bytes ):
fuente
Javascript, 193 bytes
No es un ganador, pero es algo.
http://jsfiddle.net/yb703y0p/2/
fuente