Rolando os dados
Então, eu estava lançando dados há um tempo e pensei em um desafio.
Dado o cubo com uma rede retirada da entrada e uma lista de movimentos, encontre o quadrado na parte inferior no final.
Vou usar esta imagem para os exemplos aqui.
Entrada
Você pega uma sequência com uma lista de movimentos. A sequência contém apenas as letras maiúsculas ASCII N, S, W e E. Elas correspondem a rolar o cubo um passo nessa direção.
Na figura, um N tornaria a face inferior de 6. Nesta imagem, o Norte está longe da câmera, o Sul está na direção, o Leste está à direita e o Oeste está à esquerda.
Você também pode inserir uma sequência no seguinte formato: 1P 2P 3P 4P 5P 6P, em que cada P é uma posição de N, S, W, E, T e B. As notas T e B são inferior e superior.
Os números são a face com esse número e a letra representa a posição em que a face se encontra. Caso não esteja claro, a rede será sempre ordenada pelo número, portanto, 1P 2P 3P 4P 5P 6P, nunca 2B 1T 3N 4S 5W 6E.
A posição na imagem é 1S 2B 3E 4W 5T 6N.
Resultado
Seu programa deve gerar um número representando o lado inferior.
Casos de teste
(nothing), 1S 2B 3E 4W 5T 6N -> 2
N, 1S 2B 3E 4W 5T 6N -> 6
NS, 1S 2B 3E 4W 5T 6N -> 2
NWS, 1S 2B 3E 4W 5T 6N -> 2
NWSNWS, 1S 2B 3E 4W 5T 6N -> 2
NWSS, 1S 2B 3E 4W 5T 6N -> 3
NNNNNN, 1S 2B 3E 4W 5T 6N -> 5
SNWEEWS, 1N 2T 3E 4W 5B 6S, 6
SNEEWS, 1N 2T 3W 4S 5B 6E, 4
Outras regras
Você também pode assumir que o cubo está em um plano plano infinito, provavelmente com algum tipo de atrito.
As brechas padrão não são permitidas, apesar de não encontrar nenhuma.
Para entrada inválida, seu código pode fazer qualquer coisa, exceto iniciar o apocalipse.
Como esse programa deve caber nos meus dados, deve ser o menor possível. Conto em bytes, com algumas exceções para idiomas como pastas .
(nothing) -> 2
significa que nenhuma rede é fornecida ou deve haver uma rede em algum lugar?Respostas:
CJam,
43403734 bytesAgradeço ao Dennis por me ajudar a economizar 6 bytes.
Teste aqui.
Explicação
Quanto ao funcionamento do mapeamento de caracteres de instrução para permutações, aqui está uma tabela útil:
Eu incluí a
5%
coluna porque é isso que a indexação cíclica na string faz implicitamente. Nas quatro permutações, podemos ver que cada uma delas deixa dois lados (opostos) intocados e permuta ciclicamente os outros quatro.fonte
Ĕ
é276
.6e!
fornece uma lista de todas as 720 permutações de[0 1 2 3 4 5]
. E276
passa a ser o índice[2 1 4 0 3 5]
dessa lista.Perl,
166158154144139135134132116 bytesinclui +1 para
-p
Com comentários:
Arquivo de entrada:
Correr com
Resultado:
262223564
atualização 158 O uso de
$N, $S, $E, $W
variáveis globais em vez de%t = {N=>, S=>, E=>, $W=>}
salva 8 bytes.update 154 Uma vez que a exigência é que a saída do programa um número, não a impressão da nova linha
print "$h{B}\n"
salva 4 bytes:print $h{B}
.atualização 144 Economize 10 bytes fazendo
ao invés de
atualização 139 Mova a expressão regular para o comando até o final para eliminar uma variável, economizando 6 bytes.
atualização 135 Salve 4 bytes em
@l[0..3,0]
vez de@l[1..3],$l[0]
.atualização 134 Salve 1 byte usando a atribuição
@l=split//,$$_
como valor.atualização 132 Salve 2 bytes fazendo em
/^\w+/ && $&
vez de/^(\w+)/ && $1
.atualização 129 Salve 3 bytes usando em
-p
vez de-n
e atribuindo $ _ para impressão.atualização 116 Salve 13 bytes reescrevendo
split//, /^\w+/ && $&
para/^\w+/g
.fonte
Python 2, 204 bytes
Achei que era hora de responder à minha própria pergunta.
Não é muito curto, mas funciona.
Correr como:
Editar : bytes contados incorretos. Agora mais. :(
fonte