CJam, 23 16 bytes
Probablemente haya una solución matemática elegante para este problema. Pero no tengo idea de cómo encontrar uno, ¡así que es una codificación dura super comprimida!
¡Encontré uno! Bueno, no es una solución matemática clásica y elegante, ya que utiliza operaciones bit a bit, pero es completamente formulada.
li_o1^_p_6|o3+6%
Pruébalo en línea.
Diseño de cubo
4-----7 4-----7 3-----2
/| /| / 0 /| / 3 /|
1-----0 | 1-----0 | 6-----5 |
| | | | | |2| | |4|
| 5---|-2 | 1 | 2 | 5 | 7
|/ |/ | |/ | |/
6-----3 6-----3 1-----4
Explicación
Mi respuesta anterior ya presentaba el cubo de tal manera que cada cara puede describirse con su primer número de vértice (superior izquierdo) igual al número de la cara. Pero quería poder calcular más números de vértice usando el número de la cara. En algún momento, se me ocurrió la idea de meter el pie en la puerta, para calcular el segundo número de vértice (arriba a la izquierda) como el número de cara XOR 1. Y después de un tiempo de prueba y error, logré aparecer con el diseño que se muestra arriba y las fórmulas a continuación que me permiten calcular cada número de vértice para una cara de manera n
bastante sucinta:
- Arriba a la izquierda:
n
- Parte superior derecha:
n^1
- Abajo a la izquierda:
(n^1)|6
- Abajo a la derecha:
((n^1)+3)%6
Como referencia, reproduciré la salida para cada cara en el diseño deseado aquí:
Face: 0 1 2 3 4 5
Vertices: 01 10 23 32 45 54
74 63 70 65 72 61
Entonces, todo el programa se reduce a leer el número de entrada y producir estos valores en orden, aunque con una lógica de impresión ligeramente diferente para diferentes vértices. Tenga en cuenta que, dado que cada vértice después del primero comienza con una base de n^1
, solo necesito calcular eso una vez, lo que compacta aún más la lógica.
Por el bien de la posteridad, y porque creo que todavía era un enfoque bastante bueno, aquí está mi vieja respuesta.
CJam, 23 bytes
Probablemente haya una solución matemática elegante para este problema. Pero no tengo idea de cómo encontrar uno, ¡así que es una codificación dura super comprimida!
"pÜ×ñè¨"487b8b3/ri_o=~p
Pruébalo en línea.
Diseño de cubo
0-----7 0-----7 3-----6
/| /| / 0 /| / 3 /|
1-----2 | 1-----2 | 4-----5 |
| | | | | |2| | |5|
| 5---|-6 | 1 | 6 | 4 | 7
|/ |/ | |/ | |/
4-----3 4-----3 1-----0
Explicación
El enfoque básico empleado es codificar los vértices de cada cara en el menor espacio posible. De manera similar a la solución de conversión de base de Optimizer, trata la lista de vértices como un número octal empaquetado como datos de caracteres ASCII. ¡Pero ahí es donde terminan las similitudes para dar paso a nuevas optimizaciones!
Aquí están las tres optimizaciones clave que hice a la solución "ingenua":
- Diseñe el cubo de modo que cada cara pueda describirse con su número de cara como el primer número de vértice. Mirando el diseño de mi cubo como se presentó anteriormente, uno puede ver que el número de vértice superior izquierdo de cada cara es igual al número de cara. Esto me permite codificar seis vértices menos a costa de tener que volver a imprimir la entrada, lo que resulta para guardar un byte.
- Empaquete los datos del vértice en una cadena para la cual cada "carácter" tenga un máximo mayor que 256. A medida que este máximo aumenta más allá de 256, la longitud de la cadena disminuye lentamente, pero es cada vez más probable que cualquier "carácter" exceda 256 y sea por lo tanto, ya no forma parte del conjunto de caracteres ASCII de 1 byte. Así que escribí un programa que intenta codificar los datos de vértice en cada base de 256 a 1000, con los que encontré unas 10 bases que ahorran un byte de datos de caracteres en comparación con la base 256. Elegí 487, ya que también tiene la buena propiedad que la cadena resultante consiste completamente en ASCII imprimible.
- Mezclado con la primera optimización, produce la salida de forma asimétrica. El enfoque habitual en CJam sería formatear los datos de vértice como una lista de 2 elementos de listas de 2 elementos, insertar una nueva línea en el medio y dejar que la salida se imprima implícitamente. Pero, en cambio, imprimo el primer vértice (igual al número de entrada) con un operador que no agrega una nueva línea, recupero la lista de 3 elementos de los otros vértices, tomo el siguiente vértice e imprimo con un operador que agrega una nueva línea y deje que los otros dos vértices se impriman implícitamente. Esto ahorra un byte.
6+n%2 --> 6|n
(ya lo he incorporado a mi respuesta de Ruby). Tenga en cuenta que al realizar la transformaciónn --> n^1
en las caras, podría simplificar sus fórmulas, aunque supongo que a medida que descartan
y continúan^1
ganando No ayudo a su puntaje.n
yn^1
alrededor del cubo me permitiría calcular otro vértice con solo|6
. Y no vi esan --> n^1
transformación, lo que definitivamente tiene sentido. Pero usted supuso correctamente que en realidad no afectaría mi puntaje, por lo que probablemente lo dejaré tal como está.6+n%2 --> 6|n
) Espero que no te importe. Utilicé lan --> n^1
transformación en las caras, por lo que mi última revisión ofrece los mismos resultados que la suya, pero con diferentes entradas. Por cierto, no creo que las operaciones de bits sean poco elegantes, ¡todo depende de cómo las uses!~.1^..n@6|@3+6%
C, 69
Sin golf en el programa de prueba
Explicación
Mi numeración de cubos, cuando está desplegada, se ve así:
La esquina superior izquierda tiene el mismo número que la cara.
La esquina inferior derecha tiene número
(n+2)%6
Por extraño,
n
la esquina superior derecha es(n+1)%6
y la esquina inferior izquierda es6
Porque incluso
n
la esquina superior derecha es7
y la esquina inferior izquierda es(n+1)%6
El programa muestra los números impares como se muestra y los números pares giraron 180 grados. Esto significa que la esquina superior derecha es siempre
(n+1)%6
y la esquina inferior izquierda es siempre(n+1)%2+6
. Invertirn
yn+2
es más fácil (se hace configurandoc=n+1
y usandod
para sumar o restar1
o-1
según sea necesario).Salida
fuente
c%6
ac%=6
y girando la cara por lo que ocurra primero, debería ser posible eliminar algunos cálculos de módulo.) Otra cosa a experimentar con IS desplazando el etiquetado de la cara por un lugar, así que obtengo enn-1,n,n+1
lugar den,n+1,n+2
.n
global, por lo que podría guardar unos pocos bytes declarándolo más alto, cambie la firma af()
? ¿O solo estamos viendo laf
función aquí?"You may write a function instead of a program"
así que solo estoy contando la función. En cualquier caso, esto fue solo una prueba de concepto en el lenguaje con el que estoy más familiarizado. Estoy más interesado en acortar mi respuesta de Ruby, que desde el principio ya era mucho más corta que esta.Elemento, 18
A diferencia de muchos lenguajes de golf más avanzados, Element no tiene un operador de compresión, por lo que la brevedad de la solución está estrechamente vinculada al esquema de numeración exacto utilizado. Después de experimentar un poco, he creado un nuevo esquema de numeración que permite calcular los vértices utilizando solo operaciones aritméticas simples.
La esquina superior izquierda es 6 si es par y 7 si es impar. La esquina superior derecha es el número de la cara en sí. La parte inferior izquierda es el número de la cara, más 2, mod 6. La parte inferior derecha es 5 menos el número de la cara.
Aquí hay una explicación del código.
Aquí están las salidas para cada una de las caras:
fuente
Octava,
1081006850 bytesPor supuesto, hay una manera de hacerlo mucho más elegante que mis enfoques anteriores, simple codificación. Me sorprende cómo Octave es mucho más adecuado para codegolf que Matlab =)
Diseño:
(Lo siento, olvidé agregar esto)
Diseño de cubo
Versiones antiguas:
Incluso versiones anteriores:
Esto realmente va a hacer una matriz de 2x2x2 y luego elegir un 'corte'. Hacemos una permutación de matriz 3d y cada vez elegimos el corte superior o inferior. (Este no funciona en matlab debido a la indexación de una expresión en lugar de una matriz) Estoy seguro de que habría formas más directas de hacerlo que serían más cortas.
fuente
CJam,
3128 (o 26) bytesque también se puede comprimir mediante la conversión de base en una versión de 26 bytes .
Asume que el cubo es como:
con caras como
Pruébalo en línea aquí
fuente
CJam (25 bytes)
Contiene un carácter no imprimible y una pestaña (que será manipulada por el software StackExchange), por lo que en formato xxd:
Demostración en línea
Cubo:
Esto es pura codificación, con los vértices del cubo seleccionados para maximizar la compresibilidad base. Decodifico a números de 2 dígitos, por lo que ninguno de ellos puede comenzar con 0. Tampoco quiero que ninguno comience con 7, ya que eso empuja la segunda base demasiado alto. Por lo tanto, 0 y 7 deben estar en una diagonal larga. Quiero que un borde 10 vaya primero para reducir el valor que estoy codificando. Aparte de eso, hay una buena cantidad de flexibilidad sin cambiar el recuento de bytes.
Estoy un poco decepcionado de que después de haber sacado el primer personaje de la cadena mágica, es necesario lanzarlo a un int antes de usarlo como base para la conversión de base. Esperemos que las futuras versiones de CJam guarden ese byte, aunque será demasiado tarde para explotarlo aquí.
fuente
JavaScript (ES6), 53
62Editar Guardar 8 bytes usando cadenas de plantilla, thx @NinjaBearMonkey. Cuidado, las nuevas líneas entre comillas son significativas y no se pueden contraer.
No puede ser inteligente en Javascript, es demasiado detallado.
Salida
for(i=0;i<6;i++)console.log(f(i),i)
Vea el fragmento para verificar las asociaciones numéricas ( eso fue divertido)
Mostrar fragmento de código
fuente
\n
, lo que debería ahorrar 8 bytes.Ruby Rev 1,
4036->(c){print(c^1,c,"\n",6|c,(c+3)%6)}
Gracias a @rcrmn por sugerir usar un lambda para guardar 4 bytes. No estaba seguro de dejarlo en el anonimato, pero parece que se discutió en meta aquí y decidí que estaba bien.
Aquí es como una función de 40 bytes, para comparar con mi respuesta Rev 0 Ruby, también a continuación (la respuesta original C está en una publicación separada).
Más inspiración de Runer112: esto se basa en una modificación del esquema de numeración utilizado en su última respuesta (¡16 bytes!). Un puerto directo del esquema de PhiNotPi daría el mismo puntaje.
Al cambiar la numeración de Rev 0 alrededor de un paso, y tomando todo XOR 1, obtenemos el siguiente cubo:
Salida
Ruby Rev 0,
56 5250Guardado 4 bytes mediante la eliminación innecesaria
()%6
dec-d
y otro 2 (inspirado por runer112) por6+c%2 --> 6|c
.La puntuación es para la función, que es solo la primera línea. Soy nuevo en Ruby y me sorprende no poder encontrar una forma más corta que 12 caracteres (11 más nueva línea) para obtener un número de entrada de usuario en n. Como resultado, hacer una función en lugar de un programa ahorra 1 byte.
Este es un puerto de mi respuesta C. En C, el
%
operador devuelve un valor negativo con un número negativo. En Ruby siempre devuelve un valor positivo, por lo que no es necesario agregar 1 ac
. Como resultado, es ventajoso cambiar la numeración de las caras por 1 de la siguiente manera:Con la nueva numeración de caras, el programa imprime los pares como se muestra arriba y las probabilidades giran 180 grados:
fuente
->(x){...code...}
que deja la definición de su función 4 caracteres más corta. Luego debe asignarlo a una variable para usarlo, y llamarlo con #callf=->(c){print(c^1,c,"\n",6|c,(c+3)%6)}
corre y es 2 caracteres más corto (4 caracteres más corto si omito elf=
). No estoy seguro de si es justo omitirlo,f=
pero la pregunta no dice que la función no puede ser anónima. Lo que me parece extraño es que esta sintaxis es totalmente diferente de la sintaxis que se muestra a los principiantes, que tiene el parámetro pasado dentro de las llaves:f=lambda{|c|print(c^1,c,"\n",6|c,(c+3)%6)}
Pyth, 30
Gracias @Jakube por 2 bytes.
Pruébalo aquí
Se aceptarán gentilmente los consejos de golf de expertos en pyth. En particular, creo que la sección de salida podría tener algunas mejoras.
Puerto de la siguiente pitón: ...
Python, 109
... que es un puerto de
Pure Bash, 130
Para fines de explicación:
Los vértices del cubo se numeran así:
Y las caras están numeradas así:
La
Swap
columna indica que el orden de los vértices debe cambiarse en la salida.El algoritmo comienza con todos los vértices {0..7}. Los vértices se eliminan según los bits establecidos en los números de vértice:
Los vértices "guardados" se agregan a una cadena. La cadena es caracteres de salida 0,1 y luego 2,3 o viceversa, dependiendo de si se establece la bandera de intercambio (número de cara mod 2).
fuente
J - 26 bytes
Función que toma el número de la cara como argumento y devuelve la cuadrícula de dígitos.
Estamos usando el siguiente cubo:
Ejemplo (pruébelo usted mismo en tryj.tk ):
El pan y la mantequilla es
0&(|:|.)
. Este es un verbo que invierte y gira el cubo de tal manera que visita cada cara cuando se aplica de forma iterativa, que es lo que hacemos usando el argumento de entrada. Los vértices del cubo son generados pori.3#2
, así que lo usamos como punto de partida y tomamos la cara frontal0...{
cuando terminamos.Imprimir los dígitos como una cadena cuesta 8 caracteres:
{.@":"0@
si se nos permitiera simplemente devolver una matriz, es un ahorro de 8 caracteres completos. [comienza a agitar los puños y al agarre indiscernible]fuente
> <> (Pescado) , 38 bytes
Cada salida se almacena como dos filas de 2 dígitos. Las filas se almacenan como códigos de acceso en la cadena
'/ =/2= 28"H'
(excepto la fila10
que se agrega después de la cadena comoa
). El primer carácter (/ = 47
) se usa para redirigir el flujo del programa en la segunda interacción.Los
2*(53-n)
elementos superiores se descartan (donde n es el código de acceso del número de entrada) y los siguientes dos códigos se imprimen con una nueva línea entre ellos.Diseño:
fuente