Dans ce défi, vous passez deux mots: Votre travail consiste à déterminer s'ils sont adjacents .
Deux lettres sont adjacentes si:
- Ce sont la même lettre, ou
- Ils sont lexicographiquement adjacents.
Par exemple, J est adjacent à I , J et K uniquement. Z n'est pas adjacent à A
Deux mots sont adjacents si:
- Ils ont la même longueur, et
- Chaque lettre est adjacente à une lettre unique dans l'autre mot.
Par exemple, CAT est adjacent à SAD , comme C> D, A> A, T> S .
FREE n'est pas adjacent à GRRD (chaque E a besoin d'une lettre pour s'associer ) .
Entrée sortie
Vous passez deux chaînes et vous devez renvoyer une valeur véridique si elles sont adjacentes, sinon une valeur fausse. Vous devez revenir dans une minute pour tous les cas de test ci-dessous.
Vous pouvez supposer que les chaînes ne contiendront que des lettres alphabétiques majuscules.
Les deux chaînes peuvent être passées sous forme de liste, ou concaténées, avec ou sans guillemets.
Cas de test
Vérité:
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
Faux:
A C
A Z
B J
JK J
CC BA
CE D
DJENSKE GDJCLMT
DEFGHIJKL HJLHMCHE
IJKLIJKLKIJL LIJLLHJLJLLL
AWSUKMEGICOQY RSHXBLJLNQDFZ
QQSQQRRQSTTUQQQRRS PQTTPPTTQTPQPPQRTT
ELKNSDUVWELSKJFESD DKJELKNSUELSDUFEUS
C'est le code-golf , donc la réponse valide la plus courte l'emporte!
la source
"A A"
?{'string1' 'string2'}
serait-il également acceptable?Réponses:
CJam,
141312 octetsEssayez-le en ligne! ou vérifiez tous les cas de test à la fois .
Algorithme
Soit s et t deux mots triés de même longueur. Pour que s et t soient lexicographiquement adjacents (LA), il est nécessaire et suffisant que toutes les paires de ses caractères correspondants soient également LA.
La condition est clairement suffisante pour tous les mots et nécessaire pour les mots de longueur 1 .
Supposons maintenant que s et t aient une longueur n> 1 , et que a et b soient les premiers caractères, respectivement, de s et t .
Puisque s et t sont LA, il existe une correspondance bijective φ entre les caractères de s et les caractères de t tels que x et φ (x) sont LA pour tout x dans s , ce qui signifie que | x - φ (x) | ≤ 1 pour tous les x en s .
Soit c = φ (a) et d = φ -1 (b) . En raison de la 's et b ' de la minimalité, un ≤ d (1) et b ≤ c (2) .
De plus, puisque b et d , et a et c , et LA, d ≤ b + 1 (3) et c ≤ a + 1 (4) .
En combinant (1) et (3) , et (2) et (4) , nous obtenons que a ≤ d ≤ b + 1 et b ≤ c ≤ a + 1 , dont nous déduisons que a - 1 ≤ b ≤ a + 1 et, par conséquent, que a et b sont LA.
Maintenant, en combinant (1) et (4) , et (2) et (3) , nous obtenons que c - 1 ≤ a ≤ d et d - 1 ≤ b ≤ c , dont nous déduisons que c - 1 ≤ d ≤ c + 1 et donc que c et d sont LA.
Ainsi, si nous redéfinissons φ par φ (a) = b et φ (d) = c , | x - φ (x) | ≤ 1 sera toujours valable pour tous les x dans s et, en particulier, pour tous les x dans s [1:] .
De cette façon, s [0] = a et t [0] = b , et s [1:] et t [1:] , sont LA.
Puisque s [1:] a une longueur n - 1 , cela prouve la nécessité par induction.
Code
la source
C->Y, D->X
, et celles-ci peuvent simplement être décroisées.MATL , 10
1217octetsCela utilise l'approche de Dennis : triez d'abord et comparez les caractères dans les positions correspondantes.
L'entrée est un tableau de chaînes, au format
{'CAT 'SAD'}
.La sortie est un tableau de zéros et de uns. Un résultat est véridique si elle contient tous les éléments (ce qui est convenu pour être véridique).
Utilise la version actuelle (10.2.1) , antérieure à ce défi.
EDIT: la fonction
Xl
a été renommée|
dans les nouvelles versions de la langue (eto
n'est plus nécessaire). Le lien ci-dessous inclut ces modifications.Essayez-le en ligne!
Explication :
Ancienne approche, qui accepte les chaînes comme entrées séparées: 12 octets :
EDIT : le code du lien a été modifié en fonction des changements de langue; voir le commentaire ci-dessus.
Essayez-le en ligne !
Explication :
la source
[1 0 1]
est faux en MATL. C'est utile.[0 0]
est véridique?C, 233 octets
Vous pouvez le tester en l'enregistrant sous
adj.h
et en utilisant ceadj.c
fichier:Compilez ensuite avec
gcc adj.c -o adj
. La sortie est:la source
Python 2, 90 octets
Fonction anonyme simple, je dois avoir une vérification séparée de la longueur car
zip
elle ne fera que contaténer. Il existe une fonction similaire dansitertools
(zip_longest
) qui remplirait les chaînes vides, mais ce serait assez coûteux.Test avec
produit:
la source
JavaScript (ES6), 86
90 94Modifier 4 octets enregistrés thx @Neil
Modifier 2 4 octets enregistrés thx @ Mwr247
Remarque: contrôle d'adjacence sur une paire de lettres. Prenez la paire comme un nombre de base n 36 , si les lettres sont égales, alors
n = a*36+a = a*37
. S'il y a une différence de 1, alorsn = a*36+a+1 = a*37+1
oun = a*36+a-1 = a*37-1
.n % 37
Doit donc être 0, 1 ou 36. Etn%37%36
doit être 0 ou 1.Remarque 2: le «0» ajouté est utilisé pour garantir que a et b ont la même longueur. C'est plus court alors
a.length==b.length
la source
''
à la place du premier'0'
car cela ne change pas la valeur de l'analyse.b
tri avec la référence de caractère:(a,b)=>[...[...a].sort(),0].every((x,i)=>parseInt(x+([...b].sort()[i]||0),36)%37%36<2)
= 86 octetsJavaScript ES6,
117 octets116 octets111 octets109 octetsCas de test
Crédit
la source
[...s]
place des.split('')
?Pyth,
3731 octetsEssayez-le en ligne avec tous les cas de test!
Réduit 6 octets en utilisant la notation de réduction raccourcie (
-F
au lieu de.U-bZ
)Solution inspirée de Dennis
Première soumission à codegolf!
Explication
Nous pouvons diviser l'expression en deux parties, qui sont comparées à
&
pour produire le résultat. Je vais essayer d'expliquer en écrivant du pseudo-PythonOn vérifie d'abord que la longueur des deux mots est la même
Ensuite, nous appliquons la méthode de Dennis:
Nous utilisons ensuite l'
-
opérateur pour filtrer tous les éléments de cette liste qui ne sont pas dans[Z1
([0, 1]
), et vérifions que le résultat est une liste vide avecqY
la source
JavaScript (ES6), 87 octets
Utilise une vérification de plage symétrique de centrage zéro en divisant par la valeur maximale, puis en tronquant avec un "ou" (
|
) au niveau du bit . Plus court que d'avoir à faire deux contrôles, ou un avecMath.abs()
.la source
Haskell,
6763 octetsExemple d'utilisation:
f "FREE" "GRRD"
->False
.Comment cela fonctionne (note:
f
est partiellement sans point et le deuxième paramètreb
n'apparaît pas dans la définition):Edit: @xnor a trouvé 4 octets à enregistrer. Merci!
la source
id x
pas justex
? Ou que diriez-vous[pred x..succ x]
?\x->map($x)[pred,id,succ]
, doncid
c'était juste un reste. Bien sûr,..
il bat tout. Merci!C, 172 octets
Cas de test
la source
PowerShell, 140 octets
Il pourrait être possible de raccourcir ce délai. Ce n'est pas actuellement compétitif avec Python ou JavaScript, mais il utilise une approche légèrement différente, alors j'ai pensé que je le publierais.
Explication
Ce code est vraiment déroutant pour quelqu'un qui ne maîtrise pas PowerShell, donc je vais essayer de le décomposer en anglais du mieux que je peux ...
Nous commençons par prendre les entrées
param($a,$b)
comme d'habitude.Le reste du code est en fait une instruction, et peut être rompu
(...)-and(...)
pour tester deux instructions booléennes avec l'-and
opérateur.Les parens de gauche peuvent être brisés
(... -eq ...)
pour tester l'égalité de deux objets. Dans ce cas, les objets sont les.Count
s (c'est-à-dire la longueur) de deux nouveaux tableaux de caractères. Chaque parent interne($a=[char[]]$a|sort)
prend le mot d'entrée d'origine, le retransmet en tant que tableau de caractères, puis le trie et le réenregistre dans la même variable. Nous faisons cela pour$a
et$b
. Le côté gauche vérifie ainsi que les mots saisis ont la même longueur. S'ils ne sont pas de la même longueur, cette moitié de l'instruction booléenne externe échouera etFalse
sera sortie.Passant à droite, nous testons à nouveau deux instructions booléennes avec
(... -and ...)
. Le côté gauche teste si quelque chose est supérieur ou égal à négatif 1 avec-ge-1
. Le quelque chose est l'élément nul d'un tableau construit$c
, qui est créé par:0..($a.count-1)
|%{...}
$a
et on soustrait la valeur ASCII du caractère indexé dans$b
|sort
édité par valeur numériqueL'autre côté de l'instruction prend la valeur maximale
$c[-1]
du tableau et garantit qu'il est inférieur ou égal à 1 avec-le1
.Ainsi, si les deux chaînes d'entrée sont en effet adjacentes, le
$c
tableau ressemblera à quelque chose@(-1,-1,-1...0,0,0...1,1,1)
. Le premier élément sera donc-1
et le dernier élément sera1
. Si elles ne sont pas adjacents, la différence des valeurs ASCII pour une paire particulière sera soit< -1
ou> 1
, cette moitié du test booléen externe échouera etFalse
sera sortie.Ce n'est que si les deux côtés passent seront
True
sortis, et les chaînes sont donc LA.la source
Rouille,
269264 octetsÉtendu:
Cas de test:
la source
APL, 59 octets (caractères)
(61 si nous devons fournir les {et}, 63 avec f ←)
Je ne suis pas le meilleur APLer, mais c'est trop amusant.
(0=+/2≤|¨∊-/{⎕av⍳⍵}¨(⍺{⌈/⍴¨⍺⍵}⍵)⍴¨⍺[⍋⍺]⍵[⍋⍵])∧=/⍴¨∊¨⍺⍵
=/⍴¨∊¨⍺⍵
les entrées sont-elles également longues?∧
et tout ce qui suit(⍺{⌈/⍴¨⍺⍵}⍵)⍴¨⍺[⍋⍺]⍵[⍋⍵]
trier les deux entrées et les façonner pour être aussi longues que les plus longues des deux (elles s'enroulent si vous les rendez plus longues qu'elles ne le sont)|¨∊-/{⎕av⍳⍵}
convertir les deux vecteurs char en vecteurs int de leurs valeurs ascii, faire une soustraction vectorielle et absolu toutes les valeurs0=+/2≤
résumer des valeurs supérieures ou égales à deux et vérifier si le résultat est égal à 0la source
K (oK) , 27 octets
Solution:
Essayez-le en ligne!
Exemples:
Explication:
Triez d'abord chaque chaîne, puis remplissez la même longueur, puis prenez l'une de l'autre (valeurs ASCII des caractères), résultat carré car il n'y a pas de fonction intégrée
abs
, prenez la différence maximale et vérifiez si elle est inférieure à 2.la source
J, 27 octets
non golfé
expliqué
&(3&u:@/:~)
trie les deux arguments et les convertit en nombres ascii,:
crée une matrice 2 xn, où n est le nombre de caractères des arguments-/
soustrait une ligne de l'autre, donnant une liste de longueur n représentant la distance des caractères correspondants(2>|)
renvoie 1 si la valeur absolue de la distance est inférieure à 2, sinon 0*/
multiplie tous ces0
s et1
s ensemble: par conséquent, le résultat final est 1 si toutes les paires de caractères correspondants sont adjacentes.Essayez-le en ligne!
la source