Escreva o programa ou a função que terá o valor esquerdo e direito dos dados como números inteiros (1-6) e retorne o valor por cima.
Layout de dados:
+---+
| 1 |
+---+---+---+---+
| 2 | 3 | 5 | 4 |
+---+---+---+---+
| 6 |
+---+
,^.
<´ 5 `> <-- Top value
|`._,´|
.6 | 4, <-- Side values
`.|,´
Então a entrada 6 4
retornará 5
.
A ordem é importante:
2 3 -> 1
3 2 -> 6
O programa não precisa trabalhar com valores de entrada inválidos.
Para desencorajar a abordagem óbvia (usando a tabela com todas as combinações), não é permitido o uso de qualquer codificação de texto incorporada ou rotinas de descompactação ou codificação de base ou qualquer outra coisa semelhante para reduzir o tamanho. Observe que o uso de tabela ainda é permitido e a rolagem de sua própria descompressão também é permitida, desde que isso não seja feito usando alguma função de biblioteca pronta.
Para fins de referência, aqui está uma tabela de todas as combinações (ou seja, todas as entradas e saídas possíveis):
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
O código mais curto vence e as brechas padrão se aplicam.
Respostas:
Python, 30
Nenhuma pesquisa, apenas um pouco contundente.
As faces opostas vêm em pares que são complementos de três bits, o que significa que eles são XOR a 7.
Dadas duas faces de um conjunto, queremos obter uma face do outro conjunto. Pois
(1,2,3)
, podemos fazer isso com XOR (^
). Então,^
dá a resposta certa até complemento de três bits, ou sejax^7
. Podemos complementar condicionalmente porx^7*_
.Para decidir se deve ou não tomar o complemento (XOR com 7), verificamos se o trigêmeo viola a regra da mão direita. Isso significa que
a,b
ocorre na ordem cíclica reversa detratando cada linha como uma das três categorias. Como os elementos em cada linha são negativos, mod 7, podemos "hash" fazendo isso
x*x%7
.Cada linha é obtido a partir da ciclicamente anterior multiplicando por 4 modulo 7, para que possamos verificar se essa relação tem para
(b,a)
decidir se complementam:a*a%7==b*b*4%7
.Isso é equivalente a verificar se, módulo 7,
a**2 * b**(-2)
é igual4
. Comob**6
é igual ao1
módulo 6, isso é equivalente aa**2 * b**4
. Como o outro valor possível é 2 (verificando os casos), podemos verificar se é 4 comparando com 3.fonte
ri:Ari:B^7A7A-e<B7B-e<)=*^
min(a,7-a)
fazendo issoa^7*(a>3)
, mas sinto que deve haver uma maneira ainda mais curta. Alguma ideia?a/4*7^a
...Existe uma bela expressão polinomial módulo 7 para o terceiro lado, dado os dois lados a e b .
ou fatorado
O módulo 7 é mapeado para o restante em {0,1,2,3,4,5,6}.
Eu explico por que ele funciona nesta resposta do Math SE , embora eu ache que provavelmente exista um argumento mais claro que estou perdendo. O único outro polinômio de dois termos que funciona é
que eu originalmente encontrei ao transformar minha base de bits em operações aritméticas e, em seguida, fiz uma pesquisa de força bruta sobre polinômios dessa forma para encontrar a melhor.
Por favor, sinta-se à vontade para adicionar portos no seu idioma favorito; este é um post da CW.
J, 9 da Synthetica
Veja minha postagem
Dyalog APL, 9 por ngn (erro de digitação corrigido por Adám)
Roubado descaradamente da resposta J acima.
TI-Basic, 14 da Timtech
Pyth, 16 por FryAmTheEggman
Define uma função
g
de dois valores.Golfscript, 18 de Peter Taylor (polinômio antigo)
CJam, 18 anos, por Martin Büttner (portado de Peter's GolfScript) (antigo polinômio)
Mathematica, 20 por Martin Büttner
Sim, isso é um plus unário, e não, não há uma maneira mais curta que não use um plus unário.
dc, 21 por Toby Speight
Eu tenho que adicionar 7 para
a
garantir que a diferença seja sempre positiva (dc tem um%
operador assinado ).Julia,
2423 por Martin BüttnerCoffeeScript,
2826 por rink.attendant.6JavaScript (ES6),
2826 por rink.attendant.6Essencialmente o mesmo que o CoffeeScript.
Python 28, por xnor
Bash, 31
Nada especial:
ou alternativamente:
Outra abordagem (mais longa, mas talvez interessante) .
Nim, 36 por Sillesta
Java 7,
4644 por rink.attendant.6Java 8,
2523 por Kevin CruijssenPHP,
4947 por rink.attendant.6Lote, 52 unclemeat
O CMD não suporta módulo verdadeiro de forma nativa (portanto, não pode lidar com números negativos) - portanto
%%7+7)%%7
.MENOS (como um mixin paramétrico ),
6260 por rink.attendant.6Veja meu post abaixo .
05AB1E,
108 por Emigna (-2 bytes por Kevin Cruijssen)Experimente online.
Haskell,
312725 por nome de exibição genéricoExperimente online!
Excel, 27 por Wernisch
Excel VBA, 25 por Taylor Scott
Forth (gforth) 41 por reffu
Experimente online!
C #, 23 por Kevin Cruijssen
fonte
(ab)**5 % 7 == (ab)**-1 % 7 == a^b^7
para todosa
,b
de1..6
forma quea != b
ea+b != 7
.**5
como proxy para inverter o módulo 7. #7|3×××+×-
, pronunciado: 7 restantes de 3 vezes o produto vezes a soma vezes a diferença (entre os dois números).CJam,
4328 bytesNão faço ideia se uma abordagem baseada em tabela completa será mais curta, mas aqui vai:
Entrada como
Resultado:
Esta é uma mistura do meu algoritmo anterior para determinar a face correta de 2 faces e a abordagem de xors do xnor.
Experimente online aqui
fonte
MENOS, 62 bytes
Usa o algoritmo neste post :
Poderia ser mais curto se o valor inteiro fosse usado, mas para exibi-lo eu precisava usar a
content
propriedade CSS que exigia interpolação de variável .No entanto, não é sempre que uma linguagem de pré-processador CSS é usada para o código de golfe!
Para usar um pouco de HTML, faça o seguinte:
fonte
Pitão, 30 bytes
Requer os dois dígitos como entrada, sem espaço no meio (ex.
23
Não2 3
).Explicação:
Qualquer sequência de dois dígitos que esteja dentro
23542
representa dois lados que estão1
no topo. Da mesma forma,31463
para 2, etc. A reversão dessa string fornece as sequências para4
through6
.Esse código apenas faz uma pesquisa na string
"23542 31463 12651 15621 36413 24532"
, divide o índice por 6 e incrementa para determinar qual deve ser o lado superior.Teste online aqui.
Obrigado a @FryAmTheEggman por dicas de golfe.
fonte
J"23542 31463 12651 "h/x+J_Jscz)6
me se algum deles é confuso. PrefereK
eJ
para atribuir valores,h
é unário+1
,s
em uma lista de cadeias de caracteres éjk
. (Além disso, se permitido, apenas usando uma string como23
que a entrada seria melhor)Adota uma abordagem semelhante à es1024 com uma sequência de pesquisa diferente:
JavaScript (ES6),
737261 bytesJavaScript (ES5),
888777 bytesCoffeeScript,
7162 bytesE apenas por diversão, o código é 1 byte menor no CoffeeScript como ES6 devido à omissão permitida de parêntesesDevido ao uso do
-~
truque, esse acabou sendo o mesmo número de caracteres que o ES6.fonte
''+l+r
=>[l]+r
1+Math.floor
=>-~
. Além disso, procure em vez de indexOf.search
mas é apenas para o ES6.String.prototype.search
faz parte do JavaScript desde o ECMAScript 3rd Edition, para que você possa alterar sua resposta. developer.mozilla.org/pt-BR/docs/Web/JavaScript/Reference/…J (9)
Usa o algoritmo desta postagem.
Gráfico em árvore da função (pode esclarecer algumas coisas):
Demonstração:
fonte
PHP, 81 bytes
Igual à minha solução JavaScript:
fonte
Lua 118
Tive que restaurar a última versão por causa de um bug que não consigo encontrar, nem ter tempo para procurá-lo.
Ainda estou trabalhando nisso.
fonte
4
com2 3
.JavaScript (ES6), 79 bytes
Não é o mais curto, mas tentei uma abordagem diferente da que está atualmente nas respostas.
fonte
Lua, 89 bytes
Uma porta direta da solução Python da xnor.
fonte
Bash, 85
Isso não compete em termos de golfe com o polinômio mágico do @ xnor. Mas acho que essa é outra maneira interessante de calcular a resposta:
Especificamente, sabemos o seguinte sobre dados:
Combinando o exposto acima recursivamente (usando {1,2,3} codificado como ponto de partida), podemos gerar todo o mapeamento de {l, r} -> t para todos os valores possíveis. Esta resposta define uma função recursiva g () que preenche uma matriz completa, de modo que d [lr] = t. A função recursiva é chamada inicialmente com {1,2,3} e se repete em todo o cubo até que não haja mais elementos da matriz que não foram configurados. A função se repete de duas maneiras:
Em seguida, ele faz uma pesquisa simples na matriz dos valores necessários.
fonte
Dyalog APL , 9 bytes
Substituição flagrante de caracteres da solução J de ɐɔıʇǝɥʇuʎs :
Edit: Mais tarde notei que esta solução exata foi sugerida por ngn em 17 de janeiro de 15.
TryAPL online!
fonte
Julia, 26 bytes
ou
ou
fonte
Lisp comum, 45 bytes
Experimente online!
Porta da solução xnor.
fonte
C # (compilador interativo do Visual C #) , 49 bytes
Experimente online!
-1 byte graças a @GB!
A entrada é uma sequência de 2 caracteres que contém os dígitos esquerdo e direito visíveis.
Abaixo está a solução que eu criei de forma independente. Aproveitando a string de pesquisa da resposta JavaScript de rink.attendant.6, consegui reduzir 5 bytes (mas agora nossas respostas são bem parecidas;)
C # (compilador interativo do Visual C #) , 55 bytes
Experimente online!
fonte