Sua tarefa
.. é fazer o que Brian Fantana aparentemente não poderia fazer e resolver o cubo de Rubik 2x2x2.
O layout
- - A B - - - -
- - C D - - - -
E F G H I J K L
M N O P Q R S T
- - U V - - - -
- - W X - - - -
E será fornecido a você via stdin ou pela linha de comando (sua escolha - especifique na sua resposta) no formato:
ABCDEFGHIJKLMNOPQRSTUVWX
Observe que o AD compõe a face em U (para cima), o EFMN compõe a face em L (esquerda), o GHOP compõe a face em F (frente), o IJQR compõe a face em R (direita), o KLST compõe a A face B (traseira) e o UX compõem a face D (baixa).
Haverá seis caracteres únicos representando cada cor, mas eles podem variar, portanto, prepare-se para que qualquer combinação de 6 caracteres ASCII seja usada para cada cor.
Especificações
- Seu código deve gerar uma solução usando apenas as faces Direita (R), Superior (U) e Dianteira (F) e deve usar a notação padrão: R, R ', R2, U, U', U2, F, F ', F2. Você pode encontrar mais informações aqui . A restrição ao subconjunto RUF é padrão para o cubo 2x2 (Dica: trate o canto inferior traseiro esquerdo como uma base fixa para trabalhar).
- Seu código deve ser capaz de resolver todas as permutações possíveis do cubo de bolso.
- Cada solução deve levar menos de 30 segundos para ser concluída.
- Cada solução deve ter menos de 30 movimentos.
- Um bônus de -20% será concedido para soluções sempre com respostas inferiores a 20 movimentos (anuncie-o na sua resposta para que eu possa fazer uma verificação completa)
- Um bônus de -50% será concedido para o código que sempre fornece uma solução ideal. - Novamente, anuncie em sua resposta
- As soluções não devem conter dois movimentos consecutivos na mesma face, porque eles podem ser facilmente combinados em um movimento.
- Opcionalmente, as soluções podem conter um único espaço - e apenas um único espaço - entre cada movimento.
- A seqüência completa da solução, se necessário, pode estar entre parênteses, aspas, chaves, colchetes ou circunflexos, mas nenhuma outra saída estranha é permitida.
- Forneça uma versão brevemente comentada do seu código ou uma explicação completa do seu código.
- Sem uso de arquivos externos. Isso inclui internet, tabelas de dados e bibliotecas / pacotes criados para esse tipo de problema.
- O código mais curto pela contagem de bytes vence.
- O vencedor foi escolhido quarta-feira (30 de julho de 2014).
code-golf
puzzle-solver
permutations
rubiks-cube
Kyle McCormick
fonte
fonte
Respostas:
Python 2.7: 544 bytes -50% = 272 bytes **
O Stackexchange substitui as guias por vários espaços em branco. Tão técnica que esta versão possui 549 bytes. Apenas substitua os dois primeiros espaços nas linhas 6-10 por um tabulador.
Idéia por trás do meu programa: minha primeira idéia foi uma primeira busca de respiração. Mas isso levou muito tempo. Cerca de 2 minutos para uma luta difícil (11 movimentos ideais). Então, decidi abordar o problema de ambos os lados. Eu uso dois conjuntos. Eu gero seqüencialmente todos os estados com distância 1,2,3, ... para a corrida e os salvo no conjunto1, e ao mesmo tempo todos os estados com distância 1,2,3, ... para o estado resolvido e os salvamos no conjunto2. A primeira vez que um estado está nos dois conjuntos, encontramos a solução.
Para isso, preciso das cores do cubo resolvido, que não são conhecidas. Os caracteres 13, 20 e 23 definem a cor esquerda, traseira e inferior. Mas essas três cores são suficientes para representar o cubo. Simplesmente substituo as outras 3 cores por espaços em branco e posso representar meu estado resolvido como '____ll____bbll____dddd'.
Ah, e para encurtar as permutações, usei uma ideia de /codegolf//a/34651/29577
Versão não destruída:
Estou muito feliz com o resultado, porque sou bastante novo no Python. Este é um dos meus primeiros programas python.
editar: meio ano depois: 427 - 50% = 213.5
Tem um pouco mais de experiência em Python e no golfe. Revisei meu código original e pude salvar mais de 100 caracteres.
Basicamente, uso exatamente a mesma abordagem. A maior mudança é que eu não defino mais uma função. Ao invés de
eu posso fazer
Também mudei o movimento lamda um pouco. Primeiro diminua e depois integre o código diretamente, pois a chamada de função aparece apenas uma vez.
Eu mantenho para cada estado uma lista de números entre 0 e 11, para representar os movimentos, em vez de uma sequência contendo os movimentos. Os números são convertidos no final.
Também combinei os dois for-loops
'for k in r(3):for j in r(3):
em umfor y in r(12)
. Portanto, eu também tenho que fazer os movimentosU4, R4, F4
. É claro que esse movimento não aparece na solução mais curta, então" 2'"[x%4]
funciona. (Sex % 4 == 3
houver uma exceção de índice fora do intervalo)Também é um pouco mais rápido, pois procuro a entrada no segundo conjunto anterior. Cerca de 0,5 segundo para uma solução de 11 movimentos.
fonte
C, 366 - bônus ótimo de 50% = 183
Usando a recursão, o programa pesquisa em uma árvore de até 11 movimentos (o comprimento máximo de uma solução ideal de acordo com http://en.wikipedia.org/wiki/Pocket_Cube e a página mencionada abaixo) e quando encontra uma solução o imprime (até 22 caracteres, rastreado pelo argumento da função
m
.) A ordem usada é um tipo de ordem de dicionário, em que todas as rotas que começam com U, U2, U 'são pesquisadas antes de qualquer rota que comece com R ou F. Portanto, ele não necessariamente encontra a solução ideal primeiro.Quando uma solução é impressa, ela
r
é igual àm
qual garante que somente soluções iguais ou menores serão impressas posteriormente. A colocaçãor=m-2
custa 2 caracteres extras, mas garante que apenas uma solução de cada comprimento encontrado (até o ideal) seja impressa. Se você deseja que APENAS mostre a solução ideal, a melhor solução encontrada até agora deve ser armazenada em uma variável e a solução ideal impressa no final do programa (isso custaria cerca de 15 caracteres extras).a entrada é lida na matriz
c[]
do índice 64 em diante. Isso é necessário para usar caracteres do alfabeto na tabela de movimentos. Os símbolos@
throughW
são usados em vez de A a X de acordo com a pergunta, porque é necessário iniciar um número par para fazer o teste das soluções funcionar.c['Z']
também é usado para armazenamento temporário, porque, para executar a rotação de quatro vezes, são necessárias 5 atribuições. Como a primeira parte dec[]
não é utilizada, ela está disponível para armazenar a solução (que é finalizada com um byte zero, como todas as seqüências C.)for(i..)
passa por uma sequência de 4 quartos da face especificada porn
.O primeiro
for(j..)
realiza a troca real de acordo com a tabelat[]
.Para testar se o cubo está resolvido, é necessário apenas verificar as quatro faces laterais. As peças URF e DFR podem ser diferenciadas mesmo com os adesivos U e D removidos, porque uma peça lê XRF no sentido horário e a outra XFR. Se as duas peças forem trocadas para que U apareça na face inferior e vice-versa, a cor F aparecerá na face direita e vice-versa.
O segundo
for(j..)
conta o número de incompatibilidades nas quatro faces laterais. Por exemplo, na face frontal, ele compara G&O, H&P e G&H (duas vezes). See
== 0, o cubo está resolvido. See
<9 oue
<13, pode ser possível resolver o cubo no próximo movimento ou 2 movimentos, respectivamente. Caso contrário, definitivamente não é possível resolver o cubo nesse número de movimentos. Para economizar tempo, essa heurística é usada para podar a árvore de pesquisa e evitar o desperdício de tempo em muitos dos ramos de profundidade 10 ou 11 que não terão êxito. Expressa como uma fórmula, isso se tornae<45-m*2
.Código Ungolfed
atuação
O programa foi testado com os padrões de 1 a 13 em http://www.jaapsch.net/puzzles/cube2.htm
Os resultados a seguir fornecem o tempo na minha máquina para encontrar TODAS as soluções ideais (para os curiosos). Também para as posições mais complexas, o tempo é dado para a modificação de 2 bytes mencionada acima, que encontra apenas uma solução ideal. Para esse tempo, são fornecidos ambos, para encontrar a primeira solução e para o programa terminar. As soluções fornecidas (que geralmente são diferentes das soluções obtidas pela reversão dos geradores na página vinculada) foram verificadas com um simulador de cubo on-line.
fonte