Un "numéro de Giza", également appelé familièrement un numéro de Timmy, est un nombre quelconque où les chiffres représentent une pyramide ( A134810 ). Par exemple, "12321" est un nombre giza car il peut être visualisé comme ceci:
3
2 2
1 1
Cependant, quelque chose comme "123321" n'est pas un nombre de Giza, car il y a deux chiffres en haut de la pyramide.
33
2 2
1 1
En d'autres termes, un nombre est un nombre de Giza si toutes les conditions suivantes sont remplies:
Il a un nombre impair de chiffres et le chiffre du centre est le plus grand
C'est palindromique (la même lecture en avant ou en arrière), et
La première moitié des chiffres augmente strictement de un. (Puisqu'il doit être palindrome, cela signifie que la deuxième moitié des chiffres doit être strictement décroissante d'un)
Vous devez écrire un programme complet ou une fonction prenant un entier positif en entrée et déterminer s'il s'agit d'un nombre de Giza ou non. Vous pouvez prendre l’entrée sous forme de chaîne ou de nombre. S'il s'agit d' un nombre de Gizeh, indiquez une valeur de vérité . Sinon, une valeur de fausseté.
Il y a un total de 45 nombres de Giza, donc l'une quelconque de ces entrées doit donner une valeur de vérité:
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
Toute autre entrée doit donner une valeur de fausseté. Bien entendu, vous n'avez pas à gérer des entrées non valides, telles que des nombres non positifs, des nombres entiers ou des nombres.
Comme d'habitude, c'est du code-golf , donc les échappatoires standard sont interdites, et la réponse la plus courte en octets est gagnante!
la source
Réponses:
Python 2,
484746 octetsTestez-le sur Ideone .
Comment ça marche
En Python, une comparaison chaînée renvoie True si et seulement si toutes les comparaisons individuelles font la même chose. Dans ce cas particulier, notre lambda renvoie True si et seulement si toutes les conditions suivantes sont remplies.
s[~len(s)/2:]in'987654321'
Pour une chaîne s de longueur 2n + 1 ,
~len(s)/2
retourne ~ (2n + 1) / 2 = - (2n + 2) / 2 = - (n + 1) ,s[~len(s)/2:]
donne donc les n + 1 caractères les plus à droite de s .De même, pour une chaîne s de longueur 2n ,
~len(s)/2
retourne ~ (2n) / 2 = - (2n + 1) / 2 = - (n + 1) (la division entière toujours arrondie vers -∞ , de sortes[~len(s)/2:]
qu'une fois de plus, on obtient le n + le plus à droite 1 caractères de sLa comparaison renvoie True si et seulement si les n + 1 caractères les plus à droite forment une sous-chaîne de
987654321
.Notez que s'ils le font et que s a 2n caractères, s ne peut pas être un palindrome; la n ième et (n + 1) ième caractère de droite soient distinctes, et celui - ci est le n ième caractère de gauche.
'987654321'>s
Ceci compare les chaînes lexicographiquement. Comme 9 est le seul numéro de Gizeh commençant par 9 , tous les nombres de Gizeh satisfont à cette comparaison.
Notez que la comparaison de ces chaînes ne fait pas partie de notre problème de décision;
>s
est simplement trois caractères plus court queand s
.s==s[::-1]
Cela renvoie True si et seulement si s est un palindrome.
la source
Perl,
39374239 + 1 = 40 octetsEn utilisant une nouvelle méthode, j'ai réussi à réduire un très grand nombre d'octets. Courez avec le
-n
drapeau. Accepte les entrées à plusieurs reprises au moment de l'exécution, en imprimant 0 ou 1 en conséquence.J'ai dû ajouter 5 octets parce que je réalisais que sans cela, le code fonctionnait pour des entrées telles que 1234567900987654321, qui n'est pas un nombre de Giza. Puisque les nombres de Giza ne contiennent jamais le chiffre 0 (et tous les faux positifs devraient nécessairement contenir le chiffre 0), ces 5 octets en tiennent compte.
Explication:
Le but de la regex de substitution est de construire une chaîne de 1 dont la longueur est la moitié de la longueur de l'entrée, arrondie à la fin. Ainsi, une entrée de
12321
produira la chaîne111
, qui sera alors quadrillée (explication ci-dessous). Les entrées de longueur égale produiront des chaînes trop petites pour assurer la regex finale.Ce code fonctionne pour les raisons suivantes:
Nous pouvons clairement voir que le nombre de 1 dans RHS est égal à 1/2 plus de la moitié de la taille de LHS. (1 de plus si on tronque). Aditionellement:
567898765 - 123454321 = 444444444, ce qui ne fait que répéter. Ainsi, lorsque nous soustrayons notre carré de notre nombre, si nous obtenons un repdigit, notre numéro d'origine est un nombre de Giza.
Ancien code et ancienne méthode (58 + 1 = 59 octets)
Enregistré 1 octet grâce à @Dada
Exécuter avec le
-n
drapeau, le texte de pipe en utilisantecho
Calcule le nombre unique de giza déterminé par la longueur et le premier nombre, et vérifie s'il correspond à l'entrée.
Run as
echo -n "123454321" | perl -M5.010 -n giza.pl
Returns1
si c'est un nombre de Giza, null sinon.la source
Gelée ,
1076 octetsGénère les 45 numéros de Giza, puis teste son appartenance.
Essayez-le en ligne! ou voir les nombres générés .
Comment ça marche
la source
JavaScript (ES6),
46454241 octetsPrend les entrées sous forme de chaîne et renvoie une chaîne à un chiffre pour vérité,
0
pour fausseté.L'idée de base est de vérifier quelques points:
la source
Java 7,
128 119105 octetsPas plus de ficelles! Donc, maintenant je commence par générer un
111...
nombre de la même longueur que input (a
), et un plus court en square (b
). Ensuite, vous pouvez soustraireb*b
de l’entrée et vérifier la divisibilité para
.c
est juste là pour vérifier impair / pair, payez-le sans souci> _>Whitespaced:
Méthode ancienne, 119 octets
Parcourt le tableau en vérifiant la différence de 1 (ou -1, selon la moitié) entre chaque chiffre. Il suffit ensuite de vérifier que la longueur est impaire.
Whitespaced:
la source
char[]
compte ici comme une chaîne , alors je dirais que c'est valide.05AB1E ,
9 à8 octetsLa vérité est 1 , la fausseté est 0 .
Utilise le codage CP-1252 . Essayez-le en ligne!
la source
2ä¬û¹Q
cela fonctionnerait aussi bien et économiser deux octets.Python 2,
77, 76, 64, 63 octetsUne solution récursive simple. Vérifie si les premier et dernier chiffres sont égaux et le deuxième chiffre moins un. Puis vérifie si le milieu est aussi un numéro de Giza. Renvoie true une fois qu'il est passé à un chiffre.
Un octet enregistré grâce à @Rod, un tonne d'octets sauvegardée grâce à DLosc et ETHProductions!
la source
len(s)==1
avec1==len(s)
pour économiser 1 octet sur l'espace, aussi, leand
s pourrait être remplacé par*
pour économiser 3 octets1or
marche aussi. (Tant que ce n'est pas un0
précédent leo
--then Python pense que c'est un nombre octal.)and
par*
lorsqu'un comportement de court-circuit est requis, comme dans une fonction récursive. Le premierand
doit être remplaçable, mais il nécessite deux jeux de parenthèses, ce qui annule toute économie. (cc: @Rod)int()
autours[0]
ou 2) l' utilisations[0]==`int(s[1])-1`
?s[-1]==s[0]==`int(s[1])-1`
(nécessite Python 2 en particulier).PowerShell v3 +,
14710867 octetsApproche radicalement changée. Génère tous les nombres possibles de Giza, puis vérifie si l'entrée
$args[0]
est-in
cette collection. Voici comment se forme la collection de nombres de Giza:Exemple fonctionne:
la source
Python 3, 65 octets
Je ne suis pas tout à fait sûr, mais je pense que cela fonctionne.
la source
0
pouvez pas supprimer cela des chiffres commençant par Giza :) Il n'y aura pas non plus de chiffres de plus de 17 qui répondent à cette condition, vous n'avez donc pas besoin de cela. C'est essentiellement la même solution que Dennis a :)Python 2,
687366 octetsen abusant du fait que
11^2=121
,111^2=12321
et ainsi de suite, je calcule cela et ajoute1111..
suffisamment de temps pour compenser.Exemples:
23432=111^2+11111*1
676=11^2+111*5
la source
f
, vous n'avez pas besoin de le nommer. Vous pouvez économiser deux octets en supprimantf=
1234567900987654321
renvoie vrai, alors que cela devrait être faux.Perl, 41 octets
40 octets de code +
-p
drapeaux.Les sorties 1 si l’entrée est un nombre de Giza, rien sinon. Fournissez l'entrée sans nouvelle ligne finale pour l'exécuter:
Explications :
s/(.)(?=(.))/$1-$2/ge
remplacez d’abord chaque chiffre$1
(suivi de$2
) par$1-$2
. S'il s'agit d'un numéro de Gizeh, chacun des chiffres représentant un chiffre inférieur de moins au début et un chiffre supplémentaire à la fin, la chaîne ne doit contenir que-1
la première partie et1
la seconde (sauf la dernière qui reste inchangée). . C’est ce que la deuxième partie/^(-1(?1)1|).$/
vérifie: recherche d’un-1
suivi de récursivité suivi d’un1
.-1 octet grâce à Martin Ender.
Ma version précédente plus longue de 15 octets (assez différente donc je vais le laisser ici):
la source
|
la deuxième expression régulière.> <> POISSON
57524948 octetsEdit 1: = renvoie 0 ou 1 si true, supprime donc une vérification et utilise cette valeur pour incrémenter, puis il vérifie l’égalité après tout de même. (sauvegardé 6 octets, perdu 1 pour la nouvelle ligne).
Éditez 2: 3 marqueurs directionnels ont été retirés et 11 placés dans l’espace pour décaler la pile sur une longueur égale afin de forcer la valeur false (3 octets enregistrés).,
Edit 3: dupliquez la longueur de la pile pour vérifier MOD par 2 et len (1), cela a été fait en mettant la longueur deux fois auparavant, mais cela remplit maintenant un espace vide sur la ligne 2 (1 octet enregistré).
la source
C #,
1208610810292 octetsProgramme complet avec quelques cas de test:
Hourra pour les conditionnels simple ligne, battant maintenant la réponse Java :)! Je dois également écrire mes premiers commentaires explicatifs, même s’il s’agit probablement d’explications. Merci à @Dada pour avoir trouvé un problème avec mon algorithme (c'était vrai pour les nombres en miroir comme 13631). À présent, la valeur inférieure à 100, car apparemment la vérification de la longueur% 2 est redondante.
la source
true
pour des chiffres comme13631
? De plus, puisque vous passez un appel récursif àx
, je pense que vous devez inclurex=
votre nombre d'octets.Bash, 111 octets
MISE À JOUR
Notez que la normalisation du nombre d'entrée peut probablement être complètement ignorée, si vous ajoutez simplement le premier chiffre à votre numéro GIZA généré , comme ceci:
et puis juste le comparer avec l'entrée directement.
Avertissement: celui-ci n'est pas vraiment optimisé, il s'agit donc davantage d'une preuve de concept que d'un véritable concurrent
Golfé
Algorithme
Tout numéro GIZA peut être normalisé sous sa forme canonique, en soustrayant son premier chiffre du reste:
et il n'y a qu'un seul GIZA canonique numéro d’une longueur donnée.
Sachant cela, nous pouvons facilement générer un nombre canonique GIZA en fonction de la longueur du nombre entré:
puis normaliser le nombre saisi:
et comparer
Tester
la source
En fait , 22 octets
Essayez-le en ligne!
Prend l'entrée en tant que chaîne entre guillemets (par exemple
"12321"
). La sortie est un entier positif pour true, et0
pour false.Explication:
la source
Haskell, 62 octets
L'entrée est prise comme une chaîne.
Crée une liste de tous les numéros de Giza et vérifie si le numéro y est indiqué. La liste est créée en
i
passant en boucle'1'..'9'
puisj
en'1'..i
créant les élémentsj .. i-1 , i , i-1 .. j
.la source
> <> , 62 octets
Essayez-le en ligne!
Sorties 1 pour un numéro de Giza; 0 sinon. Fonctionne en poussant l'entrée dans une file d'attente (ok, techniquement une pile réversible) et en testant à plusieurs reprises l'égalité, tout en s'assurant qu'elles sont exactement supérieures à la valeur précédente.
la source
CJam ,
2019 octetsSuite de tests.
Explication
L'idée de base est de trouver les chiffres minimum et maximum, puis de créer un nombre de Gizeh à partir de ceux-ci et de vérifier qu'il correspond bien à la saisie.
Au lieu du caractère minimum, nous pouvons également utiliser le premier caractère, pour le même nombre d'octets:
la source
Mathematica,
626160 octets2 octets enregistrés en raison de @MartinEnder .
Composition des fonctions. Prend un nombre en entrée et retourne
True
ouFalse
en sortie.la source
Retina,
555436 octetsLe nombre d'octets suppose un codage ISO 8859-1.
Essayez-le en ligne
Convertissez chaque chiffre en unaire, séparé par des deux points. Boucle, en supprimant les chiffres externes correspondants si le prochain chiffre est un. Correspond à un seul chiffre restant.
la source
12312
PHP, 71 octets
récupère le chiffre le plus élevé de l'entrée et décompte, en ajoutant le nouveau chiffre à une chaîne de comparaison jusqu'à ce que l'entrée et la chaîne de comparaison soient égales - ou
$i
soit0
.imprime le chiffre le plus bas pour un numéro Timmy,
0
sinon.la source
Pushy ,
3015 octetsJe me suis réveillé ce matin et je me suis rendu compte que je pouvais faire la moitié de la longueur de ma réponse ...
(non concurrente car le défi linguistique postdates)
Entrée est donnée sur la ligne de commande:
$ pushy gizas.pshy 3456543
. Sorties1
pour la vérité et0
pour la fausseté. Voici la ventilation:L'algorithme a été inspiré par la réponse bash: normalisez d'abord le nombre (
45654 -> 01210
), puis générez le nombre giza normalisé de la même longueur (il n'y en a qu'un) et comparez.Ancienne solution
la source
Raquette 292 octets
Ungolfed:
Essai:
Sortie:
la source
Java 8, 162 + 19 octets
19 pour
import java.util.*;
Une approche différente de l'autre réponse Java, je voulais essayer d'utiliser la méthode de création de tous les nombres possibles de Timmy et de vérifier si notre chaîne y était contenue.
la source
Octave, 56 octets
Découvrez tous les cas de test ici .
Ce serait deux octets de moins dans MATLAB, car cela
diff(n)
fonctionne pour les chaînes. Dans Octave, vous avez besoindiff(+n)
.Explication:
la source
Mathematica, 56 octets
C'est un peu plus court:
la source
Java 7,
129 119109 octetsAncienne méthode récursive, 119
-10 octets grâce à Geobits. Nous
sommesliésEssayez-le en ligne!
la source
and
, je pense que vous l'avez utilisé une fois mais pas l'autre fois? Ou je le lis mal.java.util.Arrays.copyOfRange(...)
to skip the import line.Perl 6,
4334 bytesThanks to Jo King for -9 bytes.
Port of Gabriel Benamy's Perl solution.
Try it online!
la source
Cjam, 35 bytes
Probably very suboptimal... I'm a little out of practice!
Try it online!
la source
Python 2,
50828180 bytesSimple approach. Just splits the string in half (missing out the middle character or one after the middle character if it is of even length), reverses the second half then compares the two and compares the first half with a string of 1 to 9.
Edit
Reposted after constructive feedback from fellow golfers and realising and correcting my mistakes.
-1 for losing a (waste of) space
-1 for reading the question again and realising that we don't need to take 0 into account. Really must stop golfing after a long day at work.
la source
13531
, and6543456
both incorrectly return True.'0'
and'1'
are both truthy.