Não deve ser confundido com Password Bishop Goodness !
Dada uma sequência, responda (verdade / falsidade ou dois valores consistentes) se ela constitui uma senha forte contra os bispos .
Uma senha é forte contra os bispos, se for uma sequência que consiste em letras (in a-h
) e dígitos (in 1-8
) alternados, de modo que cada par de caracteres possa ser interpretado como um quadrado em um tabuleiro de xadrez e se você colocar um peão branco em cada quadrado chamado na senha, não há como um bispo branco viajar, em qualquer número de movimentos consecutivos, de qualquer quadrado na primeira ( 1
) linha a qualquer quadrado na última ( 8
) linha.
Exemplos
Senhas fortes contra bispos
a1b1c1d1e1f1g1h1
a8b8c8d8e8f8g8h8
a1b2c3d4d5f5f4g3g4h2b5
h4g4f4e4c4b4a4c3e3
a1b1c1d1e1f1g1a8b8c8d8e8f8g8
b4b5d4d5f4f5g3h5
Por exemplo,
a1b1c1d1e1f1g1a8b8c8d8e8f8g8
corresponde à posição eb4b5d4d5f4f5g3h5
corresponde à posição
Senhas fracas contra bispos
a4c4e4g4g5d6f6e3d2b2
(bem formado, mas não forte - obrigado Jo King por este exemplo!)b1c1d1e1f1g1h1a8b8c8d8e8f8g8
(bem formado, mas não forte)h4g4f4e4c4b4a4c3
(bem formado, mas não forte)d4
(bem formado, mas não forte)b4b5d4d5f4f5g2h5
(bem formado, mas não forte)correct horse battery staple
(mal formado)1a1b1c1d1e1f1g8a8b8c8d8e8f8g
(mal formado)a
(mal formado)aa
(mal formado)
code-golf
string
decision-problem
path-finding
chess
Quuxplusone
fonte
fonte
1
através8
do primeiro caso de teste? Ele não pode viajar para cada coluna, pois aa
coluna está completamente cheia de peões, mas pode viajar para cada linha sem problemas, não pode? Tenho a sensação de que estou perdendo alguma coisa ..: SRespostas:
Ruby,
115182163 bytesExperimente online!
Retorna
1
para forte enil
para fraco. (Os +67 bytes foram usados para levar em consideração "retroceder".)Alguns truques que foram usados:
Em vez do intervalo numérico
0..99
, usamos o intervalo de strings'00'..'99'
para que o número seja preenchido automaticamente à esquerda com 2 dígitos e estriado. Isso faz com que a verificação fora dos limites seja muito curta - corresponda à regex/[09]/
.Dentro da função auxiliar, ao construir a lista de novas coordenadas
[x-11, x-9, x+9, x+11]
, que, simultaneamente, atribuirz[x]
a9
no processo, que passa a ser um valor truthy (marcando o quadrado visitado).Na última linha, queremos verificar se a matriz
z[81,9]
não contém9
. Fazemos isso removendo todas as instâncias de9
(z[81,9]-[9]
) e solicitando o 9º elemento da matriz resultante ([8]
). Como sabemos que o array originalmente tinha 9 elementos, se algum foi removido, obteremosnil
, enquanto que se todos permanecerem, obteremos o último elemento do array (o que sempre acontece1
).fonte
Python 2 ,
330318313309370 bytesExperimente online!
Experimente a versão prática online! (o original pode levar 4 ^ 32 operações para verificar completamente, sugiro usar este - o mesmo número de bytes)
Não é uma solução super curta - eu não conseguia descobrir como tornar uma versão da função lambda do g menor que o próprio g.
-4 bytes graças ao Quuxplusone
+61 bytes representando retrocesso (obrigado por apontar Jo King e pelas dicas de golfe)
fonte
q=r=1
seria mais curto do queq=1 r=1
, certo? Eif r:
mais curto queif r>0:
.Python 2 ,
490476474Experimente online!
Isso funciona por "preenchimento de inundação". Primeiro, criamos uma lista
a
de quais quadrados são adjacentes a outros quadrados, bishopwise. Em seguida, criamos um conjuntox
de exclusões (com base na senha). Em seguida, inicializamos um conjuntor
de quadrados alcançáveis, que começa como a primeira linha (menos as exclusões) e "repetidamente" inundamos a partir daí, 99 vezes, o que deve ser mais do que suficiente. Por fim, testamos para ver se algum dos quadrados da última linha terminou em nosso conjunto acessível. Se assim for, temos uma senha fraca! Caso contrário, temos uma senha forte.Desvantagem, talvez desqualificante (não conheço a regra usual aqui): se a senha estiver mal formada (como "grampo correto para a bateria do cavalo"), lançamos uma exceção em vez de retornar
False
. Mas sempre retornamosTrue
se a senha for forte!Menos 16 bytes graças a Jo King. Nós alinhamos
a
no local em que é usado e dobramos constantemente algumas contas.fonte
for
segundos que eu não conseguia ver como remover. Descobri que substituirrange(99)
porrepr(f)
obras na minha máquina local, mas não no intérprete do tio.run ... mas achei que[1]*99
era mais curto de qualquer maneira! Então isso salvou mais 4 bytes.for
segundos que eu não conseguia ver como remover - Oh! Aparentemente, o Python trata33for
como dois tokens (considerando quefor33
seria um token). Hoje eu aprendi. Menos 2 bytes, então.Limpo , 285 bytes
Experimente online!
$[]
é$ :: [[Int]] [Char] -> Bool
composto com o primeiro argumento, dando\ [Char] -> Bool
.A função funciona consumindo a string dois caracteres por vez, retornando false imediatamente se a string estiver em um formato inválido assim que vir a parte inválida. Depois que a corda é processada, ela coloca um bispo em cada quadrado vazio de um lado do tabuleiro e as move de todas as maneiras possíveis 64 vezes e verifica se alguma das posições finais está na linha de destino.
fonte
True
paraa1b1c1d1e1f1g1
? Não que eu entenda alguma coisa sobre como isso funciona. :)Wolfram Language (Mathematica) ,
339316358353345 bytes-23 bytes graças a @Doorknob.
+42 bytes, representando retorno.
Experimente online!
Eu reescrevi a maior parte disso para dar conta do retorno, acho que pode haver uma maneira mais fácil de definir o gráfico
g
, o Mathematica possuiGraphData[{"bishop",{8,8}}]
o gráfico de todos os movimentos que um bispo pode fazer em um tabuleiro de xadrez ( Bishop Graph ), mas esse gráfico inclui conexões adicionais que o vizinho diagonal mais próximo. Se alguém souber uma maneira mais curta de fazer isso, me avise. O crédito pela construção do gráfico vai para esta resposta do MathematicaSE .Retorna
True
para senhas fortes,False
para senhas fracas / mal formadas. Observe que, para a maioria das senhas mal formadas, ela produz um monte de mensagens de erro e depois retornaFalse
. Se isso não estiver de acordo com as regras, elas poderão ser suprimidas alterandof[n_]:=...
para of[n_]:=Quiet@...
custo de 6 bytes.Ungolfed:
Demolir:
Pega um argumento de string e o divide em uma lista de strings cada uma de comprimento
m
.Retorna
False
se alguma mensagem de erro for produzida, e é assim que capturamos as seqüências mal formadas (ou seja, presumimos que elas sejam bem formadas, inevitavelmente produzindo um erro abaixo da linha).Pega a sequência de posições dos peões e a divide de maneira que
"a2h5b"
se torne{{"a","2"},{"h","5"},{"b"}}
, depoisLetterNumber
converterá a letra em um número (a -> 1
, etc) eFromDigits
converterá o numeral em um número inteiro. Se a string não estiver bem formada, esta etapa produzirá um erro que será detectado peloCheck
retornoFalse
. Esses dois números são então convertidos em um número inteiro correspondente a um quadrado no quadro.Constrói o gráfico de todas as arestas diagonais do vizinho mais próximo com as posições do peão excluídas.
Estas são listas de vértices iniciais e finais desocupados, respectivamente
Loops nos vértices inicial e final, para cada par
FindPath
, haverá uma lista de caminhos entre eles. Se não houver caminhos entre eles, será uma lista vazia, entãoLength@
retornará0
. Se não houver caminhos,m
será zero e retornaremosTrue
, caso contrário, retornaremosFalse
.fonte
True
eFalse
pode ser1>0
e,0>1
respectivamente.p[1]@#&/@
é equivalente a apenasp@1/@
.Sequence@@
pode ser substituído por##&@@
. Em vez de{LetterNumber[#[[1]]],FromDigits[#[[2]]]}&/@
, você pode usar{LetterNumber@#,FromDigits@#2}&@@@
.p@1/@
, mas vejo a ideia geral. Suponhop@1 = StringPartition[#,1]&
que seja um pouco confuso para mim, porquep
adota dois argumentos de duas maneiras diferentes, uma comom_
e outra como#...&
, acho que isso é apenas uma questão de precedência. Faz sentido, porémp@m = p[m]
.f
que utilize um único argumento,f@#&
tenha o mesmo comportamento que apenasf
- aquif
estáp[1]
. (Depois, mudou a[]
notação para@
, que é sempre idênticos excepto quanto a precedência.)