Bei dieser Herausforderung werden Ihnen zwei Wörter übergeben: Ihre Aufgabe ist es, zu bestimmen, ob sie benachbart sind .
Zwei Buchstaben stehen nebeneinander, wenn:
- Sie sind der gleiche Buchstabe oder
- Sie grenzen lexikografisch aneinander.
Zum Beispiel J ist neben I , J und K nur. Z grenzt nicht an A
Zwei Wörter stehen nebeneinander, wenn:
- Sie sind gleich lang und
- Jeder Buchstabe grenzt an einen eindeutigen Buchstaben im anderen Wort.
Zum Beispiel CAT ist an benachbartes SAD , wie C> D, A> A, T> S .
FREE steht nicht neben GRRD (jedes E benötigt einen Buchstaben zum Koppeln ) .
Input-Output
Sie haben zwei Zeichenfolgen übergeben und müssen einen Wahrheitswert zurückgeben, wenn sie benachbart sind, andernfalls einen falschen Wert. Sie sollten innerhalb einer Minute für alle unten aufgeführten Testfälle zurückkehren.
Sie können davon ausgehen, dass die Zeichenfolgen nur Großbuchstaben enthalten.
Die beiden Zeichenfolgen können als Liste oder verkettet mit oder ohne Anführungszeichen übergeben werden.
Testfälle
Wahrheit:
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
Falsch:
A C
A Z
B J
JK J
CC BA
CE D
DJENSKE GDJCLMT
DEFGHIJKL HJLHMCHE
IJKLIJKLKIJL LIJLLHJLJLLL
AWSUKMEGICOQY RSHXBLJLNQDFZ
QQSQQRRQSTTUQQQRRS PQTTPPTTQTPQPPQRTT
ELKNSDUVWELSKJFESD DKJELKNSUELSDUFEUS
Das ist Code-Golf , also gewinnt die kürzeste gültige Antwort!
quelle
"A A"
?{'string1' 'string2'}
akzeptabel?Antworten:
CJam,
141312 BytesProbieren Sie es online! oder überprüfen Sie alle Testfälle auf einmal .
Algorithmus
Es seien s und t zwei sortierte Wörter gleicher Länge. Damit s und t lexikographisch benachbart sind (LA), ist es notwendig und ausreichend, dass alle Paare der entsprechenden Zeichen ebenfalls LA sind.
Die Bedingung ist eindeutig für alle Wörter ausreichend und für Wörter der Länge 1 erforderlich .
Nehmen wir nun an, dass s und t die Länge n> 1 haben und a und b die ersten Zeichen von s bzw. t sind .
Da s und t LA sind, gibt es eine bijektive Abbildung φ zwischen den Zeichen von s und den Zeichen von t, so dass x und φ (x) für alle x in s LA sind , was bedeutet, dass | x - φ (x) | ≤ 1 für alle x in s .
Sei c = = (a) und d = φ -1 (b) . Aufgrund der Minimalität von a und b sind a ≤ d (1) und b ≤ c (2) .
Da außerdem b und d und a und c und LA sind, ist d ≤ b + 1 (3) und c ≤ a + 1 (4) .
Durch Kombinieren von (1) und (3) und (2) und (4) erhalten wir, dass a ≤ d ≤ b + 1 und b ≤ c ≤ a + 1 , woraus wir ableiten, dass a - 1 ≤ b ≤ a + 1 und daher, dass a und b LA sind.
Wenn wir nun (1) und (4) sowie (2) und (3) kombinieren , erhalten wir c - 1 ≤ a ≤ d und d - 1 ≤ b ≤ c , woraus wir ableiten, dass c - 1 ≤ d ist ≤ c + 1 und daher sind c und d LA.
Wenn wir also φ durch φ (a) = b und φ (d) = c neu definieren , gilt | x - φ (x) | ≤ 1 gilt weiterhin für alle x in s und insbesondere für alle x in s [1:] .
Auf diese Weise sind s [0] = a und t [0] = b und s [1:] und t [1:] LA.
Da s [1:] die Länge n - 1 hat , beweist dies die Notwendigkeit durch Induktion.
Code
quelle
C->Y, D->X
und die einfach nicht gekreuzt werden können.MATL , 10
1217BytesHierbei wird Dennis 'Ansatz verwendet : Zuerst sortieren und Zeichen in übereinstimmenden Positionen vergleichen.
Die Eingabe ist ein Array von Zeichenfolgen mit dem Format
{'CAT 'SAD'}
.Die Ausgabe ist ein Array aus Nullen und Einsen. Ein Ergebnis ist truthy iff es nur Einsen enthält (dies wird vereinbart truthy sein).
Verwendet die aktuelle Version (10.2.1) , die älter als diese Herausforderung ist.
BEARBEITEN: Die Funktion
Xl
wurde|
in neueren Sprachversionen umbenannt (undo
ist nicht mehr erforderlich). Der unten stehende Link enthält diese Änderungen.Probieren Sie es online!
Erklärung :
Alter Ansatz, der die Zeichenfolgen als separate Eingaben akzeptiert: 12 Bytes :
BEARBEITEN : Der Code im Link wurde aufgrund der Änderungen in der Sprache geändert. siehe Kommentar oben.
Probieren Sie es online !
Erklärung :
quelle
[1 0 1]
ist also in MATL falsch. Das ist nützlich.[0 0]
wahr?C 233 Bytes
Sie können es testen, indem Sie das speichern
adj.h
und dann dieseadj.c
Datei verwenden:Dann kompilieren Sie mit
gcc adj.c -o adj
. Die Ausgabe ist:quelle
Python 2, 90 Bytes
Einfache anonyme Funktion, ich muss eine separate Prüfung für die Länge haben, weil
zip
nur contatenate wird. Theres eine ähnliche Funktion initertools
(zip_longest
), die leere Zeichenfolgen auffüllen würde, aber das wäre ziemlich teuer.Testen mit
produziert:
quelle
JavaScript (ES6), 86
90 94Bearbeite 4 Bytes, die dank @Neil gespeichert wurden
Bearbeite 2 4 Bytes, die dank @ Mwr247 gespeichert wurden
Hinweis: Adjazenzprüfung an einem Buchstabenpaar. Nehmen Sie das Paar als Basis 36 Nummer n , wenn die Buchstaben gleich sind, dann
n = a*36+a = a*37
. Wenn es einen Unterschied von 1 gibt, dannn = a*36+a+1 = a*37+1
odern = a*36+a-1 = a*37-1
. Alson % 37
muss 0, 1 oder 36 sein. Undn%37%36
muss 0 oder 1 sein.Anmerkung 2: Die hinzugefügte „0“ wird verwendet, um sicherzustellen, dass a und b dieselbe Länge haben. Es ist dann kürzer
a.length==b.length
quelle
''
anstelle des ersten verwenden,'0'
da es den Wert der Analyse nicht ändert.b
Sortierung mit der Zeichenreferenz(a,b)=>[...[...a].sort(),0].every((x,i)=>parseInt(x+([...b].sort()[i]||0),36)%37%36<2)
JavaScript ES6,
117 Bytes116 Bytes111 Bytes109 BytesTestfälle
Kredit
quelle
[...s]
anstelle von verwendens.split('')
?Pyth,
3731 BytesProbieren Sie es online mit allen Testfällen!
6 Bytes mit der verkürzten Reduktionsnotation (
-F
anstelle von.U-bZ
) abgeschnittenVon Dennis inspirierte Lösung
Erste Einreichung bei Codegolf!
Erläuterung
Wir können den Ausdruck in zwei Teile aufteilen, die verglichen werden,
&
um das Ergebnis auszugeben. Ich werde versuchen zu erklären, indem ich etwas Pseudo-Python schreibeZuerst prüfen wir, ob die Länge der beiden Wörter gleich ist
Dann wenden wir Dennis 'Methode an:
Wir verwenden dann den
-
Operator, um alle Elemente dieser Liste zu filtern, die nicht in[Z1
([0, 1]
) enthalten sind, und überprüfen, ob das Ergebnis eine leere Liste istqY
quelle
JavaScript (ES6), 87 Byte
Verwendet eine nullzentrische symmetrische Bereichsprüfung, indem durch den Maximalwert dividiert und dann mit einem bitweisen "oder" (
|
) abgeschnitten wird . Kürzer als zwei Prüfungen oder eine mitMath.abs()
.quelle
Haskell,
6763 BytesAnwendungsbeispiel:
f "FREE" "GRRD"
->False
.Wie es funktioniert (Anmerkung:
f
ist teilweise frei von Punkten und der zweite Parameterb
erscheint nicht in der Definition):Edit: @xnor hat 4 Bytes zum Speichern gefunden. Vielen Dank!
quelle
id x
nicht nurx
? Oder wie wäre es[pred x..succ x]
?\x->map($x)[pred,id,succ]
, dasid
war also nur ein Überbleibsel. Natürlich..
übertrifft alles. Vielen Dank!C 172 Bytes
Testfälle
quelle
PowerShell, 140 Byte
Könnte möglich sein, dies kürzer zu bekommen. Es ist derzeit nicht mit Python oder JavaScript konkurrierend, aber es verwendet einen etwas anderen Ansatz, so dass ich dachte, ich würde es posten.
Erläuterung
Dieser Code ist für jemanden, der PowerShell nicht fließend beherrscht, sehr verwirrend. Ich werde versuchen, ihn so gut ich kann in Englisch aufzuteilen ...
Wir beginnen mit der
param($a,$b)
normalen Eingabe .Der gesamte Rest des Codes ist tatsächlich eine Anweisung und kann unterbrochen werden
(...)-and(...)
, um zwei Boolesche Anweisungen mit dem-and
Operator zu testen .Die linken Parens können gebrochen werden
(... -eq ...)
, um die Gleichheit von zwei Objekten zu testen. In diesem Fall sind die Objekte das.Count
s (dh die Länge) von zwei neuen Zeichen-Arrays. Jeder innere Paren verwendet($a=[char[]]$a|sort)
das ursprüngliche Eingabewort, wandelt es in ein Zeichen-Array um, sortiert es dann und speichert es erneut in derselben Variablen. Wir machen das für beide$a
und$b
. Die linke Seite verifiziert somit, dass die Eingabewörter die gleiche Länge haben. Wenn sie nicht dieselbe Länge haben, schlägt diese Hälfte der äußeren Booleschen Anweisung fehl undFalse
wird ausgegeben.Auf der rechten Seite testen wir erneut zwei Boolesche Anweisungen mit
(... -and ...)
. Die linke Seite prüft, ob etwas größer als oder gleich negativ 1 ist-ge-1
. Das Etwas ist das nullte Element eines konstruierten Arrays$c
, das erzeugt wird durch:0..($a.count-1)
|%{...}
$a
und subtrahieren den ASCII-Wert des indizierten Zeichens in$b
|sort
durch numerischen Wert bearbeitet wirdDie andere Seite der Anweisung nimmt den Maximalwert
$c[-1]
des Arrays und stellt sicher, dass es mit 1 kleiner oder gleich 1 ist-le1
.Wenn also die beiden Eingabe-Strings tatsächlich benachbart sind, ist das
$c
Array ungefähr so@(-1,-1,-1...0,0,0...1,1,1)
. So wird das erste Element-1
und das letzte Element sein1
. Wenn sie nicht benachbart sind, ist die Differenz der ASCII-Werte für ein bestimmtes Paar entweder< -1
oder> 1
, sodass diese Hälfte des äußeren Booleschen Tests fehlschlägt undFalse
ausgegeben wird.Nur wenn beide Seiten passen, wird
True
ausgegeben, und die Zeichenfolgen sind daher LA.quelle
Rust,
269264 BytesErweitert:
Testfälle:
quelle
APL, 59 Bytes (Zeichen)
(61, wenn wir die {und}, 63 mit f ← versorgen müssen)
Ich bin nicht der beste APLer, aber es macht einfach zu viel Spaß.
(0=+/2≤|¨∊-/{⎕av⍳⍵}¨(⍺{⌈/⍴¨⍺⍵}⍵)⍴¨⍺[⍋⍺]⍵[⍋⍵])∧=/⍴¨∊¨⍺⍵
=/⍴¨∊¨⍺⍵
sind die eingänge gleich lang∧
und all das unten(⍺{⌈/⍴¨⍺⍵}⍵)⍴¨⍺[⍋⍺]⍵[⍋⍵]
Sortieren Sie beide Eingänge und formen Sie sie so, dass sie so lang wie die längste der beiden sind (sie werden umbrochen, wenn Sie sie länger machen als sie sind).|¨∊-/{⎕av⍳⍵}
Wandle beide Zeichenvektoren in int-Vektoren ihrer ASCII-Werte um, führe eine Vektorsubtraktion durch und absolviere alle Werte0=+/2≤
Summiere Werte größer oder gleich zwei und überprüfe, ob das Ergebnis gleich 0 istquelle
K (oK) , 27 Bytes
Lösung:
Probieren Sie es online!
Beispiele:
Erläuterung:
Sortieren Sie zuerst die einzelnen Zeichenfolgen, und füllen Sie sie dann so auf, dass sie die gleiche Länge haben. Nehmen Sie dann die ASCII-Werte der Zeichen ab
abs
.quelle
J, 27 Bytes
ungolfed
erklärt
&(3&u:@/:~)
sortiert beide Argumente und konvertiert sie in ASCII-Zahlen,:
Erstellt eine 2 xn-Matrix, wobei n die Anzahl der Zeichen der Argumente ist-/
subtrahiert eine Zeile von der anderen und gibt eine Liste der Länge n an, die den Abstand der entsprechenden Zeichen darstellt(2>|)
Gibt 1 zurück, wenn der absolute Wert der Entfernung kleiner als 2 ist, andernfalls 0*/
multipliziert all diese0
s und1
s zusammen: daher ist das Endergebnis 1, wenn alle Paare entsprechender Zeichen benachbart sind.Probieren Sie es online!
quelle