Inspirado em um dos vídeos de Vi Hart (que é um tesouro cheio de possíveis idéias para desafios)
Uma cobra é composta de segmentos do mesmo comprimento e a conexão entre cada segmento pode ser reta ou fazer uma curva de 90 °.
Podemos codificar uma cobra (até uma rotação, que depende da direção inicial), anotando um slither , a direção das curvas (Reta / Esquerda / Direita) necessárias. Este, começando no canto superior esquerdo e apontando para o direito
-+ +--+ SR RSSR
| +-+ | S RSL S
+--+ --+ LSSL SSR
Seria representado pelo slither SRSLSSLRLRSSRSRSS
E é claro que uma cobra planar não pode se cruzar (como em SSSSLLLSS
), isso resultaria em um Game Over horrível e pixelizado.
Sua tarefa é determinar se um slither é válido ou não (resulta em pelo menos uma interseção automática)
Entrada
Uma string feita de letras SLR
com 2 < length < 10000
Output
Something Truthy se for um slither válido e algo Falsey se não for.
Casos de teste
__Valid__
SSLSLSRSRSSRSSSLLSSSRRLRSLRLLSSS
SRRLSLLRRLLSLRRSRLLRSRRLLRRSRLLSSLLRSRRLLRRSRLLRSRRLSLLRRLLSLRR (A hilbert curve)
RLLRSRRLSLLRRLLSLRRSRLLRSRRLLRRSRLLSSLLRSRRLLRRSRLLRSRRLSLLRRLLSLRRSRLLRSRRLLRRSRLLSSLLRSRRLLRR
SRRSRSRSSRSSRSSSRSSSRSSSSRSSSSRSSSSSRSSSSSRSSSSSSRSSSSSSRSSSSSS (Spiral)
SSSSSSSSSSLSSSSSSSLSSSSSSSSLSSSSSLSSSSSSLSSSLLRRLLRRLLSLSSSRRSSSSRSSSRSSSSSSRSSSSSRSSSSSSSSRSSSSSSSRSSSSSSSSS (bigger, squigglier spiral)
LRSLLRLSRSLLSRLSLRSLSSSLRRSSLSRRLRSRLRLSLRLLRLRSSLSLRLRSRSSSSSLSRRLSLSSSRRLRLRLRLRRLLSSLSSSRRLRLRLRLRLSLSSSSSSSSSSSSSRLRLLRLRLRLRLRLRLRLSLSSSLSLSLL
__Invalid__
SRRLSLLRRLLSLRRSRLLRSRRLLRRSRLLLLRSRRLLRRSRLLRSRRLSLLRRLLSLRR
SRRLSLLRRLLSLRRSRLLRSRRLLSRSSSRSSSSSSSRSRSSSSSSSRRLLRRSRLLRSRRLSLLRRLLSLRR
SRRSRSRSSRSSRSSSRSSSRSSSSSSSSSSRSSSSRSSSSSRSSSSSRSSSSSSRSSSSSSRSSSSSS
SSSSSSSSSSLSSSSSSSLSSSSSSSSLSSSSSLSSSSSSLSSSLLRRLRLRRLLSLSSSRRSSSSRSSSRSSSSSSRSSSSSRSSSSSSSSRSSSSSSSRSSSSSSSSS
LRSLLRLSRSLLSRLSLRSLSSSLRRSSLSRRLRSRLRLSLRLLRLRSSLSLRLRSRSSSSSLSRRLSLSSSRRLRLRLRLRRLLSSLSSSRRLRLRLRLRLSLSSSSSSSSSSSSSRLRLLRLRLRLRLRLRLRLSLSSSLSLSLLSLRLSLRSLRSLRSLSLSLRSRLSLRSLRLSRSLLLRLRLRRRRSLSLSSLLSLSLSLSSLLSLSLLRLRSLLRSRLSLSSLLLLSSSSSSSSSSSSSSSSSSSSRLRLLRRLRLRLLRLRLRLRLRLSSSSLSLRLLRLSLSSLSLSLSLSLRLLRLSLLLSRSSSSSSSSSSSSSSSRLRLRLLRLRLSLSRSRSSSLSRLRLRLRSLSLSLSRLLSRLSLSLSLSLSSLSLSLLSLSRLLRLRLRLRLRLRLRLRLRLRLSLSRLRLSLLRRLSLLSLSLSLSLSLLSLSLSLRLRLRLRLRLRLRLRLRLRRLRSLSLSLSLSLSLSLSSLSSSSSLSLSSSLSLSLSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSS
Você pode desenhar os slithers aqui (R e L são invertidos, mas isso não afeta a validade)
fonte
SRRR
em um papel de gráfico com um quadrado por segmento, em seguida, ele iria sobrepor-se e é, portanto, inválido, simplesmenteRRR
no entanto, ocuparia exatamente um quadrado de 2x2 sem sobreposições (assim como no jogo clássico)Respostas:
Pitão,
2220 bytesTente você mesmo ou execute o testinguite .
Observe os valores ASCII do SRL, respectivamente 83, 76, 82. Abuso do fato de que:
A partir daqui, apenas mantenho uma variável para a posição atual e a direção atual. Para cada caractere, multiplico a direção atual pelo número complexo acima e depois o adiciono à posição atual.
No final, verifico se todas as posições visitadas são únicas.
fonte
CJam, 30 bytes
Explicação a seguir em breve.
Experimente online aqui ou execute todo o conjunto .
fonte
S
, isso significa que a cobra já ocupou ambos (0,0) e (1,0)?JavaScript (ES6), 84
89Execute o snippet no Firefox para testar.
Algumas notas:
undefined
. Na primeira visita, o operador til muda para -1, que é uma verdade. Eventualmente, em uma segunda visita, o valor muda para 0 que é falso e oevery
loop termina retornando falso.fonte
TI-BASIC,
49 56 5351 bytesSemelhante ao método do orlp, isso cria uma lista de todos os pontos no plano complexo visitado pela cobra, começando na origem. Se a lista não tiver elementos duplicados, o código retornará algum valor positivo. Observe que em uma sequência de mais de 999 elementos, a calculadora não conseguirá gerar uma lista suficientemente longa e ocorrerá um erro.
EDIT: Salva dois bytes à custa da feiura, pois não há dois pontos de treliça no plano complexo que podem estar à mesma distância de e ^ i.
fonte
TI-BASIC,
6058 bytesEdit: Ignore tudo abaixo: uma solução ti-básica funcional está aqui , por thomas-kwa. Voto positivo!
⁻
é a[(-)]
chave e Ans é[2ND]->[(-)]
. Execute-o colocando as instruções da cobra entre aspas ([ALPHA]->[+]
), seguidas de dois pontos e o nome do programa. Por exemplo, se você nomear o programa "SNAKE", executaria o caso de teste no OP como"SRSLSSLRLRSSRSRSS":prgmSNAKE
.Editar: falha
SRRLSLLRRRS
. Eu tenho uma versão revisada em 61 bytes, mas ela falha no primeiro caso de teste inválido:Vou tentar consertar amanhã.
Atualização: então o problema é que meu algoritmo está com defeito. Se eu tivesse usado um For (loop em oposição a seq ((para conseguir a mesma coisa)) (ambos os algoritmos acima, na verdade) poderia ser descrito como este:
No entanto, isso falha em slithers inválidos como
SRLRLRLRLRRRSS
. Agora vou tentar criar um algoritmo melhor ... ou roubar outra resposta.Tenho 90% de certeza de que isso pode ser substituído por um único
seq(
comando, na verdade, mas, por enquanto, é o menor possível. Se você pretende criar isso em um 8xp usando o Sourcecoder, em vez de realmente digitá-lo, observe que ele≠
deve ser substituído por!=
e o⁻1+
bit deve ser substituído por~1+
.fonte
Ruby 87
89Teste online: http://ideone.com/pepeW2
Versão não destruída:
fonte
Golfscript 48
49 50Espera que a string exista na pilha e retorne um
0
ou1
.Você pode experimentá-lo on-line com testes válidos e inválidos. cobras .
Esta é basicamente a mesma ideia que na minha resposta Ruby . Apenas a matriz de direção é tratada de maneira diferente, porque o AFAIK Golfscript não possui uma função de rotação arária. Nesse caso, eu construo uma matriz de direções suficientemente grande, multiplicando-a 10000 vezes e, em seguida, aparando desde o início 0, 1 ou 3 elementos, dependendo do comando atual (S, R ou L). A atual "direção" para a qual mover é sempre o primeiro item da matriz.
Aqui está com comentários:
Editar:
Economizou 1 caractere modificando como a matriz "direções" é consumida.
Editar:
salvou 1 caracter movendo incrementos de 10 em vez de 1 para usar a
?
sintaxe (de potência).fonte