Cubically es demasiado tedioso para escribir manualmente cualquier código. Su desafío es traducir el texto ASCII al código fuente Cubically.
Cúbicamente
Esto es solo un descuido rápido de Cubically; El repositorio tiene una guía y detalles más completos.
Cúbicamente es un esolang que escribí hace un tiempo, diseñado para ser doloroso de usar. Contiene dos piezas de memoria, un Cubo de Rubik 3x3x3 y un registro llamado "bloc de notas".
Memoria
El cubo interno de Rubik se inicializa así:
000
000 top face
000
111222333444 left, front, right, and back faces, respectively
111222333444
111222333444
555
555 down face
555
Después de realizar un giro de 90 ° en sentido horario en la cara derecha, el cubo de memoria se vería así:
002
002
002
111225333044
111225333044
111225333044
554
554
554
Comandos
Un carácter no entero establece el comando predeterminado. Para cada número entero antes de que el comando predeterminado se establezca una vez más, el comando se ejecuta con ese número entero. Por ejemplo, x524y312
realizaría un comando x
con 5, luego con 2, luego con 4, luego realizaría un comando y
con 3, luego con 1, luego con 2.
Los enteros que usan los comandos representan índices faciales. Por x0
lo tanto, se realizaría x
en la cara UP (índice 0). x1
funcionaría x
en la IZQUIERDA (1 índice), y así sucesivamente.
La ejecución de cualquier comando con 6
ejecutará ese comando en el valor del bloc de notas. La ejecución de cualquier comando con un número entero mayor de 6 dará como resultado un error.
Aquí hay algunos comandos de ejemplo:
R1
- gire la cara DERECHA 90 ° en sentido horario para que el cubo interno se vea como el segundo ejemplo anteriorR11
- gire la cara DERECHA 90 ° en sentido horario dos veces, idéntico aR2
+0
- agregue todos los valores de la cara ARRIBA al bloc de notas+000
- Agregue todos los valores de la cara ARRIBA al bloc de notas tres veces@6
- imprima la cara (memoria) sexta indexada inexistente como un carácter%4
- imprime la suma de todos los valores en la cara POSTERIOR como un entero
Una lista completa de comandos y sintaxis está disponible en el repositorio .
Desafío
Tomará el texto ASCII como entrada e imprimirá un programa cúbico como salida.
Ejemplos (robados de aquí y de aquí ):
Input -> Output
Hello, World! -> +53@6+1F2L2+0@6L2F2U3R3F1L1+2@66L3F3R1U1B3+0@6:4U1R1+00@6-000@6*0-4+000@6-00@6+2-000000@6-5+4000@6-00@6/0+00@6:0+0/0+00@6
1$2$3$4$5$6$7$8$9$10$ -> B1+2/2%6@4+00/0%6@4+00/1%6@4+21/1%6@4+30/0%6@4+22/1%6@4+22/1%6@4+40/1%6@4+52/1%6@4+42/1%6@4
Reglas
- Es posible que su programa no contenga un diccionario que contenga las traducciones para los 100 casos de prueba.
- Su programa debe finalizar en menos de 180 segundos (no hay programas de fuerza bruta que demoren semanas).
- Su programa debe generar un código cúbico válido que finalice en menos de 180 segundos.
- Su programa tomará la entrada a través de la entrada estándar, a menos que desee meterse con el controlador de prueba.
- Su programa debe generar código cúbico que no produce nada más que la entrada de su programa cuando se ejecuta. ಠ_ಠ
Puntuación
Probará su programa con 100 cadenas pseudoaleatorias de longitud pseudoaleatoria. (Se proporciona un script de bash que lo hará por usted). Así es como puntuará:
- Deje que la longitud del programa de salida sea o .
- Deje que la longitud de la cadena de entrada sea l .
- Deje que una variable r sea el resultado de o / l .
- Encuentre el promedio de todos los r : (r 1 + r 2 + r ... + r 100 ) / 100 .
Prueba con este script. Tendrás que modificarlo según las instrucciones. Tenga en cuenta que el programa no verifica si la salida es válida Código cúbico. Si no puede hacer que el script funcione, puedo ayudarlo. Envíame un ping en la sala de chat Cubically .
fuente
@6
preciso imprimir la suma de la cara inexistente del sexto índice (bloc de notas) como un carácter"? ¿%4
También es una suma? ¿Los+
comandos suman cara y luego los agregan a todos los valores o ...?@6
/%6
solo imprime directamente el valor del bloc de notas como un carácter / entero.@x
/%x
(donde x es cualquier cara existente) agrega todos los valores en lax
cara indexada e imprime la suma como un carácter / entero.+
agrega todos los valores en la cara especificada al registro.Respuestas:
C ++ 11, Puntuación : 6.37
Pruébalo en línea! (generar código cúbico desde ASCII) y (ejecutar código cúbico)
Explicación:
{0,9,18,27,36,45}
a{6, 15, 27, 26, 19, 42}
. Lo que hace que el conjunto de suma de caras sea útil es que el mcd es 1, por lo que, según la identidad de Bézout, existe una forma de construir cualquier número ad
partir de una suma (o diferencia) de esos números.ch
y el valor actual del bloc de notas esn
, entonces letd = ch - n
, podemos ejecutar comandos Cubically en la forma+{digits from 0 to 5}-{digits from 0 to 5}
tal que el valor del bloc de notas se conviertach
. Luego, simplemente ejecute%6
para imprimir el valor del bloc de notas.d
como una suma / diferencia de números en el conjunto de suma de caras, utilizo el algoritmo Knapsack para todos los números del 0 al 128. Por ejemplo, parad=1
, el programa obtiene27 - 26 = 1
, por lo que imprime+2-3
, que es27 - 26 = 1
. Que se puede ver cuando se ejecuta el programa con entradaabc
, la salida del programafuente
@
implícitas,@6
se puede acortar@
en todos los casos.Lua, Puntaje :
85.9113.5013.2012.709.419.329.839.669.129.068.03 (Promedio)Pruébalo en línea!
Bien, no creo que pueda optimizar esto más.
Esta versión itera a través de cada carácter, agregando c% 9 (donde c es el valor decimal del carácter) haciendo
:5+2/1
, luego agrega las partes divisibles por 9 agregando el valor de esa cara. Por ejemplo::2/1+551@
para imprimir "e", donde:2/1
agrega 2,+551
agrega 99 (9 * (5 + 5 + 1) o 9 * 11) e@
imprime la salida. La entrada se lee conio.read()
.Las optimizaciones incluyen sumar / restar directamente después de imprimir si la diferencia entre caracteres es un múltiplo de 9, dividir el valor actual si es posible en lugar de establecer c% 9 desde cero y repetir caracteres imprimiendo el valor actual nuevamente en lugar de volver a calcularlo. Además, he implementado el método de Kamil de imprimir instantáneamente cualquier cara que ya contenga el valor objetivo, y la sugerencia de MD XF de no usar
:
al principio, sino simplemente comenzar con un+
.fuente
local inp = io.read()
alocal inp = io.read("*all")
. Eso soluciona el problema.:5+124
, simplemente puede escribir+5124
, lo que probablemente reducirá un poco la puntuación si lo ajusta correctamente.Cúbicamente , Puntuación : 86,98
Pruébalo en línea!
Resulta que todo lo que necesita son bucles condicionales, una cara igual a 1 y un comportamiento consistente de fin de entrada.
La suma / resta de la cara IZQUIERDA es hacer que el ciclo finalice cuando se lee EOF.
fuente
@
implícitas,@6
se puede acortar@
en todos los casos.C # (.NET Core) , puntaje:
129.9811.7310.829.6210.3310.3210.20-1,2 puntos de la sugerencia de MD XF de usar en
@6666...
lugar de@6@6@6@6...
para repetir caracteres y una secuencia de inicialización superiorPruébalo en línea!
¡Mi versión más reciente en realidad manipula el cubo! ¡Hurra!
Primero
Console.Write
, hay una manipulación fija que MD XF resolvió que crea este cubo:La importancia de este cubo es que uno de sus lados tiene una suma de 1, lo que permite manipulaciones del Bloc de notas en una escala menor que múltiplos de nueve, y en particular simplifica el movimiento relativo en lugar de tener que comenzar desde cero cada carácter; En este algoritmo, tanto la suma como la resta se utilizan para tomar el camino más corto entre los caracteres.
La versión de MD XF de la inicialización hace que el lado 2 tenga una suma de 14, lo que ahorra muchos bytes de salida para distancias ASCII entre 14 y 20.
Ahora puede manejar entradas con nuevas líneas internas, Console.Read () obtiene caracteres individuales hasta el final del archivo; ver el enlace TIO que debe tener la entrada
Afeitó un par de fracciones de un punto al generar inmediatamente un carácter si su valor ASCII ya existe en un lado.
Script de prueba cortesía de MDXF
Presentación previa aquí y explicación:
Esto es un poco aburrido, pero por lo que puedo decir, funciona. Es cierto que solo lo intenté,
Hello, World!
pero ejecuté la salida en el intérprete TIO Cubically y dio la salida "¡Hola, mundo!" Así que supuse que funciona.En lugar de manipular realmente el cubo, el bloc de notas simplemente se incrementa por la suma de la 1 cara (9) repetidamente hasta que tenga el valor correcto para cada carácter, luego lo imprime.
fuente