Introducción
Sísifo estaba teniendo algunos problemas en el trabajo últimamente. Parece que nunca hace nada, y le encantaría encontrar una solución a este problema.
Su empleo actual requiere rodar una roca cuesta arriba. Por lo general, hace bien su trabajo, pero cada vez que está cerca de la cima de la colina, cae de nuevo.
Se está realmente frustrado con su trabajo y quiere resolver el problema científicamente haciendo que una computadora simule la roca rodando cuesta abajo.
Da la casualidad de que Sísifo no es particularmente bueno en la programación, ¿entonces tal vez puedas ayudarlo?
El reto
Después de esta tonta introducción, vamos a los negocios. Su programa recibirá una ilustración de la colina y la roca que se parece a esto:
#o
##
###
######
########
Donde #
representa una parte de la colina y o
representa la roca.
Ahora debe implementar un programa que mueva la capa de roca 1 hacia abajo. Por ejemplo, el resultado de lo anterior debe ser:
#
##o
###
######
########
Si hay un área horizontalmente pareja, la colina simplemente rueda horizontalmente, así que ...
o
########
... esto solo haría que la piedra ruede de lado.
o
########
Si hay un área vertical, la roca cae un escalón, así que ...
#o
#
#
#####
... cedería ...
#
#o
#
#####
También recibirá el ancho y el alto de la imagen, respectivamente, en una línea sobre la imagen. Entonces, en total, nuestra entrada de muestra se vería así:
10 5
#o
##
###
######
#########
(Tenga en cuenta que los espacios en blanco aquí son espacios. Seleccione el texto y vea lo que quiero decir).
Algunos detalles
- Cuando la roca ya está en la última línea al ejecutar el programa, puede optar por finalizar el programa o generar la entrada sin cambios.
- La colina solo baja
Su programa debe formatear la salida exactamente igual que la entrada (incluidas las dimensiones), por lo que si canaliza la salida del programa a sí mismo, calcula el siguiente paso.
Puede suponer que siempre hay un camino hacia abajo, por lo que la entrada donde la ruta está "bloqueada" puede causar un comportamiento indefinido
Puede suponer que siempre hay un espacio en la última línea. La roca debe "descansar" allí, así que después de llamar al programa varias veces, siempre conectando su salida en sí misma, debe terminar con la roca en la última línea, colocando donde estaba el espacio anteriormente.
Puede aceptar la entrada en cualquier forma que desee (stdin, archivo, ...). Debe publicar el programa ENTERO (para que todas las variables preinicializadas cuenten como código).
Las líneas se terminan con
\n
.Puede obtener algunas entradas de ejemplo aquí (¡asegúrese de copiar los espacios correctamente!)
Este es el código de golf , por lo que gana la presentación de trabajo con la menor cantidad de bytes .
El ganador será elegido el 26 de julio de 2014. Después de eso, puede publicar soluciones, pero no puede ganar.
Si tiene alguna pregunta, hágamelo saber en los comentarios.
¡Feliz golf!
#
s, por lo que hay un espacio al final porque el ancho es 10. En este caso (después de algunas iteraciones) la roca se colocaría donde está el espacio en blanco (por lo tanto, en la parte inferior -esquina derecha).Respuestas:
Regex (.NET, Perl, PCRE, JavaScript, ... sabores), 25 bytes
Sí, esto creará cierto debate nuevamente, si una expresión regular es un programa válido, pero lo adelantaré y diré que esta presentación es solo por diversión y no necesita ser considerada para el ganador. (A diferencia de la variante Perl de 31 bytes en la parte inferior;).)
Así que aquí hay una solución de reemplazo de expresiones regulares puras.
Patrón (tenga en cuenta el espacio final):
Reemplazo (tenga en cuenta el espacio inicial):
El recuento de bytes es para la suma de los dos.
Puede probarlo en http://regexhero.net/tester/ . Asegúrese de elegir las terminaciones de línea de estilo Unix y "conservar el formato pegado" al pegar. Si todavía no funciona, todavía ha pegado los finales de línea al estilo de Windows. La solución más fácil en ese caso es reemplazar
\n
con\r\n
en el patrón para ver que funciona.Aquí hay una función ECMAScript 6 de 48 bytes que usa esto
Finalmente, también tengo un programa real. Son 31 bytes de Perl (incluidos dos bytes para
p
y0
banderas; ¡gracias a Ventero por la sugerencia!).Si quieres probarlo, ni siquiera lo guardes en un archivo, solo hazlo
fuente
\n
con\r\n
)Python - 190
Corte y concatenación de terror, junto con demasiadas variables. Estoy seguro de que esto se puede jugar más, pero no puedo pensar en ninguna función inteligente de Python en este momento. La entrada se almacena en cadena
s
.Dado que las cadenas de python son inmutables, reemplazo un personaje concatenando todos los caracteres anteriores, mi nuevo personaje y todos los caracteres posteriores. Utilizo el ancho de la colina y la indexación para determinar hacia dónde debe rodar la roca.
fuente
Ruby, 65/55 caracteres
Pensé que vería cuánto dura una solución que no solo arroje una expresión regular sobre el problema.
Como se esperaba, no es tan corto como la solución de expresión regular de m.buettner, pero tampoco mucho más.
Cuando se usan banderas de intérprete, esto se puede acortar a 55 caracteres (53 para el código, 2 para las banderas):
Ejecute el código así:
fuente
JavaScript HTML - 251 caracteres
( 251 si cuenta el código dentro de las comillas simples que lee la entrada y devuelve la salida. 359 si cuenta el cuadro de entrada, la cadena de entrada, el botón, etc. 192 si cuenta solo eso funciona).
Código de golf:
http://goo.gl/R8nOIK
Haga clic en "Ir" una y otra vez.
Método
Utilizo String.match () para dividir la colina en 5 partes, luego cambio una o dos partes. Estoy aprendiendo JavaScript, por lo que cualquier sugerencia sería apreciada.
Código legible
fuente
Python 2 -
289252 bytesHice algunas mejoras significativas, pero esto sigue siendo terrible. Se pueden guardar un par de bytes más al convertir esto a Python 3, pero no puedo identificarlo.
Primero, encuentro la roca. Si el carácter inmediatamente debajo está
'#'
, reemplace cada instancia de'o '
con' o'
. Como se garantiza que habrá un espacio adicional al final, esto siempre moverá la roca hacia la derecha.Independientemente de si acabo de hacer eso o no, transpongo toda la cuadrícula con
zip(*m)
. Luego, hago otro reemplazo de'o '
con' o'
. Si hay un espacio a la derecha de la roca, eso significa que en la cuadrícula real hay un espacio debajo, por lo que se mueve. Luego lo transpongo e imprimo.fuente
#
, y hago esa verificación antes de hacer la verificación para moverme verticalmente.Pitón (201)
fuente
awk, 152
Más legible
fuente
php
485484 caracteresSé que esto es enorme en comparación con la entrada de m.buettner, pero es lo mejor que puedo hacer por ahora. Creo que debe haber una forma más rápida de convertir la cadena de entrada en una matriz multidimensional, pero ahora es muy tarde.
Y aunque no es competitivo, me gustó este rompecabezas. Quisiera que la extensión muestre dónde termina la pelota, o después de un número determinado de pasos, quizás agregado después del ancho y la altura en la línea de entrada. Podría agregar eso muy fácilmente a esta versión.
Aquí está mi código: la entrada está en la primera variable.
Puedes verlo aquí en acción en el teclado
Editar: se modificó el código y el código anterior, ya que generaba 0 en lugar de o, lo que causó un problema cuando intenté alimentar la salida nuevamente en el programa. ¡Arreglado ahora y guardado un personaje!
fuente
Maravilloso -
263261256 caracteresGolfizado Lea el archivo en una cadena y use una función
p
para emular una funciónString.putAtIndex(index,value)
:Sin golf (algo):
fuente
try{
lugar detry {
y encatch(Exception
lugar decatch (Exception
.R, 234
La manipulación de cuerdas no es el punto más fuerte de R.
Más legible:
fuente
C (182)
O, si realmente quieres leer el código:
fuente
Clojure - 366 caracteres
Sin expresiones regulares. Archivo de entrada requerido llamado "d". Golfizado:
Sin golf:
Ejecución de muestra (solo un caso, por brevedad):
Soy un novato Sugerencias de bienvenida.
fuente
MATLAB, 160
La parte dolorosa es la entrada del archivo. El cálculo real sería de solo 114 bytes:
fuente