Objetivo
Tengo una bonita foto que quiero colgar en mi pared. Y quiero que cuelgue allí de una manera espectacular, así que decidí colgarlo en las n
uñas donde n
hay un número entero positivo.
Pero también soy indeciso, así que si cambio de opinión, no quiero tener muchos problemas para sacar la foto. Por lo tanto, quitar cualquiera de las n
uñas debería hacer que la imagen se caiga. ¿Mencioné que no hay fricción en mi casa?
¿Me puedes ayudar?
Reglas
- Su programa debe leer el número
n
de stdin e imprimir en stdout (o los equivalentes de su idioma). - La salida debe ser la solución de acuerdo con la especificación de salida sin ningún otro carácter final o inicial. Sin embargo, los espacios en blanco finales y / o las nuevas líneas son aceptables.
- Debes usar exactamente las
n
uñas. - Suponiendo un mundo sin fricción, su solución debe cumplir las siguientes condiciones:
- Colgando la imagen como se describe en su solución, la imagen no debe caerse.
- Si se quita alguna de las uñas, la imagen debe caerse.
- Se aplican lagunas estándar. En particular, no puede realizar solicitudes, por ejemplo, al programa de verificación de soluciones de fuerza bruta.
Tenga en cuenta que 4.2 ya implica que todas las n
uñas deben estar involucradas.
Especificación de salida
- Todas las uñas se nombran de izquierda a derecha con la posición en la que se encuentran, comenzando en
1
. - Hay dos formas fundamentales de colocar la cuerda alrededor de un clavo: en sentido horario y en sentido antihorario. Denotamos un paso en sentido horario con
>
y un paso en sentido antihorario con<
. - Cada vez que la cuerda se coloca alrededor de una uña, sale por encima de las uñas, por lo que saltar uñas significa que la cuerda pasará por la parte superior de las uñas intermedias.
- Cada solución debe comenzar en la uña
1
y terminar en la uñan
. - La salida debe consistir en una secuencia de pasos en los que un paso es una combinación del nombre del clavo y la dirección en la que se coloca la cuerda alrededor.
Salida de ejemplo
Aquí hay un ejemplo de salida para n=5
y n=3
:
1>4<3<2>4>5< # n=5, incorrect solution
1>2<1<2>3<2<1>2>1<3> # n=3, correct solution
Y aquí hay una representación visual de la solución incorrecta para n=5
(awsumz gimp skillz)
La solución correcta para n=1
es simplemente 1>
o 1<
. Para múltiples uñas, puede haber diferentes soluciones. Solo debe generar uno ya que esto es parte de su puntaje.
Verificación
Puede verificar si una solución es correcta aquí: www.airblader.de/verify.php .
Utiliza una solicitud GET, por lo que puede llamarla directamente si lo desea. Por ejemplo, si foo
es un archivo que contiene una solución en cada línea, puede usar
cat foo | while read line; do echo `wget -qO- "www.airblader.de/verify.php?solution=$line" | grep "Passed" | wc -l`; done
Si cree que una solución es correcta pero el verificador la marca como incorrecta, ¡hágamelo saber!
Editar: y si su salida es tan larga que una solicitud GET no la cortará, hágamelo saber y haré una versión de solicitud POST. :)
Puntuación
Este es el código de golf. El puntaje es el número de bytes de su código fuente en la codificación UTF-8, por ejemplo, use esta herramienta . Sin embargo, hay una bonificación potencial por cada presentación:
Ejecute su programa para todos n
en el rango [1..20]
y agregue la longitud de todas las salidas para determinar su puntaje de salida . Reste su puntaje de salida 6291370
para obtener la cantidad de puntos de bonificación que puede deducir de su conteo de bytes para obtener su puntaje general . No hay penalización si su puntaje de salida es más alto que este número.
La presentación con el puntaje general más bajo gana. En el caso improbable de un empate, los desempates están en este orden: puntos de bonificación más altos, menor recuento de bytes, fecha de presentación anterior.
Publique las partes individuales (recuento de bytes, puntos de bonificación) del puntaje y el puntaje final, por ejemplo, " LOLCODE (44 - 5 = 39)
".
1>
se dibuja en la imagen). Y no hayn
donde no hay solución posible. Una solución válida paran=2
es1>2<1<2>
.Respuestas:
GolfScript (
5167 bytes + (73107150 - 6,291,370) = -6,284,153)Esto se basa en la construcción recursiva del conmutador de Chris Lusby Taylor * , mejor explicada en Picture-Hanging Puzzles , Demaine et al., Theory of Computing Systems 54 (4): 531-550 (2014).
Salidas para las primeras 20 entradas:
Nota: creo que las respuestas más largas no pasarán la prueba en línea porque usa en
GET
lugar dePOST
y no se garantiza que las URL se manejen correctamente si tienen más de 255 caracteres.Hay dos ajustes en la construcción estándar:
[x_1, x_2^-1]
lugar de[x_1, x_2]
.* Sin relación, que yo sepa.
** Bueno, dentro del mismo enfoque de conmutador recursivo. No pretendo haber resuelto el problema abierto de demostrar que es óptimo.
fuente
Python 2 (208 bytes + (7230 - 6,291,370) = -6,283,932)
La función
f
hace una respuesta recursiva combinando medias soluciones como A ^ {- 1} * B ^ {- 1} * A * B, representa inversos por negación.f(a,b)
es una solución para los números en el intervalo medio abierto[a,b)
.Editar: para cumplir con el requisito de comenzar
1
y terminarn
, cambié el orden para terminar siempren
usando intervalos invertidos, y simplemente agregué"1<1>"
al principio.Editar : se guardaron 136 símbolos en la salida al redondear a la inversa en intervalos de selección, lo que hace que los intervalos con números más grandes (y por lo tanto más probable que tengan dos dígitos) sean más cortos.
Editar : se guardaron 100 símbolos dividiendo los intervalos de manera desigual para que el que tiene números más grandes sea más corto. Esto no alarga el número de operaciones utilizadas siempre que las longitudes nunca crucen potencias de 2.
Editar : Reintroducción de redondeo favorable, -50 símbolos, 2+ caracteres de código.
Salidas del 1 al 20:
fuente
n>n<
entonces.n=1
solución ahora. Trabajando en ello)C - (199 bytes - 0) = 199
Con saltos de línea:
Probablemente un algoritmo bastante ingenuo dado que no sé mucho sobre teoría de nudos. Básicamente solo agrega el siguiente número más alto, luego invierte todo el conjunto de instrucciones para desenrollarlo. Esto probablemente sería mucho más conciso en un lenguaje que maneja los conjuntos mejor ...
La longitud total de salida
n
en el rango[1..20]
fue de 6.291.370 bytes de salida (3.145.685 instrucciones). Esto fue lo suficientemente grande como para que solo publique resultados de muestra paran
el rango[1..10]
.fuente
6,291,370
es exactamente el número correcto que quería publicar. Accidentalmente solo publiqué el númeron=20
, no la suma de todos. Tendré que ponerlo en marcha[1..10]
.199 + 0 = 199
.