Escriba el programa o función que tomará el valor izquierdo y derecho de los dados como enteros (1-6) y devolverá el valor en la parte superior.
Diseño de dados:
+---+
| 1 |
+---+---+---+---+
| 2 | 3 | 5 | 4 |
+---+---+---+---+
| 6 |
+---+
,^.
<´ 5 `> <-- Top value
|`._,´|
.6 | 4, <-- Side values
`.|,´
Entonces la entrada 6 4
volverá 5
.
El orden es importante:
2 3 -> 1
3 2 -> 6
El programa no tiene que funcionar con valores de entrada no válidos.
Para desalentar el enfoque obvio (usando la tabla con todas las combinaciones), no está permitido usar ninguna codificación de texto incorporada o rutinas de descompresión / compresión o codificación base o cualquier otra cosa similar para reducir el tamaño. Tenga en cuenta que todavía se permite el uso de la tabla y también se permite rodar su propia descompresión, siempre que no se haga con alguna función de biblioteca lista.
Para fines de referencia, aquí hay una tabla de todas las combinaciones (es decir, todas las entradas y salidas posibles):
23, 35, 42, 54 -> 1
14, 31, 46, 63 -> 2
12, 26, 51, 65 -> 3
15, 21, 56, 62 -> 4
13, 36, 41, 64 -> 5
24, 32, 45, 53 -> 6
El código más corto gana y se aplican las lagunas estándar.
Respuestas:
Python, 30
Sin búsquedas, solo un poco de golpes.
Las caras opuestas vienen en pares que son complementos de tres bits entre sí, lo que significa que son XOR a 7.
Dadas dos caras de un conjunto, queremos obtener una cara del otro conjunto. Para
(1,2,3)
, podemos hacer esto con XOR (^
). Entonces,^
da la respuesta correcta hasta un complemento de tres bits, es decirx^7
. Podemos complementar condicionalmente porx^7*_
.Para decidir si tomar o no el complemento (XOR con 7), verificamos si el triplete viola la regla de la derecha. Eso significa que
a,b
va en el orden cíclico inverso detratando cada línea como una de las tres categorías. Dado que los elementos en cada línea son negativos mod 7, podemos "hash" haciéndolos
x*x%7
.Cada línea se obtiene de la forma cíclica anterior multiplicando por 4 módulo 7, por lo que podemos comprobar si esta relación se mantiene para
(b,a)
decidir si se complementan:a*a%7==b*b*4%7
.Esto es equivalente a verificar si el módulo 7
a**2 * b**(-2)
es igual4
. Comob**6
es igual al1
módulo 6, esto es equivalente aa**2 * b**4
. Como el otro valor posible es 2 (verificando casos), podemos verificar si es 4 comparando con 3.fuente
ri:Ari:B^7A7A-e<B7B-e<)=*^
min(a,7-a)
haciendoa^7*(a>3)
, pero siento que debería haber una forma aún más corta. ¿Algunas ideas?a/4*7^a
...Hay un módulo buen polinomio de expresión 7 para el tercer lado dado dos lados una y b .
o factorizado
El módulo 7 se asigna a un resto en {0,1,2,3,4,5,6}.
Explico por qué funciona en esta respuesta de Math SE , aunque creo que probablemente haya un argumento más limpio que me estoy perdiendo. El único otro polinomio de dos términos que funciona es
que originalmente encontré al transformar mi bit-bashing en operaciones aritméticas, luego hice una búsqueda de fuerza bruta en polinomios de esta forma para encontrar el más agradable.
Por favor, siéntase libre de agregar puertos de esto a su idioma favorito; Esta es una publicación de CW.
J, 9 por Synthetica
Ver mi post
Dyalog APL, 9 por ngn (error tipográfico corregido por Adám)
Escandalosamente robado de arriba J responde.
TI-Basic, 14 por Timtech
Pyth, 16 por FryAmTheEggman
Define una función
g
de dos valores.Golfscript, 18 por Peter Taylor (antiguo polinomio)
CJam, 18 años por Martin Büttner (portado de Peter's GolfScript) (antiguo polinomio)
Mathematica, 20 por Martin Büttner
Sí, eso es un plus unario, y no, no hay una forma más corta que no use un plus unario.
dc, 21 por Toby Speight
Tengo que agregar 7 para
a
asegurar que la diferencia sea siempre positiva (DC tiene un%
operador firmado ).Julia,
2423 por Martin BüttnerCoffeeScript,
2826 por rink.attendant.6JavaScript (ES6),
2826 por rink.attendant.6Esencialmente lo mismo que CoffeeScript.
Python 28, por xnor
Bash, 31
Nada especial:
o alternativamente:
Otro enfoque (más largo pero quizás interesante) .
Nim, 36 por Sillesta
Java 7,
4644 por rink.attendant.6Java 8,
2523 por Kevin CruijssenPHP,
4947 por rink.attendant.6Lote, 52 sin carne
CMD no admite el módulo verdadero de forma nativa (por lo que no puede manejar números negativos), por lo tanto
%%7+7)%%7
.MENOS (como una mezcla paramétrica ),
6260 por rink.attendant.6Vea mi publicación a continuación .
05AB1E,
108 por Emigna (-2 bytes por Kevin Cruijssen)Pruébalo en línea.
Haskell,
312725 por nombre genérico para mostrarPruébalo en línea!
Excel, 27 por Wernisch
Excel VBA, 25 por Taylor Scott
Forth (gforth) 41 por reffu
Pruébalo en línea!
C #, 23 por Kevin Cruijssen
fuente
(ab)**5 % 7 == (ab)**-1 % 7 == a^b^7
para todosa
,b
en1..6
tal quea != b
ya+b != 7
.**5
como proxy para invertir el módulo 7.7|3×××+×-
, pronunciado: 7-resto de 3 veces el producto multiplicado por la suma multiplicada por la diferencia (entre los dos números).CJam,
4328 bytesNo tengo idea si un enfoque basado en una tabla completa será más corto, pero aquí va:
Entrada como
Salida:
Esta es una mezcla de mi algoritmo anterior para determinar la cara correcta de 2 caras y el enfoque de xors de xnor.
Pruébalo en línea aquí
fuente
MENOS, 62 bytes
Utiliza el algoritmo en esta publicación :
Podría ser más corto si se usara el valor entero, pero para que se mostrara necesitaba usar la
content
propiedad CSS que requería interpolación variable .¡Sin embargo, no es frecuente que se utilice un lenguaje de preprocesador CSS para golf de código!
Para usar con algo de HTML, harías esto:
fuente
Pyth, 30 bytes
Requiere los dos dígitos como entrada, sin espacio en el medio (ej.
23
No2 3
).Explicación:
Cualquier secuencia de dos dígitos que se encuentre dentro
23542
representa dos lados que tienen1
arriba. Del mismo modo,31463
para 2, etc. Invertir esta cadena da las secuencias para a4
través6
.Este código solo realiza una búsqueda en la cadena
"23542 31463 12651 15621 36413 24532"
, divide el índice entre 6 e incrementa para determinar cuál debe ser el lado superior.Prueba en línea aquí.
Gracias a @FryAmTheEggman por los consejos para jugar al golf.
fuente
J"23542 31463 12651 "h/x+J_Jscz)6
hazme ping si algo es confuso. PreferirK
yJ
para asignar valores,h
es unario+1
,s
en una lista de cadenas esjk
. (Además, si está permitido, solo usar una cadena23
como la entrada sería lo mejor)Adopta un enfoque similar al es1024 con una cadena de búsqueda diferente:
JavaScript (ES6),
737261 bytesJavaScript (ES5),
888777 bytesCoffeeScript,
7162 bytesY solo por diversión, el código es 1 byte más corto en CoffeeScript como ES6 debido a la omisión permitida de paréntesisDebido al uso del
-~
truco, resultó ser el mismo número de caracteres que ES6.fuente
''+l+r
=>[l]+r
1+Math.floor
=>-~
. Además, busque en lugar de indexOf.search
pero es solo para ES6.String.prototype.search
ha sido parte de JavaScript desde ECMAScript 3rd Edition, por lo que puede cambiar su respuesta. developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…J (9)
Utiliza el algoritmo de esta publicación.
Gráfico de árbol de la función (podría aclarar algunas cosas):
Demostración:
fuente
PHP, 81 bytes
Igual que mi solución de JavaScript:
fuente
Lua 118
Tuve que restaurar la última versión debido a un error que no puedo encontrar, ni tengo tiempo para buscarlo.
Sin embargo, todavía estoy trabajando en esto.
fuente
4
con2 3
.JavaScript (ES6), 79 bytes
No es el más corto, pero probé un enfoque diferente al actual en las respuestas.
fuente
Lua, 89 bytes
Un puerto sencillo de la solución Python de xnor.
fuente
Bash, 85
Esto no compite en cuanto al golf con el polinomio mágico de @ xnor. Pero creo que esta es otra forma interesante de calcular la respuesta:
Específicamente sabemos lo siguiente sobre dados:
Combinando lo anterior de manera recursiva (usando {1,2,3} codificado como punto de partida), podemos generar el mapeo completo de {l, r} -> t para todos los valores posibles. Esta respuesta define una función recursiva g () que llena una matriz completa tal que d [lr] = t. La función recursiva se llama inicialmente con {1,2,3} y se repite en todo el cubo hasta que no haya más elementos de matriz que no se hayan establecido. La función se repite en sí misma de dos maneras:
Luego realiza una simple búsqueda de matriz de los valores requeridos.
fuente
Dyalog APL , 9 bytes
Sustitución de caracteres descarados de la solución J de ɐɔıʇǝɥʇuʎs :
Editar: más tarde me di cuenta de que esta solución exacta fue sugerida por ngn el 17 y 15 de enero.
TryAPL en línea!
fuente
Julia, 26 bytes
o
o
fuente
Lisp común, 45 bytes
Pruébalo en línea!
Solución de puerto de xnor.
fuente
C # (compilador interactivo de Visual C #) , 49 bytes
Pruébalo en línea!
-1 byte gracias a @GB!
La entrada es una cadena de 2 caracteres que contiene los dígitos visibles izquierdo y derecho.
A continuación se muestra la solución que se me ocurrió de forma independiente. Aprovechando la cadena de búsqueda de la respuesta JavaScript de rink.attendant.6 , pude eliminar 5 bytes (pero ahora nuestras respuestas son bastante similares;)
C # (compilador interactivo de Visual C #) , 55 bytes
Pruébalo en línea!
fuente