CJam, 23 16 bytes
Provavelmente existe uma solução matemática elegante para esse problema. Mas eu não tenho idéia de como encontrar um, então é um código super compactado!
Eu encontrei um! Bem, não é uma solução matemática classicamente elegante, pois usa operações bit a bit, mas é totalmente fórmula.
li_o1^_p_6|o3+6%
Experimente online.
Layout do 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
Explicação
Minha resposta antiga já expôs o cubo de forma que cada face possa ser descrita com seu primeiro número de vértice (canto superior esquerdo) igual ao número da face. Mas eu queria poder calcular mais números de vértices usando o número da face. Em algum momento, tive a idéia de colocar meu pé na porta, para calcular o segundo número de vértice (canto superior esquerdo) como o número de face XOR 1. E depois de um tempo de tentativa e erro, consegui surgir com o layout mostrado acima e as fórmulas abaixo que permitem calcular de forma sucinta todos os números de vértices de um rosto n
:
- Superior esquerdo:
n
- Canto superior direito:
n^1
- Inferior esquerdo:
(n^1)|6
- Canto inferior direito:
((n^1)+3)%6
Para referência, reproduzirei a saída de cada face no layout desejado aqui:
Face: 0 1 2 3 4 5
Vertices: 01 10 23 32 45 54
74 63 70 65 72 61
Portanto, todo o programa se resume a ler o número da face de entrada e produzir esses valores em ordem, embora com uma lógica de impressão ligeiramente diferente para vértices diferentes. Observe que, como todo vértice após o primeiro começa com uma base de n^1
, eu só preciso calcular isso uma vez, o que compacta a lógica ainda mais.
Pelo bem da posteridade, e porque acho que ainda era uma abordagem muito boa, aqui está minha antiga resposta.
CJam, 23 bytes
Provavelmente existe uma solução matemática elegante para esse problema. Mas eu não tenho idéia de como encontrar um, então é um código super compactado!
"pÜ×ñè¨"487b8b3/ri_o=~p
Experimente online.
Layout do 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
Explicação
A abordagem básica empregada é codificar os vértices para cada face no menor espaço possível. De maneira semelhante à solução de conversão básica do Optimizer, isso trata a lista de vértices como um número octal compactado como dados de caracteres ASCII. Mas é aí que as semelhanças terminam para abrir caminho para novas otimizações!
Aqui estão as três principais otimizações que fiz para a solução "ingênua":
- Disponha o cubo de forma que cada face possa ser descrita com seu número de face como o primeiro número de vértice. Observando meu layout de cubo, como apresentado acima, é possível ver que o número do vértice no canto superior esquerdo de cada face é igual ao número da face. Isso me permite codificar seis menos vértices ao custo de imprimir a entrada novamente, o que acaba salvando um byte.
- Empacote os dados do vértice em uma cadeia de caracteres para a qual cada "caractere" tenha um máximo maior que 256. Como esse máximo aumenta além de 256, o comprimento da cadeia diminui lentamente, mas torna-se cada vez mais provável que qualquer "caractere" exceda 256 e é portanto, não faz mais parte do conjunto de caracteres ASCII de 1 byte. Então, escrevi um programa que tenta codificar os dados de vértices em todas as bases, de 256 a 1000, com os quais encontrei cerca de 10 bases que salvam um byte de dados de caracteres em comparação com a base 256. Escolhi 487, pois também possui a propriedade nice a sequência resultante consiste inteiramente em ASCII imprimível.
- Misturado com a primeira otimização, produza a saída assimetricamente. A abordagem usual no CJam seria formatar os dados do vértice como uma lista de 2 elementos, inserir uma nova linha no meio e deixar a saída ser impressa implicitamente. Mas, em vez disso, imprimo o primeiro vértice (igual ao número da face de entrada) com um operador que não adiciona uma nova linha, recupero a lista de 3 elementos dos outros vértices, agarro o próximo vértice e imprimo-o com um operador que adiciona uma nova linha e deixe que os outros dois vértices sejam impressos implicitamente. Isso economiza um byte.
6+n%2 --> 6|n
(já incorporei isso na minha resposta Ruby.) Observe que, ao realizar a transformaçãon --> n^1
nas faces, você pode simplificar suas fórmulas, embora eu esteja supondo que, ao descartarn
e continuar,n^1
ela ganhou ajude sua pontuação.n
en^1
ao redor do cubo me permitiria calcular outro vértice com apenas|6
. E não vi essan --> n^1
transformação, o que definitivamente faz sentido. Mas você corretamente supôs que isso não afetaria minha pontuação, então provavelmente vou deixar como está.6+n%2 --> 6|n
) Espero que você não se importe. Eu usei an --> n^1
transformação nas faces, portanto, minha revisão mais recente fornece as mesmas saídas que a sua, mas com entradas diferentes. BTW, eu não acho que operações de bits são deselegantes, tudo depende de como você as usa!~.1^..n@6|@3+6%
C, 69
Ungolfed in program program
Explicação
Minha numeração de cubo, quando desdobrada, fica assim:
O canto superior esquerdo tem o mesmo número que o rosto.
O canto inferior direito tem o número
(n+2)%6
Para ímpar,
n
o canto superior direito é(n+1)%6
e o canto inferior esquerdo é6
Até mesmo
n
o canto superior direito é7
e o canto inferior esquerdo é(n+1)%6
O programa exibe os números ímpares, como mostrado, e os números pares, girados 180 graus. Isso significa que o canto superior direito é sempre
(n+1)%6
e o canto inferior esquerdo é sempre(n+1)%2+6
. Invertern
en+2
é mais fácil (isso é feito configurandoc=n+1
e usandod
para adicionar ou subtrair1
ou-1
conforme necessário.)Resultado
fonte
c%6
ac%=6
e girando o rosto para que ele vem em primeiro lugar, deve ser possível eliminar alguns cálculos módulo.) Outra coisa a experimentar é mudando a rotulagem do rosto por um lugar, então eu fico emn-1,n,n+1
vez den,n+1,n+2
.n
global, para poder salvar alguns bytes declarando-o mais alto, altere a assinatura paraf()
? Ou estamos apenas olhando para af
função aqui?"You may write a function instead of a program"
então estou contando apenas a função. De qualquer forma, essa foi apenas uma prova de conceito na linguagem com a qual estou mais familiarizado. Estou mais interessado em encurtar minha resposta Ruby, que desde o início já era muito mais curta que isso.Element, 18
Diferentemente de muitas linguagens de golfe mais avançadas, a Element não possui um operador de compactação, portanto a brevidade da solução está intimamente ligada ao esquema de numeração exato usado. Após algumas experiências, criei um novo esquema de numeração que permite que os vértices sejam computados usando apenas operações aritméticas simples.
O canto superior esquerdo é 6 se for par e 7 se for ímpar. O canto superior direito é o próprio número da face. O canto inferior esquerdo é o número da face, mais 2, mod 6. O canto inferior direito é 5 menos o número da face.
Aqui está uma explicação do código.
Aqui estão as saídas para cada uma das faces:
fonte
Oitava,
1081006850 bytesÉ claro que existe uma maneira de fazê-lo de maneira muito mais elegante do que minhas abordagens anteriores, simples codificação. Estou surpreso como o Octave é muito mais adequado para codegolf do que o Matlab =)
Layout:
(Desculpe, esqueci de adicionar isso.)
Layout do cubo
Versões antigas:
Versões ainda mais antigas:
Isso realmente criará uma matriz 2x2x2 e depois escolherá uma 'fatia'. Fazemos uma permutação de matriz 3d e sempre escolhemos a fatia superior ou inferior. (Este não funciona no matlab por causa da indexação de uma expressão, e não de uma matriz). Tenho certeza de que haveria maneiras mais diretas de fazê-lo, que seriam mais curtas.
fonte
CJam,
3128 (ou 26) bytesque também pode ser compactado usando a conversão base em uma versão de 26 bytes .
Assume que o cubo seja como:
com rostos como
Experimente online aqui
fonte
CJam (25 bytes)
Ele contém um caractere não imprimível e uma guia (que será confinada pelo software StackExchange), portanto no formato xxd:
Demonstração online
Cubo:
É pura codificação, com os vértices do cubo selecionados para maximizar a compressibilidade da base. Decodifico para números de 2 dígitos, para que nenhum deles comece com 0. Também não quero que comece com 7, pois isso eleva a segunda base muito alto. Portanto, 0 e 7 devem estar em uma diagonal longa. Quero que uma borda 10 seja a primeira a reduzir o valor que estou codificando. Fora isso, há uma boa quantidade de flexibilidade sem alterar a contagem de bytes.
Estou um pouco decepcionado por ter retirado o primeiro caractere da sequência mágica, é necessário convertê-lo em um int antes de usá-lo como base para a conversão de base. Esperamos que versões futuras do CJam salvem esse byte, embora seja tarde demais para explorá-lo aqui.
fonte
JavaScript (ES6), 53
62Editar Salve 8 bytes usando seqüências de caracteres de modelo, thx @NinjaBearMonkey. Cuidado, as novas linhas entre aspas são significativas e não podem ser recolhidas.
Não pode ser inteligente em Javascript, é muito detalhado.
Resultado
for(i=0;i<6;i++)console.log(f(i),i)
Veja o snippet para veicular as associações numéricas ( isso foi divertido)
Mostrar snippet de código
fonte
\n
, o que deve salvar 8 bytes.Rubi Rev 1,
4036->(c){print(c^1,c,"\n",6|c,(c+3)%6)}
Obrigado a @rcrmn por sugerir o uso de um lambda para economizar 4 bytes. Eu não tinha certeza de deixá-lo anônimo, mas parece ter sido discutido na meta aqui e decidido que isso estava OK.
Aqui está como uma função de 40 bytes, para comparação com a minha resposta Rev 0 Ruby, também abaixo (a resposta C original está em um post separado.)
Mais inspiração do Runer112: Isso depende de uma modificação do esquema de numeração usado em sua resposta mais recente (16 bytes!). Uma porta direta do esquema do PhiNotPi daria a mesma pontuação.
Alterando a numeração do Rev 0 em uma etapa e executando tudo o XOR 1, obtemos o seguinte cubo:
Resultado
Ruby Rev 0,
56 5250Salvo 4 bytes por remoção unnecesary
()%6
doc-d
e outro 2 (inspirado runer112) por6+c%2 --> 6|c
.A pontuação é para a função, que é apenas a primeira linha. Sou novo em Ruby e estou surpreso por não encontrar uma maneira menor que 12 caracteres (11 mais nova linha) para inserir um número de entrada do usuário em n. Como resultado, executar uma função em vez de um programa economiza 1 byte.
Esta é uma porta da minha resposta C. Em C, o
%
operador retorna um valor negativo com um número negativo. No Ruby, ele sempre retorna um valor positivo; portanto, não há necessidade de adicionar 1 ac
. Como resultado, é vantajoso alterar a numeração das faces por 1, conforme abaixo:Com a nova numeração de faces, o programa imprime os pares, como mostrado acima, e as chances rodam 180 graus:
fonte
->(x){...code...}
que deixa sua definição de função 4 caracteres mais curta. Você então tem que atribuí-la a uma variável para usá-lo e chamá-lo com #CALLf=->(c){print(c^1,c,"\n",6|c,(c+3)%6)}
é executado e tem 2 caracteres a menos (4 caracteres a menos se eu omitir of=
). Não tenho certeza se é justo omitir,f=
mas a pergunta não diz que a função não pode ser anônima. O que eu acho estranho é que essa sintaxe é totalmente diferente da sintaxe mostrada para iniciantes, que possui o parâmetro passado dentro do aparelho:f=lambda{|c|print(c^1,c,"\n",6|c,(c+3)%6)}
Pyth, 30
Obrigado @Jakube por 2 bytes.
Experimente aqui.
Os conselhos de especialistas em golfe serão gentilmente aceitos. Em particular, acho que a seção de saída pode ter algumas melhorias.
Porta do seguinte python: ...
Python, 109
... que é um porto de
Pure Bash, 130
Para fins de explicação:
Os vértices do cubo são numerados assim:
E os rostos são numerados assim:
A
Swap
coluna indica que a ordem dos vértices deve ser alternada na saída.O algoritmo começa com todos os vértices {0..7}. Os vértices são eliminados de acordo com os bits definidos nos números dos vértices:
Os vértices "mantidos" são anexados a uma sequência. A string é caracteres de saída 0,1 e 2,3 ou vice-versa, dependendo se o sinalizador de troca (número da face mod 2) está definido.
fonte
J - 26 bytes
Função tomando o número da face como argumento e retornando a grade de dígitos.
Estamos usando o seguinte cubo:
Exemplo (tente você mesmo em tryj.tk ):
O pão com manteiga é
0&(|:|.)
. Este é um verbo que inverte e gira o cubo de forma a visitar todas as faces quando aplicadas iterativamente, que é o que fazemos usando o argumento de entrada. Os vértices do cubo são gerados pori.3#2
, portanto, usamos isso como ponto de partida e assumimos a face frontal0...{
quando terminamos.Imprimir os dígitos como uma string custa 8 caracteres:
{.@":"0@
se pudéssemos simplesmente devolver uma matriz, isso economizaria 8 caracteres inteiros. [começa a tremer os punhos e o aperto indiscernível]fonte
> <> (Peixe) , 38 bytes
Cada saída é armazenada como duas linhas de 2 dígitos. As linhas são armazenadas como códigos na string
'/ =/2= 28"H'
(exceto a linha10
que é anexada após a string comoa
). O primeiro caractere (/ = 47
) é usado para redirecionar o fluxo do programa na segunda interação.O topo
2*(53-n)
elementos são descartados (onde n é o código do número de entrada) e os próximos dois códigos são impressos com uma nova linha no meio.Layout:
fonte