O cubo de um Rubik tem 6 cores: vermelho, laranja, amarelo, branco, azul e verde. Os rostos vermelho e laranja, amarelo e branco e azul e verde estão em lados opostos.
A rede do cubo de Rubik resolvido é assim:
Y
BRGO
W
E os ladrilhos ficam assim:
Y Y Y
Y Y Y
Y Y Y
B B B R R R G G G O O O
B B B R R R G G G O O O
B B B R R R G G G O O O
W W W
W W W
W W W
Desafio
Dadas rotações, rotações reversas ou rotações duplas, produzem o que um cubo resolvido transformará, como arte ASCII ou como imagem (espaços em branco não são necessários, podem ou não existir, espaços em branco finais são permitidos).
A entrada será rotação (e modificador opcional). A notação de rotação é semelhante a: U
(p), L
(eft), F
(ront), R
(à direita), B
(ack), D
(próprio); 2
(duplo) '
ou i
(inverso).
Todas as rotações normais serão 90 ° no sentido horário, as inversas serão no sentido anti-horário.
Explicação sobre a precisão do relógio : imagine o cubo enquanto olha para o rosto vermelho e o rosto amarelo está no topo. Em seguida, gire o cubo para que a face que o programa irá girar fique voltada para você. É assim que o clockwiseness funcionará. (Exceto na face traseira, você girará o cubo horizontalmente nesse caso.)
Entrada
Entrada será uma lista de movimentos.
Saída
Uma arte ASCII que representa o cubo ou uma imagem da rede do cubo.
Exemplos
Entrada : (vazio)
Saída :
Y Y Y
Y Y Y
Y Y Y
B B B R R R G G G O O O
B B B R R R G G G O O O
B B B R R R G G G O O O
W W W
W W W
W W W
Entrada : U
(para cima)
Saída :
Y Y Y
Y Y Y
Y Y Y
R R R G G G O O O B B B
B B B R R R G G G O O O
B B B R R R G G G O O O
W W W
W W W
W W W
Entrada : U'
ou Ui
(inversa para cima)
Saída :
Y Y Y
Y Y Y
Y Y Y
O O O B B B R R R G G G
B B B R R R G G G O O O
B B B R R R G G G O O O
W W W
W W W
W W W
Entrada : U2
(dobrar para cima)
Saída :
Y Y Y
Y Y Y
Y Y Y
G G G O O O B B B R R R
B B B R R R G G G O O O
B B B R R R G G G O O O
W W W
W W W
W W W
Entrada : L'
(esquerda invertida)
Saída :
R Y Y
R Y Y
R Y Y
B B B W R R G G G O O Y
B B B W R R G G G O O Y
B B B W R R G G G O O Y
O W W
O W W
O W W
Entrada : R
(direita)
Saída :
Y Y R
Y Y R
Y Y R
B B B R R W G G G Y O O
B B B R R W G G G Y O O
B B B R R W G G G Y O O
W W O
W W O
W W O
Entrada : U2 L' D
(dobra para cima, esquerda inversa, baixo)
Saída :
O Y Y
R Y Y
R Y Y
G B B W O O B B B R R Y
G B B W R R G G G O O Y
O O Y G B B W R R G G G
R O O
W W W
W W W
Regras
- Não são permitidas brechas.
- Este é o código-golfe , pelo que o código mais curto em bytes que resolve o problema vence.
S
,E
,M
,x
,y
,z
,u
/Uw
,d
/Dw
,r
/Rw
,l
/Lw
,f
/Fw
,b
/Bw
move-se bem? Ou apenas o padrão:U
,D
,R
,L
,F
,B
e sua variante anti-horário com apóstrofo ('
)? Fora de tópico: eu sempre me pergunto com as perguntas relacionadas ao Cubo de Rubik, você também é um colecionador de Twisty Puzzles?Respostas:
Ruby,
370 339305 bytesÚltima edição: alguns bytes salvos pelo rearranjo das fórmulas de plotagem e remoção de colchetes desnecessários. Uma economia enorme reescrevendo a geração do cubo - eu nunca soube que Ruby tinha um produto interno para produtos cartesianos!
Função anônima.
Aceita uma matriz de seqüências de caracteres, cada uma representando uma virada de face (uma única sequência com espaços entre cada virada de face é de 6 bytes adicionais).
Retorna uma string retangular 9x12.
Breve explicação
Isso se baseia estreitamente em um conceito da minha resposta a essa pergunta , que por sua vez foi baseado em um conceito semelhante de Jan Dvorak.
A primeira linha gera uma matriz de 27 elementos, representando os 27 cubos. Cada cubo é representado por um vetor tridimensional no qual o sinal representa sua posição atual e a magnitude de cada coordenada representa o código ASCII para a cor do adesivo.
Exemplo de movimento: para R, para cada cubo, verifique se a coordenada x é> 0 e, se sim, gire 90 graus trocando as coordenadas y e z e trocando o sinal de uma delas.
Pegue uma matriz 9x12 de espaços e plote o cubo nele. Para cada cubo e eixo, verificamos se o adesivo existe (coordene nesse eixo diferente de zero) e calculamos para onde ele deve ir. Em seguida, pegamos a coordenada e executamos
.abs.chr
para alterar o número no caractere necessário e plotá-lo.Sem jogar no programa de teste (por edição de 339 bytes)
Saída
fonte
Javascript (ES5), 1615 bytes
Ungolfed:
Este foi um desafio muito difícil.
Explicação
Veja a chamada de exemplo
s("R U' F")
.O programa pode executar apenas movimentos x, ye R.
U'
é igual aU U U
, então substitua isso.F
é igual ay y y R y
, então substitua isso.R U' F'
é, portanto, igual aR U U U y y y R y
, que o programa pode executar.cstate é definido com um cubo resolvido. Um cubo é representado por uma matriz contendo 6 matrizes contendo os 9 adesivos. A primeira matriz é para R, a segunda é para U, a terceira é para F, D, B, a última é para L. Quando um y precisa ser executado, o programa troca as quatro matrizes das faces frontal, esquerda, traseira e direita. Para um x, ele alterna para frente, para baixo, para trás e para cima. Cada rotação também gira as outras faces, que não foram trocadas. O movimento AR gira a face direita e alterna a parte direita da frente, para cima, para trás e para baixo.
Isso pode ser modificado para resolver problemas com todos os tipos de movimentos, definindo-os com x, ye R.
fonte
R U' F2
é convertido emR U' F F
primeiro eR U U U F F
depois emR x y R y y y x x x x y R y y y x x x x y R y y y x x x y y y R y y y y R y
qual é executado? Estranho .. mas muito original. +1 :) Como você teve essa ideia?U'
emU U U
demasiado, masx
es ey
s são realmente bons. Também quero roubar isso: p'
e2
, e depois substitui todos os movimentos.C,
17151709168613361328 bytes25 bytes salvos graças a @KevinCruijssen!
Nenhuma resposta até agora, então decidi colocar minha própria solução.
Experimente online!
Versão antiga não destruída:
fonte
for(b=1;b<8;b++)for(a=1;a<11;a++)r[b][a]=c[b];
tofor(b=1;b<8;)for(a=1;a<11;)r[b][a++]=c[b++];
efor(i=1;i<=9;i++)
tofor(i=0;++i<=9;)
, e alguns dos outros loops também. Além disso,else if
pode ser alterado para exatamenteif
quando você marcaif(d==66)B(r);if(d==76)L(r);...
E, a menos quei
possa ser negativo, você pode alterarif(i%3==0)
paraif(i%3<1)
duas vezes. E tenho certeza de que pode jogar golfe um pouco mais. É bom ver uma resposta para o seu próprio desafio, no entanto. :)if
s ei
embora, eu vou editado-los uma vez que eu ir para casa. Obrigado!else
o programa, os loops de golfe do programa, o quei
funciona. Obrigado mesmo assim.else if
mudançaif
falha? : S Em cada um doselse if
s que você comparad==##
, estou confuso por que não. Novamente, eu não programo C, então talvez esteja perdendo algo óbvio que C não possa fazer, mas ainda assim ... Ah, bom, por ter ajudado com o módulo em<1
vez de==0
Python 3,
610 563 533526 bytes-7 bytes graças ao meu colega rhsmits (
d,*c
forma muito agradável e remoção de parênteses redundantes)Este é um programa completo.
Superflip e todos os testes estão disponíveis em ideone ou Experimente online!
O programa:
YBRGOW
dos adesivos.r
que gira apenas os adesivos em um rosto, no sentido horário um quarto de voltaU
que gira aU
face no sentido horário um quarto de volta aplicandor
e girando os adesivos na faixa superior doLFRB
relógio no sentido horário um quarto de voltay
que realizar
nosU
eD
caras e fatiasLFRB
- Isso realiza uma rotação de todo o cubo do
y
eixo (que atravessaU
eD
)- a rotação é no sentido horário se olha de cima
z
que executa uma rotação de todo o cubo noz
eixo no sentido horário um quarto de volta olhandoR
(o eixo percorreR
eL
) - desta vez porque a maneira como as faces são orientadas em nossa rede (igual ao fornecido no OP) tem que virar oB
e asU
faces (alternam das partes horizontal e vertical da rede e vice-versa)input()
(os movimentos a serem executados) que correspondem a um caractere deBUDLRF
(na verdadeB-U
) possivelmente seguido por um caractere'i2
'i2
para o número de voltas no sentido horário (os ordinais desse mod6
fazem o trabalho, com um manequima
para render1
quando nenhum está presente)y
ez
, um quarto de voltaU
(que agora será a face instruída) e, em seguida, as chamadas para inverter a sequência da instalação executada. Pegar o ordinal do módulo de caractere de face até11
então por7
mapasB:0 U:1 D:2 L:3 F:4 R:5
, permitindo uma indexação simples em uma sequência de seqüências de nomes de funções divididas por espaços.d
para encurtar a impressãoU
eD
Aqui está o superflip :
fonte
Python
760750649 bytesdescaradamente roubou a idéia de usar apenas 3 rotações de @Paul Schmitz: D
nova versão:
Na maioria das vezes, eu fiz muitas fatias de listas numpy e usei as funções de girar e rolar incorporadas. A entrada é tratada chamando as funções diretamente com
eval()
ungolfed ..
entrada de teste:
Comentários ou sugestões são muito apreciados :)
fonte
of using only 3 rotations
errado. O programa converte qualquer sequência em uma sequência com mais movimentos. Se você inserirF F F F
, ele usa mais de 3 rotações, conforme convertey y y R y y y y R y y y y R y y y y R y
. Ele usa três tipos de rotações.C, 839 bytes
Como este não é um programa completo (função com entrada de um argumento de string e saída para o console), é necessário chamá-lo assim:
Use apenas uma chamada de cada vez, pois a função usa e modifica variáveis globais.
Ungolfed:
Como você pode ver, a idéia principal é usar uma abordagem totalmente orientada a dados: As diferentes rotações são expressas como listas de índices que precisam ser permutados. O código de permutação pode, portanto, ser muito curto e genérico.
fonte
f(h,g)int*g;{
-2,l(g,m){
-8,n(char*o){
-5,printf("%s",a)
paraputs(a)
-7, também é possível substituir constantes carvão animal com a sua representação decimal ASCII -1 cadaCubicamente , 2 bytes
Experimente online!
Explicação:
Se saída estranha for permitida, esta é uma alternativa. 1 byte:
Experimente online!
Despeja cubicamente automaticamente seu cubo de memória para
STDERR
quando o programa termina. No entanto, também imprime o bloco de notas de antemão.fonte
+1
JavaScript (ES6), 820
Uma portabilidade da resposta de buggy de @Paul Schmitz. Ainda não é completamente um jogo de golfe, mas tem o valor agregado de que funciona.
O principal problema na resposta original é que uma única função Q não é suficiente para todos os movimentos envolvidos em uma rotação. Eu tive que adicionar 2 outras funções O e N. Todas elas são chamadas apenas na função de rotação correta R.
Talvez mais legível
fonte
update()
não está definido no meu console durante a execução do trecho de