Eine "Gizeh-Nummer", umgangssprachlich auch als Timmy-Nummer bezeichnet, ist eine beliebige Zahl, bei der die Ziffern eine Pyramide darstellen ( A134810 ). Beispiel: "12321" ist eine Gizeh-Nummer, weil sie folgendermaßen dargestellt werden kann:
3
2 2
1 1
Etwas wie "123321" ist jedoch keine Gizeh-Zahl, da sich oben in der Pyramide zwei Ziffern befinden
33
2 2
1 1
Mit anderen Worten, eine Zahl ist eine Gizeh-Zahl, wenn alle folgenden Bedingungen erfüllt sind:
Es hat eine ungerade Anzahl von Ziffern, und die mittlere Ziffer ist die größte
Es ist palindromisch (das gleiche vorwärts oder rückwärts lesen), und
Die erste Hälfte der Ziffern erhöht sich strikt um eins. (Da es palindrom sein muss, bedeutet dies, dass die zweite Hälfte der Ziffern streng um eins verringert werden muss.)
Sie müssen ein vollständiges Programm oder eine Funktion schreiben, die eine positive Ganzzahl als Eingabe verwendet, und feststellen, ob es sich um eine Gizeh-Zahl handelt oder nicht. Sie können die Eingabe als Zeichenfolge oder als Zahl annehmen. Wenn es sich um eine Gizeh-Zahl handelt, geben Sie einen Wahrheitswert aus . Ansonsten ein falscher Wert.
Es gibt insgesamt 45 Giza-Zahlen, daher sollte jede dieser Eingaben einen Wahrheitswert ergeben:
1
2
3
4
5
6
7
8
9
121
232
343
454
565
676
787
898
12321
23432
34543
45654
56765
67876
78987
1234321
2345432
3456543
4567654
5678765
6789876
123454321
234565432
345676543
456787654
567898765
12345654321
23456765432
34567876543
45678987654
1234567654321
2345678765432
3456789876543
123456787654321
234567898765432
12345678987654321
Jede andere Eingabe sollte einen falschen Wert ergeben. Natürlich müssen Sie keine ungültigen Eingaben wie nicht positive Zahlen, nicht ganze Zahlen oder nicht Zahlen verarbeiten.
Wie üblich ist dies Codegolf , so dass Standard-Schlupflöcher verboten werden und die kürzeste Antwort in Bytes gewinnt!
quelle
Antworten:
Python 2,
484746 BytesTeste es auf Ideone .
Wie es funktioniert
In Python gibt ein verketteter Vergleich nur dann True zurück, wenn alle Einzelvergleiche dasselbe tun. In diesem speziellen Fall gibt unser Lambda nur dann True zurück, wenn alle folgenden Bedingungen erfüllt sind.
s[~len(s)/2:]in'987654321'
Für einen String s der Länge 2N + 1 ,
~len(s)/2
kehrt ~ (2n + 1) / 2 = - (2n + 2) / 2 = - (n + 1) , sos[~len(s)/2:]
ergibt sich die am weitesten rechts stehenden n + 1 - Zeichen von s .Auf ähnliche Weise für eine Zeichenfolge s der Länge 2n ,
~len(s)/2
kehrt ~ (2n) / 2 = - (2n + 1) / 2 = - (n + 1) (ganzzahlige Division immer rund Richtung -∞ , sos[~len(s)/2:]
wieder ergibt die am weitesten rechts liegenden n + 1 Zeichen von sDer Vergleich gibt nur dann True zurück, wenn die am weitesten rechts stehenden n + 1 Zeichen eine Teilzeichenfolge von bilden
987654321
.Beachten Sie, dass wenn sie es tun und s hat 2n Zeichen, s kein Palindrom sein kann; Das n- te und (n + 1) -te Zeichen von rechts ist verschieden, und das letztere ist das n- te Zeichen von links.
'987654321'>s
Dies vergleicht die Saiten lexikographisch. Da 9 die einzige Gizeh-Zahl ist, die mit 9 beginnt , erfüllen alle Gizeh-Zahlen diesen Vergleich.
Beachten Sie, dass der Vergleich dieser Zeichenfolgen nicht Teil unseres Entscheidungsproblems ist.
>s
ist einfach drei Zeichen kürzer alsand s
.s==s[::-1]
Dies gibt nur dann True zurück, wenn s ein Palindrom ist.
quelle
Perl,
39374239 + 1 = 40 BytesMit einer neuen Methode gelang es mir, eine große Anzahl von Bytes zu reduzieren. Laufen Sie mit der
-n
Flagge. Akzeptiert wiederholte Eingaben zur Laufzeit und druckt entsprechend 0 oder 1.Ich musste 5 Bytes hinzufügen, weil mir klar wurde, dass der Code für Eingaben wie 1234567900987654321 funktioniert, was keine Gizeh-Nummer ist. Da Gizeh-Zahlen niemals die Ziffer 0 enthalten (und alle False Positives zwangsläufig die Ziffer 0 enthalten würden), machen diese 5 Bytes das aus.
Erläuterung:
Der Zweck des Substitutions-Regex besteht darin, einen String von 1s zu konstruieren, dessen Länge die Hälfte der Länge der Eingabe ist, aufgerundet. Eine Eingabe von
12321
erzeugt also den String111
, der dann quadriert wird (Erklärung unten). Bei Eingaben mit gerader Länge werden Zeichenfolgen erzeugt, die zu klein sind, um sicherzustellen, dass die endgültige Regex erfolgreich ist.Der Grund, warum dieser Code funktioniert, ist folgender:
Wir können deutlich sehen, dass die Anzahl der Einsen in RHS gleich 1/2 mehr als die Hälfte der Größe von LHS ist. (1 mehr, wenn wir abschneiden). Zusätzlich:
567898765 - 123454321 = 444444444, was nur 4 Wiederholungen entspricht. Wenn wir also unser Quadrat von unserer Zahl abziehen, ist unsere ursprüngliche Zahl eine Gizeh-Zahl, wenn wir eine Nachziffer erhalten.
Alter Code und alte Methode (58 + 1 = 59 Byte)
1 Byte dank @Dada gespeichert
Laufen Sie mit der
-n
Flagge und leiten Sie den Text mit einecho
Berechnet die eindeutige Giza-Nummer, die durch die Länge und die führende Ganzzahl bestimmt wird, und überprüft, ob sie mit der Eingabe übereinstimmt.
Run as
echo -n "123454321" | perl -M5.010 -n giza.pl
Gibt zurück,1
wenn es sich um eine Gizeh-Zahl handelt, andernfalls null.quelle
Jelly ,
1076 BytesGeneriert alle 45 Giza-Nummern und testet dann die Mitgliedschaft.
Probieren Sie es online! oder sehen Sie die generierten Zahlen .
Wie es funktioniert
quelle
JavaScript (ES6),
46454241 ByteNimmt Eingaben als Zeichenfolge und gibt eine einstellige Zeichenfolge für Wahr oder
0
Falsch zurück.Die Grundidee ist, nach ein paar Dingen zu suchen:
quelle
Java 7,
128 119105 BytesKeine Saiten mehr! Nun beginne ich mit der Generierung einer
111...
Zahl mit der gleichen Länge wie input (a
) und einer, die kürzer als square (b
) ist. Dann können Sieb*b
von der Eingabe subtrahieren und die Teilbarkeit durch prüfena
.c
ist nur da, um ungerade / gerade zu prüfen, es macht nichts aus> _>Leerzeichen:
Alte Methode, 119 Bytes
Durchläuft das Array und prüft, ob zwischen den einzelnen Ziffern ein Unterschied von 1 (oder -1, je nach der Hälfte) besteht. Überprüfen Sie dann einfach, ob die Länge ungerade ist.
Leerzeichen:
quelle
char[]
als Zeichenfolge gelten. Ich würde also sagen, dass sie gültig sind.05AB1E ,
98 BytesWahrheit ist 1 , falsch ist 0 .
Verwendet die CP-1252- Codierung. Probieren Sie es online!
quelle
2ä¬û¹Q
würde auch funktionieren und spart zwei Bytes.Python 2,
77, 76, 64, 63 BytesEine einfache rekursive Lösung. Prüft, ob die erste und die letzte Ziffer gleich sind und die zweite Ziffer minus eins. Dann wird geprüft, ob die Mitte auch eine Gizeh-Nummer ist. Gibt true zurück, sobald eine einzelne Ziffer erreicht ist.
Dank @Rod ein Byte gespart, dank DLosc und ETHProductions eine Tonne Bytes!
quelle
len(s)==1
mit1==len(s)
zu speichern 1 Byte auf dem Platz, auch dieand
s ersetzt werden könnte*
3 Bytes zu speichern1or
auch. (Solange es kein0
Vorgänger ist,o
denkt Python, dass es eine Oktalzahl ist.)and
mit ,*
wenn ein Kurzschluss Verhalten erforderlich ist, wie es in einer rekursiven Funktion ist. Der ersteand
sollte austauschbar sein, benötigt jedoch zwei Klammern, wodurch Einsparungen zunichte gemacht werden. (cc: @Rod)int()
Umgebung entfernens[0]
oder 2) verwendens[0]==`int(s[1])-1`
?s[-1]==s[0]==`int(s[1])-1`
(erfordert speziell Python 2).PowerShell v3 +,
14710867 ByteRadikal veränderte Herangehensweise. Erzeugt alle möglichen Giza Zahlen, und dann überprüft , ob die Eingabe
$args[0]
ist ,-in
dass Sammlung. Nachfolgend sehen Sie, wie die Sammlung der Gizeh-Zahlen gebildet wird:Beispiel läuft:
quelle
Python 3, 65 Bytes
Ich bin nicht ganz sicher, aber ich denke, das funktioniert.
quelle
0
, das können Sie entfernen :) Es gibt auch keine Zahlen, die länger als 17 sind und diese Bedingung erfüllen, sodass Sie das auch nicht benötigen. Es ist im Wesentlichen die gleiche Lösung, die Dennis hat :)Python 2,
687366 BytesMissbrauche die Tatsache, dass
11^2=121
,111^2=12321
und so weiter, ich dies berechne und1111..
genug Male als Offset hinzufüge .Beispiele:
23432=111^2+11111*1
676=11^2+111*5
quelle
f
, müssen Sie es nicht wirklich benennen. Sie können zwei Bytes sparen, indem Sief=
1234567900987654321
gibt true zurück, wenn sie false sein soll.Perl, 41 Bytes
40 Byte Code +
-p
Flags.Gibt 1 aus, wenn die Eingabe eine Giza-Nummer ist, sonst nichts. Geben Sie die Eingabe ohne letzten Zeilenumbruch ein, um sie auszuführen:
Erklärungen :
s/(.)(?=(.))/$1-$2/ge
Ersetzen Sie zuerst jede Ziffer$1
(gefolgt von$2
) durch$1-$2
. Wenn es sich um eine Gizeh-Zahl handelt, ist jede Ziffer am Anfang eine Stelle weniger als die nächste und am Ende eine weitere Stelle. Die Zeichenfolge sollte nur-1
im ersten Teil und1
im zweiten Teil enthalten sein (mit Ausnahme der letzten, die unverändert bleibt). . Das ist , was der zweite Teil/^(-1(?1)1|).$/
überprüft: Aussehen für eine-1
gefolgt von Rekursion , gefolgt von einem1
.-1 Byte dank Martin Ender.
Meine vorherige Version ist 15 Bytes länger (ganz anders, also lasse ich es hier):
quelle
|
zweiten Regex.> <> FISH
57524948 BytesEdit 1: = gibt 0 oder 1 zurück, wenn true, also ein Häkchen entfernt und diesen Wert zum Inkrementieren verwendet, dann wird die Gleichheit trotzdem überprüft. (6 Bytes gespeichert, 1 für neue Zeile verloren).
Bearbeiten Sie 2: 3 Richtungsmarkierungen entfernt und 11 in die Lücke gesetzt, um den Stapel auf eine gerade Länge zu versetzen, um false (3 Bytes gespeichert) zu erzwingen.
Edit 3: Duplizieren Sie die Länge des Stapels zum Prüfen von MOD mit 2 und len (1). Dies wurde durch zweimaliges Anlegen der Länge durchgeführt, aber dies füllte jetzt einen leeren Raum in Zeile 2 (1 Byte gespeichert).
quelle
C #,
1208610810292 BytesVolles Programm mit einigen Testfällen:
Hurra für Single-Line-Bedingungen, die jetzt die Java-Antwort schlagen :)! Ich muss auch meine ersten erklärenden Kommentare schreiben, obwohl es wahrscheinlich selbsterklärend ist. Vielen Dank an @Dada für das Auffinden eines Problems mit meinem Algorithmus (gilt für Zahlen, die wie 13631 gespiegelt wurden). Jetzt unter 100, da anscheinend die Überprüfung auf Länge% 2 überflüssig ist.
quelle
true
für Zahlen wie zurückkehren13631
? Da Sie auch einen rekursiven Aufruf von tätigenx
, müssenx=
Sie die Anzahl der Bytes berücksichtigen .Bash, 111 Bytes
AKTUALISIEREN
Beachten Sie, dass die Normalisierung von Eingabenummern möglicherweise vollständig übersprungen werden kann, wenn Sie einfach die erste Ziffer wie folgt zu Ihrer generierten GIZA- Nummer hinzufügen :
und dann einfach mit dem eingang direkt vergleichen.
Haftungsausschluss: Dieser ist nicht wirklich optimiert, daher handelt es sich eher um einen Proof of Concept als um einen echten Konkurrenten
Golf gespielt
Algorithmus
Jede GIZA- Nummer kann auf ihre kanonische Form normiert werden, indem die erste Ziffer vom Rest abgezogen wird:
und es gibt nur eine kanonische GIZA- Nummer einer bestimmten Länge.
Wenn wir das wissen, können wir leicht eine kanonische GIZA- Nummer generieren, die auf der Länge der eingegebenen Nummer basiert:
dann normalisiere die eingegebene Nummer:
und vergleichen
Prüfung
quelle
Eigentlich 22 Bytes
Probieren Sie es online!
Nimmt Eingaben in Anführungszeichen (zB
"12321"
). Die Ausgabe ist eine positive Ganzzahl für true und0
false.Erläuterung:
quelle
Haskell, 62 Bytes
Die Eingabe wird als Zeichenfolge verwendet.
Erstellt eine Liste aller Gizeh-Nummern und prüft, ob die Nummer darin enthalten ist. Die Liste wird durch Schleifen erstellt
i
durch'1'..'9'
und dannj
durch'1'..i
und die Schaffung der Elementej .. i-1 , i , i-1 .. j
.quelle
> <> 62 Bytes
Probieren Sie es online!
Gibt 1 für eine Gizeh-Nummer aus; 0 sonst. Schieben Sie die Eingabe in eine Warteschlange (technisch gesehen ein umkehrbarer Stapel) und testen Sie wiederholt beide Enden auf Gleichheit und stellen Sie sicher, dass sie genau um eins größer als der vorherige Wert sind.
quelle
CJam ,
20 bis19 BytesTestsuite.
Erläuterung
Die Grundidee besteht darin, die minimale und maximale Ziffer zu finden, dann eine Gizeh-Zahl daraus zu erstellen und dann zu überprüfen, ob sie der Eingabe entspricht.
Anstelle des Mindestzeichens können wir auch das erste Zeichen für dieselbe Bytezahl verwenden:
quelle
Mathematica,
626160 Bytes2 Bytes aufgrund von @MartinEnder gespeichert .
Zusammensetzung der Funktionen. Nimmt eine Zahl als Eingabe und gibt sie zurück
True
oderFalse
als Ausgabe.quelle
Netzhaut,
555436 BytesDie Anzahl der Bytes setzt die Kodierung nach ISO 8859-1 voraus.
Probieren Sie es online aus
Konvertieren Sie jede Ziffer in eine unäre Zahl, die durch Doppelpunkte getrennt ist. Schleife zum Entfernen übereinstimmender äußerer Ziffern, wenn die nächste Ziffer eine weitere ist. Ordnen Sie eine einzelne verbleibende Ziffer zu.
quelle
12312
PHP, 71 Bytes
Ruft die größte Ziffer von der Eingabe ab und zählt abwärts, wobei die neue Ziffer zu einer Vergleichszeichenfolge hinzugefügt wird, bis Eingabe und Vergleichszeichenfolge gleich sind - oder
$i
ist0
.druckt die niedrigste Ziffer für eine Timmy-Nummer,
0
sonst.quelle
Aufdringlich ,
3015 BytesIch bin heute Morgen aufgewacht und habe gemerkt, dass ich die Hälfte meiner Antwort haben könnte ...
(Nicht konkurrierend, da die Sprache nach dem Termin eine Herausforderung darstellt)
Die Eingabe wird in der Befehlszeile angegeben:
$ pushy gizas.pshy 3456543
. Ausgänge1
für wahr und0
für falsch. Hier ist die Aufteilung:Der Algorithmus wurde von der Bash-Antwort inspiriert: Zuerst die Zahl normalisieren (
45654 -> 01210
), dann die normalisierte Giza-Zahl der gleichen Länge generieren (es gibt nur eine) und vergleichen.Alte Lösung
quelle
Schläger 292 Bytes
Ungolfed:
Testen:
Ausgabe:
quelle
Java 8, 162 + 19 Bytes
19 für
import java.util.*;
Anders als bei der anderen Java-Antwort wollte ich versuchen, alle möglichen Timmy-Zahlen zu erstellen und zu überprüfen, ob unsere Zeichenfolge in ihnen enthalten war.
quelle
Oktave, 56 Bytes
Schauen Sie sich alle Testfälle hier .
Dies wären in MATLAB zwei Bytes weniger, da dies
diff(n)
für Zeichenfolgen funktioniert. In Octave brauchen Siediff(+n)
.Erläuterung:
quelle
Mathematica, 56 Bytes
Das ist etwas kürzer:
quelle
Java 7,
129 119109 BytesAlte rekursive Methode, 119
-10 Bytes dank Geobits. Wir
sindgebunden waren ...Probieren Sie es online!
quelle
and
, ich denke, Sie haben es einmal verwendet, aber nicht das andere Mal? Oder ich lese es falsch.java.util.Arrays.copyOfRange(...)
die Importzeile mit überspringen.Perl 6 ,
4334 BytesVielen Dank an Jo King für -9 Bytes.
Portierung der Perl-Lösung von Gabriel Benamy .
Probieren Sie es online!
quelle
Cjam, 35 Bytes
Wahrscheinlich sehr suboptimal ... Ich bin ein wenig außer Übung!
Probieren Sie es online!
quelle
Python 2,
50828180 BytesEinfacher Ansatz. Teilen Sie die Zeichenfolge einfach in zwei Hälften auf (ohne das mittlere Zeichen oder eins nach dem mittleren Zeichen, wenn es gerade ist), kehren Sie die zweite Hälfte um, vergleichen Sie die beiden und vergleichen Sie die erste Hälfte mit einer Zeichenfolge von 1 bis 9.
Bearbeiten
Reposted nach konstruktivem Feedback von anderen Golfern und dem Erkennen und Korrigieren meiner Fehler.
-1 für den Verlust eines (verschwendeten) Platzes
-1 für das erneute Lesen der Frage und das Erkennen, dass wir 0 nicht berücksichtigen müssen. Muss nach einem langen Arbeitstag unbedingt aufhören zu golfen.
quelle
13531
und6543456
beide falsch True zurück.'0'
und'1'
sind beide wahr.