Dieser Wettbewerb ist vorbei.
Der Gewinner ist CJam mit 22 Charakteren, der die Antwort von TwiNight um einen Charakter übertrifft . Glückwunsch Dennis !
Eine lobende Erwähnung geht an Falko , der von den kostenlosen Importen total verrückt geworden ist.
.
Vor einiger Zeit wollte ich wissen, wie ich moderne Smartphones mit meinem Nokia 3310 übertreffen kann, und obwohl einige Antworten wirklich gut waren, kann ich immer noch nicht mithalten! Vielleicht sollte ich einen anderen Ansatz wählen und einfach keine Wörter schreiben, die schwer zu tippen sind.
Wir rufen einen Text auf, der leicht zu tippen ist, wenn sich auf der Telefontastatur keine zwei aufeinanderfolgenden Buchstaben auf derselben Schaltfläche befinden, wenn das Standardlayout verwendet wird:
Deine Aufgabe
Ihre Aufgabe ist es, ein Programm / eine Funktion zu schreiben, das / die eine Zeichenfolge s
von stdin / als Parameter s
akzeptiert und einen Wahrheitswert zurückgibt, wenn dies leicht zu tippen ist, und einen falschen Wert, wenn dies nicht der Fall ist. Die Eingabe besteht nur aus Kleinbuchstaben und Leerzeichen und ist garantiert nicht leer!
Wertung
Das ist Codegolf, also gewinnt die niedrigste Anzahl an Charakteren.
Import - Anweisungen werden nicht auf Ihre Endnote gezählt werden, so dass , wenn Sie jemals Gebrauch gewünscht haben std::set_symmetric_difference
, liftM4
oder itertools.combinations
in Ihrem Code, jetzt ist die Zeit!
-3 wenn Ihr Quellcode leicht zu tippen ist, vorausgesetzt, alles, was kein Buchstabe ist, befindet sich auf Button 0. Schließlich möchte ich Ihren Code vielleicht an einige Freunde senden!
Testfälle
Hier sind einige Testfälle, um zu überprüfen, ob Ihr Code wie beabsichtigt funktioniert:
"x" -> True
"aardvark" -> False
"ardvark" -> True
"flonk" -> False
"im codegolfing all day long" -> False
"i indulge in minimizing bytecount" -> True
"havent heard from you in a long time" -> False
"your silence was of undue permanence" -> True
"how are you" -> False
"how are you" -> True
Viel Spaß beim Golfen!
Antworten:
CJam,
34312722 ZeichenProbieren Sie es online aus.
Beispiellauf
Wie es funktioniert
Hintergrund
Der Kern des Codes besteht darin, auf jedes Zeichen C der Eingabezeichenfolge eine Abbildung F anzuwenden , damit die Bilder der Symbole auf demselben Schlüssel übereinstimmen. Ich habe die passende Karte gefunden, indem ich Folgendes beobachtet habe:
Die Karte T: C ↦ (C - 'h') + 13 transformiert die Zeichenfolge S: = "abcdefghijklmnopqrstuvxyz" wie folgt:
Für die Schlüssel 0zu 6würde es genügen, T (C) durch 3 zu teilen , aber wir müssen eine Art Korrektur auf die Zeichen in s , t , v anwenden , y und z .
Die Karte D: C ↦ (C - 'h') / 9 transformiert den String S in folgendes Array:
Dies korrigiert die Quotienten von s , t , v , y und z , ohne die anderen zu beeinflussen.
Schließlich transformiert die Abbildung F: C ↦ (T (C) - D (C)) / 3 die Zeichenkette S wie folgt:
Alles was übrig bleibt ist, die aufeinanderfolgenden Zeichen irgendwie zu vergleichen. Zu diesem Zweck XOR F (C) mit dem Bild des vorherigen Zeichens - für das erste, wir XOR F (C) mit 1 (Standardwert der Variablen X ), die kein Vorbild hat - und multiplizieren alle Ergebnisse.
Das Produkt ist nur dann falsch, wenn einer der Faktoren Null ist, dh wenn zwei aufeinanderfolgende Zeichen dasselbe Bild von F haben .
quelle
Python 2 -
80, 68, 64, 61, 58, 50, 48, 45, 4442Obwohl es jetzt ein bisschen lächerlich wird, werde ich weiterhin kostenlose Bibliotheksimporte verwenden, sogar die
__builtin__
Bibliothek:Für die Codelänge zählt also nur die folgende kurze Zeile:
Dank an Markuz für die Ideen bezüglich
input()
! Diese Herausforderungen des freien Imports führen Sie immer in einige weniger bekannte Bibliotheken ein. ;)Alternativ nur mit der
operator
Bibliothek (98, 8379):Ich höre hier auf. Aber man konnte diese Version weiter Golf spielen mit
sys
,pprint
und andere Bibliotheken ...Alternative ohne Bibliotheken (105):
quelle
ord(c)
einer Variablen (spricho
) und dannc/112
undc/119
statt der Booleschen subtrahiert?lambda
Ausdrücken keine Variablen so einfach zuordnen . Mit[(o-1-o/112-o/119)/3for o in map(ord,s)]
lande ich wieder bei 80 Bytes.from sys import argv as s
,s[1]
anstattinput()
input
aus__builtin__
und ist eigentlich noch besser: D Speicher noch ein weiteres Byte.RubyRegex (beliebteste Geschmacksrichtungen),10683 BytesWeil Regex
Ich habe gerade den Mittelsmann (Ruby) geschnitten und dies zu einer reinen Regex-Lösung gemacht. Funktioniert in vielen Geschmacksrichtungen und findet nur dann eine Übereinstimmung, wenn die Zeichenfolge nicht zwei aufeinanderfolgende Zeichen auf derselben Schaltfläche enthält.
quelle
{2}
dem Rahmen werfen und 22 Bytes einsparen?Bash + Coreutils, 49
Gibt einen Exit-Code von 1 für TRUE und 0 für FALSE zurück:
quelle
perl -pE'y/a-z/aaadddgggjjjmmmpppptttwwww/;$_=!/(.)\1/' <(echo "x")
Es wird 1 für wahr und nichts für falsch ausgegeben.aaadddgggjjjmmmpppptttwwww
aber ich habe aufgegeben.11122233344455566667778888
verwenden. Durch die Kodierung der ersten 19 Ziffern dieser Zahl mit der Basis 36 können wir 1 Zeichen sparen!APL (Dyalog),
2423Erläuterung
⍞
: Nimmt Zeichenketteneingabe vom Bildschirm entgegen⎕AV
: Dies ist der atomare Vektor, der im Wesentlichen eine Zeichenkette aller Zeichen ist, die APL erkennt, und die natürlich alle Kleinbuchstaben (Index 18 ~ 43) und Leerzeichen (Index 5) enthält⍳
:IndexOf
Funktion. Für viele Funktionen in APL, für die ein oder zwei skalare Argumente erforderlich sind, können Sie ein Array anstelle eines Skalars angeben. APL führt die Schleife für Sie aus. So⍳
gibt einen numerischen Array von Indizes..21-.31×
: Male 0,31 und subtrahiere dann von 0,21. Dies ist ein kleiner Trick, der Buchstaben auf derselben Taste (insbesondere PQRS) derselben Zahl zuordnet (wenn auf ganze Zahlen abgerundet), mit Ausnahme von Z, das seiner eigenen Gruppe zugeordnet wird¯13⌈
:max
mit -13. Dies bringt Z mit WXY zurück in die Gruppe⌊
: Auf ganze Zahlen abrunden2≠/
: Pairwise-≠
. Gibt für jedes aufeinanderfolgende Paar ein boolesches Array zurück.∧/
: UND zusammen alle Einträge des resultierenden Arrays.quelle
∧/2≠/
(alle aufeinanderfolgenden Paare werden auf verschiedenen Schlüsseln eingegeben), anstatt~∨/2=/
(kein aufeinanderfolgendes Paar wird auf demselben Schlüssel eingegeben). APL FTW !!!Perl - 44
Dies ist im Grunde eine Perl-Anpassung von @ DigitalTraumas Antwort, die mit seiner Erlaubnis veröffentlicht wurde. 2 Charaktere dank @KyleStrand abgeschnitten.
43 Zeichen + 1 für
-p
Flag.y///
ist das gleiche wietr///
. Es druckt1
für wahr und nichts für falsch. Auf Anfrage kann ich eine ausführliche Erklärung abgeben.Beispiellauf:
Perl - 81
+1 für
-n
Flagge. Es funktioniert, indem es verwendet wirdjoin
, um den regulären Ausdruck (der gleiche wie der von Martin) zu erstellen ), die Rasuren von wenigen Bytes.Beispiellauf:
quelle
a
undz
untransliterated bleiben?y/b-y/aadddgggjjjmmmpppptttzzz/;$_=!/(.)\1/
Auch Leerzeichen werden hier nicht behandelt, oder?a
und gleichz
bleiben. Aktualisierte Antwort!JavaScript -
159156 BytesGibt 1 für wahr und 0 für falsch zurück.
Wenn ich nur die Schlüsselwörter loswerden könnte.
quelle
function g(s){p=n=-1;for(i=0;i<s.length;i++){p=n;n=s.charCodeAt(i)-97;n>17&&n--;n>23&&n--;if(~p)continue;if(~(p/3)==~(n/3))return 0}return 1}
!=
die for-Schleife durch a ersetzen<
.c, 74 Bytes
Gibt einen Exit-Status ungleich Null für TRUE und 0 für FALSE zurück:
quelle
while
auf ändernfor(;c=~getchar();d=c/3)
, und ein weiteres Byte, indem Sie als erstesif
auf einen?:
Operator ändern .c=getchar()
sind jedoch erforderlich, da sie~
eine höhere Priorität haben als=
. Trotzdem nehme ich die anderen zwei Bytes :)exit(d!=c/3);
anstatt zuif(d==c/3)exit(0);
arbeiten?Ruby 1.8,
89838178 BytesHier ist eine weitere Einreichung. Zu meiner Schande schlägt es den Regex. :(
Dies nimmt die Zeichenfolge über ein Befehlszeilenargument und gibt einen Booleschen Wert aus.
Was den Algorithmus anbelangt, verschiebe ich die Buchstaben
p
nacheinander um eins und nacheinanderz
um zwei und überprüfe dann, ob es nach der Ganzzahldivision durch 3 keine Kollisionen gibt.PS: Dies ist das erste Mal, dass mit Ruby 1.8 der Code verkürzt wurde (aufgrund der kürzeren Art, Zeichencodes zu erhalten).
quelle
Cobra - 80
quelle
JavaScript (ES6) 66
74Die innere Schleife findet die Gruppe für jedes Zeichen. Konzeptionell ist eine "Verkleinerung", aber "Karte" ist kürzer. Die äußere Schleife vergleicht die Gruppe aufeinanderfolgender Zeichen und gibt false aus, wenn sie gleich sind.
Test In der Firefox / Firebug-Konsole
Ausgabe
quelle
.some
instead of every. Because even if it fails one time, the answer is falsy.some
andevery
are interchangeble, fiddling with the conditions. But here simply putsome
instead ofevery
will not work, try it.[...s].every
trick in my golfs :)Perl, 83 bytes
Making heavy abuse of $_ in Perl.
quelle
-e
in Perl, is free.) 71 characters alternative with command-line parameters:perl -nlaF -e 'map{$_=ord;$_=($_-$_/112-$_/119-1)/3;die 0 if$l==$_;$l=$_}@F;die 1'
.-l
, but it looks good!-l
as replacement forchop
. But of course, you are right.Two tasks are tricky in Python; detecting chains, and assigning the groups. Both can be assisted using numpy, but it is not in the standard library.
Python 2 (only standard library) - 59 chars function
Python 2 (only standard library) - 53 chars stdin to exit value
Here I abuse the fact that
issubclass(bool,int)
, so changingall()
toany()
gets me a valid exit value, shaving off thenot()
from the return value. The removal of function overhead made the regex versions fall behind in size.quelle
J - 42 char
Function taking string on the right.
First we map the alphabet (
u:97+i.26
) into the numbers 0 through 25, all other characters (including spaces) going to 26 (i.
). Then we map ({~
) the first three elements map to the first key, the next three to the next key, and so on through the keys of the phone pad, making sure to map the space/other punctuation to a separate key at the end. (4 3 4 1,~5#3
is equal to3 3 3 3 3 4 3 4 1
andI.
turns that into a 27-item array where the first three are key 1, etc.) Then we check for pairwise inequality (2~:/\
) and AND all the results together (*/
).quelle
Racket, 119
Ungolfed (combinatoric regexing):
quelle
JavaScript - 152
Not a winner but I gave it a shot. Beats @Lozzaaa by 4 bytes as of posting time :)
Passes all the tests.
Takes advantage of JS's lack of typing to make a multi type array, and it takes advantage of indexOf returning -1 for space support.
Usage:
Assumes lowercase alphabetic characters and spaces only. Returns 1 for true, 0 for false.
Maybe if I knew ES6 I could try the second challenge...
quelle
ES6, JavaScript
8970 charactersI know its not a winner because when coming to handy operations like getting ASCII value of character, JS puts a lot of bloat (
.charCodeAt()
).Run it in Web Console of latest Firefox.
Usage:
The function returns either true or false.
EDIT: Golfed a lot using the
[...x].every
trick learned from @edc65 (Thanks!)I will try to golf it more :)
quelle
GML (Game Maker Language), 149
quelle
Python 3 - 152 chars
Not the shortest I could go, but it'll do for now
quelle