Neste desafio, você recebe duas palavras: Seu trabalho é determinar se elas são adjacentes .
Duas letras são adjacentes se:
- Eles são a mesma letra ou
- Eles são lexicograficamente adjacentes.
Por exemplo, J é adjacente a I , J e K apenas. Z não é adjacente a A
Duas palavras são adjacentes se:
- Eles têm o mesmo comprimento e
- Cada letra é adjacente a uma letra única na outra palavra.
Por exemplo, CAT é adjacente a SAD , como C> D, A> A, T> S .
FREE não é adjacente ao GRRD (cada E precisa de uma letra para emparelhar) .
Entrada / Saída
Você recebe duas cadeias de caracteres e precisa retornar um valor verdadeiro se elas forem adjacentes, caso contrário, um valor falso. Você deve retornar dentro de um minuto para todos os casos de teste abaixo.
Você pode assumir que as seqüências conterão apenas letras alfabéticas maiúsculas.
As duas cadeias podem ser passadas como uma lista ou concatenadas, com ou sem aspas.
Casos de teste
Verdade:
A A
A B
C B
DD CE
DE FC
ABCD BCDE
AACC DBBB
DJENSKE FDJCLMT
DEFGHIJKL HJLEHMCHE
IKLIJJLIJKKL LJLJLJLJLJHI
ACEGIKMOQSUWY BLNPRDFTVHXJZ
QQSQQRRQSTTUQQRRRS PQTTPPTTQTPQPPQRTP
ELKNSDUUUELSKJFESD DKJELKNSUELSDUFEUS
Falsy:
A C
A Z
B J
JK J
CC BA
CE D
DJENSKE GDJCLMT
DEFGHIJKL HJLHMCHE
IJKLIJKLKIJL LIJLLHJLJLLL
AWSUKMEGICOQY RSHXBLJLNQDFZ
QQSQQRRQSTTUQQQRRS PQTTPPTTQTPQPPQRTT
ELKNSDUVWELSKJFESD DKJELKNSUELSDUFEUS
Isso é código-golfe , então a resposta mais curta e válida vence!
fonte
"A A"
?{'string1' 'string2'}
seria aceitável?Respostas:
CJam,
141312 bytesExperimente online! ou verifique todos os casos de teste de uma só vez .
Algoritmo
Let s e t ser dois ordenados palavras do mesmo comprimento. Para que s e t sejam lexicograficamente adjacentes (LA), é necessário e suficiente que todos os pares de seus caracteres correspondentes também sejam LA.
A condição é claramente suficiente para todas as palavras e necessária para palavras de tamanho 1 .
Agora, suponha que s e t tenham comprimento n> 1 e que a e b sejam os primeiros caracteres, respectivamente, de s e t .
Como s e t são LA, existe algum mapeamento bijetivo φ entre os caracteres de s e os caracteres de t, de modo que x e φ (x) são LA para todo x em s , o que significa que | x - φ (x) | ≤ 1 para todos os x em s .
Deixe c = φ (a) e d = φ -1 (b) . Por causa de um 's e b ' s minimalidade, um ≤ d (1) e b ≤ c (2) .
Além disso, desde que b e d , e a e c , e LA, d ≤ b + 1 (3) e c ≤ a + 1 (4) .
Ao combinar (1) e (3) e (2) e (4) , obtemos que a ≤ d ≤ b + 1 e b ≤ c ≤ a + 1 , dos quais deduzimos que a - 1 ≤ b ≤ a + 1 e, portanto, que um e b são LA.
Agora, combinando (1) e (4) e (2) e (3) , obtemos que c - 1 ≤ a ≤ d e d - 1 ≤ b ≤ c , a partir da qual deduzimos que c - 1 ≤ d ≤ c + 1 e, portanto, c e d são LA.
Assim, se redefinir φ por φ (a) = b e φ (d) = c , | x - φ (x) | ≤ 1 ainda vai realizar para todos x no s e, em particular, para todo x no s [1:] .
Dessa forma, s [0] = a e t [0] = b e s [1:] e t [1:] são LA.
Como s [1:] tem comprimento n - 1 , isso prova a necessidade por indução.
Código
fonte
C->Y, D->X
, e essas podem simplesmente não ser cruzadas.MATL , 10
1217bytesIsso usa a abordagem de Dennis : classifique primeiro e compare os caracteres nas posições correspondentes.
A entrada é uma matriz de strings, com o formato
{'CAT 'SAD'}
.Saída é uma matriz de zeros e uns. Um resultado é verdadeiro se contiver todos (é acordado que isso é verdade).
Usa a versão atual (10.2.1) , que é anterior a esse desafio.
EDIT: A função
Xl
foi renomeada para|
nas versões mais recentes do idioma (eo
não é mais necessária). O link abaixo inclui essas modificações.Experimente online!
Explicação :
Abordagem antiga, que aceita as seqüências de caracteres como entradas separadas: 12 bytes :
EDIT : o código no link foi modificado de acordo com as alterações no idioma; veja o comentário acima.
Experimente online !
Explicação :
fonte
[1 0 1]
é falso no MATL. Isso é útil.[0 0]
é verdadeira?C, 233 bytes
Você pode testá-lo salvando isso como
adj.h
e depois usando esteadj.c
arquivo:Em seguida, compile usando
gcc adj.c -o adj
. A saída é:fonte
Python 2, 90 bytes
Função anônima simples, eu tenho que ter uma verificação separada para o comprimento, porque
zip
apenas contatenar. Existe uma função semelhante emitertools
(zip_longest
) que preencheria cadeias vazias, mas isso seria bastante caro.Testando com
produz:
fonte
JavaScript (ES6), 86
90 94Editar 4 bytes salvos thx @Neil
Editar 2 4 bytes salvos thx @ Mwr247
Nota: verificação de adjacência em um par de letras. Tome o par como um número base 36 n , se as letras forem iguais, então
n = a*36+a = a*37
. Se houver uma diferença de 1, entãon = a*36+a+1 = a*37+1
oun = a*36+a-1 = a*37-1
. Portanto,n % 37
deve ser 0, 1 ou 36. En%37%36
deve ser 0 ou 1.Nota 2: o '0' adicionado é usado para garantir que a e b tenham o mesmo comprimento. É mais curto então
a.length==b.length
fonte
''
no lugar do primeiro,'0'
pois ele não altera o valor da análise.b
classificação com a referência de caracteres:(a,b)=>[...[...a].sort(),0].every((x,i)=>parseInt(x+([...b].sort()[i]||0),36)%37%36<2)
= 86 bytes #JavaScript ES6,
117 bytes116 bytes111 bytes109 bytesCasos de teste
Crédito
fonte
[...s]
vez des.split('')
?Pitão,
3731 bytesExperimente online com todos os casos de teste!
Retirou 6 bytes usando a notação reduzida reduzida (em
-F
vez de.U-bZ
)Solução inspirada em Dennis
Primeira submissão ao codegolf!
Explicação
Podemos dividir a expressão em duas partes, que são comparadas com
&
a saída do resultado. Vou tentar explicar escrevendo alguns pseudo-PythonPrimeiro, verificamos se o comprimento das duas palavras é o mesmo
Em seguida, aplicamos o método de Dennis:
Em seguida, usamos o
-
operador para filtrar todos os elementos dessa lista que não estão em[Z1
([0, 1]
) e verificar se o resultado é uma lista vazia comqY
fonte
JavaScript (ES6), 87 bytes
Usa uma verificação de faixa simétrica centrada em zero, dividindo pelo valor máximo e depois truncando com um "ou" (
|
) bit a bit . Mais curto do que ter que fazer duas verificações, ou uma comMath.abs()
.fonte
Haskell,
6763 bytesExemplo de uso:
f "FREE" "GRRD"
->False
.Como funciona (nota:
f
é parcialmente isento de pontos e o segundo parâmetrob
não aparece na definição):Edit: @xnor encontrado 4 bytes para salvar. Obrigado!
fonte
id x
é sóx
? Ou que tal[pred x..succ x]
?\x->map($x)[pred,id,succ]
, entãoid
era apenas uma sobra. Claro que..
supera tudo. Obrigado!C, 172 bytes
Casos de teste
fonte
PowerShell, 140 bytes
Pode ser possível diminuir isso. No momento, ele não é competitivo com Python ou JavaScript, mas usa uma abordagem um pouco diferente, então achei que eu a publicaria.
Explicação
Esse código é realmente confuso para alguém que não é fluente no PowerShell, então tentarei dividi-lo em inglês da melhor maneira possível ...
Começamos com a entrada
param($a,$b)
normal.Todo o restante do código é na verdade uma instrução e pode ser desfeita
(...)-and(...)
para testar duas instruções booleanas com o-and
operador.As parênteses à esquerda podem ser quebradas
(... -eq ...)
para testar a igualdade de dois objetos. Nesse caso, os objetos são os.Count
s (ou seja, o comprimento) de dois novos arrays. Cada parêntese interno($a=[char[]]$a|sort)
pega a palavra de entrada original, a lança novamente como uma matriz de caracteres, depois a classifica e salva novamente na mesma variável. Fazemos isso para ambos$a
e$b
. O lado esquerdo verifica se as palavras de entrada têm o mesmo comprimento. Se eles não tiverem o mesmo comprimento, essa metade da instrução booleana externa falhará eFalse
será gerada.Passando para o lado direito, estamos novamente testando duas instruções booleanas com
(... -and ...)
. O lado esquerdo testa se algo é maior que ou igual a 1 negativo com-ge-1
. O algo é o elemento zeroth de uma matriz construída$c
, criada por:0..($a.count-1)
|%{...}
$a
e subtraímos o valor ASCII do caractere indexado em$b
|sort
editado pelo valor numéricoO outro lado da instrução pega o valor máximo
$c[-1]
da matriz e garante que seja menor ou igual a 1 com-le1
.Portanto, se as duas seqüências de entrada forem de fato adjacentes, a
$c
matriz será algo como@(-1,-1,-1...0,0,0...1,1,1)
. Portanto, o primeiro elemento será-1
e o último elemento será1
. Se eles não forem adjacentes, a diferença nos valores ASCII para um par específico será< -1
ou> 1
, portanto, essa metade do teste booleano externo falhará eFalse
será gerada.Somente se os dois lados passarem será
True
emitido, e as seqüências de caracteres serão, portanto, LA.fonte
Ferrugem,
269264 bytesExpandido:
Casos de teste:
fonte
APL, 59 bytes (caracteres)
(61 se tivermos de fornecer {e}, 63 com f ←)
Eu não sou o melhor APLer, mas é muito divertido.
(0=+/2≤|¨∊-/{⎕av⍳⍵}¨(⍺{⌈/⍴¨⍺⍵}⍵)⍴¨⍺[⍋⍺]⍵[⍋⍵])∧=/⍴¨∊¨⍺⍵
=/⍴¨∊¨⍺⍵
as entradas são igualmente longas?∧
e todos os itens abaixo(⍺{⌈/⍴¨⍺⍵}⍵)⍴¨⍺[⍋⍺]⍵[⍋⍵]
classifique as duas entradas e modele-as para que elas sejam tão longas quanto as duas (elas se enrolam se você as alongar mais do que são)|¨∊-/{⎕av⍳⍵}
converte ambos os vetores char em vetores int de seus valores ascii, faça uma subtração vetorial e absoluta todos os valores0=+/2≤
some valores maiores ou iguais a dois e verifique se o resultado é igual a 0fonte
K (oK) , 27 bytes
Solução:
Experimente online!
Exemplos:
Explicação:
Primeiro, ordene cada string, depois mantenha o mesmo comprimento e depois pegue um do outro (valores ASCII de caracteres), resultado quadrado como não há built-in
abs
, faça a diferença máxima e verifique se é menor que 2.fonte
J, 27 bytes
destroçado
explicado
&(3&u:@/:~)
classifica os dois argumentos e os converte em números ascii,:
cria uma matriz 2 xn, em que n é o número de caracteres dos argumentos-/
subtrai uma linha da outra, fornecendo uma lista do comprimento n que representa a distância dos caracteres correspondentes(2>|)
retorna 1 se o valor absoluto da distância for menor que 2, 0 caso contrário*/
multiplica todos os se0
es1
juntos: portanto, o resultado final é 1 se todos os pares de caracteres correspondentes forem adjacentes.Experimente online!
fonte