Una vez me encontré con este (mini) juego en el que tenías 4 o más tuberías verticales que estaban conectadas por una serie de tuberías horizontales y tienes que dejar caer una bola o agua en las tuberías verticales.
Hay 2 tipos que conozco:
- Coloca el objeto en un balde / canasta debajo de una de las salidas (adivina en qué tubería tirarlo)
- Adivina de qué tubería vendrá el objeto.
Tubos de muestra:
| | |-------|
|-------| |-------|
| |-------| |
|-------|-------|-------|
| |-------| |
|-------| |-------|
|-------| |-------|
| |-------| |
Reglas básicas:
- Al moverse a través de una tubería horizontal, el objeto caerá cuando sea posible
- Al moverse a través de una tubería vertical, el objeto se convertirá en una tubería horizontal cuando sea posible.
Tu trabajo
- Escriba un programa que cree una cuadrícula aleatoria de tuberías (consulte las tuberías de muestra).
- Debe haber al menos 4 tubos verticales y una buena cantidad de tubos horizontales al menos 10.
- La longitud de las tuberías verticales depende de usted.
- Muestre el camino que tomó el objeto para llegar al fondo y muestre cuántos giros tomó para llegar allí.
- Entrada (opcional) para determinar el punto de partida, tuberías numeradas 1..N de izquierda a derecha.
Monitor:
| vertical pipe
- horizontal pipe
: vertical pipe used by the object
= horizontal pipe used by the object
V Object starting point
^ Object ending point
Ejemplo:
V
: | |-------|
:=======: |-------|
| :=======: |
|-----!-:=======: |
| :=======:-------|
|-------| :=======:
|-------| :=======:
| :=======: |
^
14 turns were taken to get to the end.
Detalles
El objeto ingresa a la tubería 1 y comienza a moverse hacia abajo, pasa a la izquierda en la primera tubería horizontal.
Vuelva a bajar y hacia la segunda tubería seguido de un giro en U hacia la tercera tubería.
Al final de la tercera tubería, ve un signo de exclamación, no
debería estar en su resultado, pero lo usé para mostrarle que el objeto podría haber seguido adelante.
Sin embargo, la regla número 1 lo impide.
El ganador será determinado por votos en 3 semanas a partir de ahora 24-02-2014 (dd-mm).
Feliz codificación ^. ^
fuente
Respuestas:
Mathematica
El código 2D genera un gráfico que muestra la ruta del agua. Mostré los números de vértice para una verificación cruzada conveniente con la pantalla 3D. Normalmente los números de vértice estarían ocultos.
Entrada:
En realidad, el resultado contiene múltiples objetos. El primer objeto,
result[[1]]
es el gráfico 2D que se muestra aquí.Los tubos tridimensionales son
Tube
trazados (líneas 3D) en 3 espacios. Las coordenadas calculadas en función de los vértices del gráfico 2D a lo largo de una tercera coordenada que se generó aleatoriamente (esto permite que las tuberías asuman diferentes posiciones a lo largo de y cada vez que se ejecuta el código).Los ejes se muestran para ayudar al lector a convencerse de que el renderizado 3D se basa en el renderizado 2D.
La entrada 3D de interés aquí es:
El número o filas, columnas y columna de entrada se toman del código 2D. No tienen que ser reingresados.
Código 2D
En los próximos días documentaré y ordenaré el código para 2D y 3D.
Código 3D y resultados
fuente
C#
(a través de LINQPad, en modo "Programa C #")
Tendré que aplicar Equitable Stroke Control, en la medida en que pueda jugar golf, pero este es mi enfoque en C # (bueno, LINQPad, pero ¿quién quiere todo lo que se necesita para hacer que una aplicación C # funcione?) .
Las definiciones de cuadrícula son variables, con una serie de tuberías verticales y altura de la estructura general, y son repetidamente aleatorias al pasar una semilla (ver el
PipeGrid
constructor).En ausencia de una respuesta definitiva sobre la forma en que fluiría el objeto si fuera posible en cualquier dirección, le he permitido especificar un comportamiento a partir de una serie de opciones (ver
SolveBehavior
enumeración /PipeSolver
constructor).El comienzo vertical es definible (ver
PipeSolver.Solve
).Supuse que las tuberías horizontales siempre están entre dos tuberías verticales adyacentes , es decir, ninguna horizontal puede pasar por alto una tubería horizontal.
Actualizar:
Temiendo que mi salida de texto anterior sea un poco monótona para este contexto de popularidad, ofrezco una versión extendida que también dibuja el camino tomado como una imagen. Lo he modelado como un automóvil, conduciendo a través de una horrible red de carreteras, tratando de llegar al fondo, pero con el peor GPS del mundo que te obliga a girar en cada cruce.
Como beneficio adicional, esto también hace que sea más claro ver los 'turnos'.
Disfruta - vroom vroom !!
Resultados de ejemplo:
(verticales: 10, altura: 10, semilla aleatoria: 5, tubería inicial: 2, comportamiento de resolución: FlipFlop})
fuente
C#
¡Tiempos divertidos! :-)
Este código asegura que haya al menos algo de tubería recta en cada extremo de cada tubería. También asegura que no haya giros ambiguos.
Salida:
fuente
Funciton
Como si Funciton no estuviera entre los idiomas más inútiles del mundo, este es sin duda el programa más inútil que he escrito hasta ahora.
Dado que esto se ve feo en StackExchange debido al espaciado de línea adicional, considere ejecutar lo siguiente en la consola de JavaScript de su navegador para solucionarlo:
Como Funciton no tiene un generador de números aleatorios, decidí permitirle ingresar el patrón de tubería. Dado que la codificación del patrón no es obvia, golpear las teclas de dígitos en su teclado al azar es tan bueno como un generador de números aleatorios.
Se espera que la entrada sea tres números decimales separados por espacios. El primer número es el ancho (uno menos que el número de tuberías verticales); el segundo es el índice de la tubería de inicio y el último es cualquier número que codifique el patrón de tubería horizontal; puedes hacerlo tan grande como quieras. Si el ancho es negativo o el índice de la tubería está fuera de rango, la salida es
Impossiburu.
El programa garantiza automáticamente que nunca haya dos tuberías horizontales una al lado de la otra, lo que podría causar giros ambiguos.
Explicación
El programa principal encuentra los dos primeros espacios y divide los números. Ejecuta el tercero (el patrón de tubería)
░
y luego llama▒
con el resultado, que devuelve la salida, así como el número de turnos realizados. Luego agrega el texton turns were taken to get to the end.
, donden
es el número de vueltas calculado por▒
.░
toma un número e inserta un0
bit después de cada1
bit, asegurando así que nunca haya dos tubos horizontales en sucesión.▒
genera la salida llamando sucesivamente▓
y luego desplazando el número correcto de bits del patrón de tubería hasta que sea cero. También incrementa o disminuye la "tubería actual" de manera apropiada.▓
genera una línea de la salida. En cada iteración, se desplaza un bit del patrón de tubería y luego decide si generar│
(+ 4 espacios),║
(+ 4 espacios)├────┤
,╔════╝
o╚════╗
; En los últimos tres casos, elimina el primer carácter de la siguiente iteración. La última iteración genera│\r\n
o║\r\n
según corresponda.Salida de ejemplo
Entrada:
Salida:
Entrada:
Salida:
Entrada:
Salida:
fuente
Groovy, 311
Aquí está formateado:
Salida de la muestra:
Otra salida:
(Sé que hice code-golf en lugar de popularidad, pero ese es solo mi estilo)
fuente
JavaScript
El lienzo HTML escucha los eventos de clic y encuentra la fila de tuberías más cercana y la usa como punto de partida. La salida se dibuja en el lienzo y también hay un área de texto que contiene la salida ASCII definida por el OP.
El algoritmo asegurará que nunca haya dos tuberías horizontales conectadas. Además de esa restricción, se define una probabilidad en las variables iniciales y se usa para determinar aleatoriamente si una tubería horizontal debe ocurrir o no.
JSFIDDLE
Salida
fuente