Utilisateur de PPCG et élu mod, @Dennis vient de devenir le deuxième utilisateur à gagner plus de 100 000 reps!
C'est une idée totalement originale, que je n'ai reçue de personne d'autre , mais faisons un défi à partir de son identifiant, 12012
en hommage!
En le regardant, vous remarquerez qu'il y a deux "sections" distinctes à son identifiant.
12
et
012
Ces deux sections totalisent un 3. C'est une propriété assez intéressante.
Définissons un "nombre de Dennis 2.0" comme tout entier positif où chaque sous-séquence maximale de chiffres strictement croissants est la somme du même nombre. Par exemple,
123
est un numéro Dennis 2.0 car il n’existe qu’une sous-liste maximale de chiffres strictement croissants et s’élève à 6. En outre, 2 846 145 est également un numéro Dennis 2.0, car les trois sous-listes maximales de chiffres croissants, à savoir
28
46
145
Tout somme à 10
. De plus, les nombres qui ne font que répéter le même chiffre doivent être des chiffres de Dennis 2.0, car ils 777
peuvent , par exemple, être divisés en deux.
7
7
7
qui clairement tout somme à sept.
Un nombre tel que 42
n'est pas un nombre de Dennis 2.0, car il est divisé en
4
2
qui ne correspondent clairement pas au même nombre.
Le défi
Vous devez écrire un programme ou une fonction pour déterminer si un nombre donné est un nombre de Dennis 2.0 ou non. Vous pouvez utiliser les entrées et les sorties dans tous les formats possibles, par exemple sous forme de chaîne, sous forme de nombre, à partir d'un fichier, d'arguments / de fonctions, depuis STDIN / STDOUT, etc., puis de renvoyer une valeur de vérité si ce nombre est un Dennis 2.0. nombre, et une valeur de fausseté si ce n'est pas. Pour référence, voici chaque numéro de Dennis 2.0 jusqu'à 1 000:
1
2
3
4
5
6
7
8
9
11
12
13
14
15
16
17
18
19
22
23
24
25
26
27
28
29
33
34
35
36
37
38
39
44
45
46
47
48
49
55
56
57
58
59
66
67
68
69
77
78
79
88
89
99
101
111
123
124
125
126
127
128
129
134
135
136
137
138
139
145
146
147
148
149
156
157
158
159
167
168
169
178
179
189
202
222
234
235
236
237
238
239
245
246
247
248
249
256
257
258
259
267
268
269
278
279
289
303
312
333
345
346
347
348
349
356
357
358
359
367
368
369
378
379
389
404
413
444
456
457
458
459
467
468
469
478
479
489
505
514
523
555
567
568
569
578
579
589
606
615
624
666
678
679
689
707
716
725
734
777
789
808
817
826
835
888
909
918
927
936
945
999
Les failles standard s'appliquent et la réponse la plus courte mesurée en octets est gagnante!
la source
1236|6
,
entre eux? Ceci est probablement en train de l'étirer beaucoup.Réponses:
Gelée,
13 à12 octets1 octet grâce à @Dennis.
Essayez-le en ligne!
Explication
la source
JavaScript (ES6),
7270 octetsPrend une chaîne en entrée. Retourne false ou une valeur de vérité (qui peut être un nombre).
Il utilise une expression régulière pour transformer une chaîne d'entrée telle que
"2846145"
:Puis appelle
eval()
cette expression.la source
2011
fractionnement2 / 01 / 1
n'est pas un nombre D2.0. En ce qui concerne189
, c'est un nombre D2.0 et18
une valeur de vérité.Python, 50 octets
S'attend
input()
à être évalué à une chaîne. L'entrée doit donc contenir des guillemets en Python 2. La sortie s'effectue via le code de sortie , où 0 indique le succès (vérité) et 1, un échec (falsy).Testez-le sur Ideone .
Comment ça fonctionne
Nous initialisons r avec la chaîne 0 et parcourons tous les chiffres d de l’entrée.
Si d est plus grand que le premier chiffre de r (initialement 0 , alors égal à la valeur précédente de d ), est
r<d
évalué à True et'=+'[r<d]*2
donne++
.Si d est inférieur au premier chiffre de r ,
'=+'[r<d]*2
donne==
.Si d est égal au premier chiffre de r , r sera plus long que la chaîne singleton d , donc
'=+'[r<d]*2
cède encore une fois==
.Dans tous les cas, le chiffre d et les deux caractères générés sont préfixés à r .
Une fois que tous les chiffres saisis ont été traités,
eval(r)
évalue l'expression générée.Si l'entrée consiste en une seule séquence strictement croissante de chiffres (positifs), l'expression est évaluée à leur somme.
Par exemple, le nombre entier 12345 donne l'expression
5++4++3++2++1++0
, ce qui donne 15 lorsqu'elle est évaluée. Notez que chaque seconde + est un plus unaire , elle n’affecte donc pas le résultat. La division de 1 sur 15 est valide (le résultat n'est pas important); le programme se termine normalement.Si l'entrée consiste en deux séquences de chiffres strictement croissantes, l'expression consiste en une simple comparaison.
Par exemple, l'entier 12012 donne l'expression
2++1++0==2++1++0
, ce qui donne True lorsqu'il est évalué, car les deux termes ont la somme 3 . La division de 1 par True ( 1 ) est valide (le résultat n'est pas important); le programme se termine normalement.D'autre part, le nombre entier 12366 donne l'expression
6==6++3++2++1++0
, ce qui donne Faux lors de l'évaluation car les termes ont les sommes 6 et 12 . La division de 1 par False ( 0 ) génère une erreur ZeroDivisionError ; le programme se termine avec une erreur.Si l'entrée consiste en trois séquences de chiffres strictement croissantes ou plus, l'expression consiste en une comparaison chaînée , qui renvoie True si et seulement si toutes les comparaisons impliquées renvoient True .
Par exemple, le nombre entier 94536 donne l'expression
6++3==5++4==9++0
, ce qui donne True lorsqu'il est évalué car tous les termes ont la somme 9 . Comme auparavant, le programme se termine normalement.D'autre part, le nombre entier 17263 donne l'expression
3==6++2==7++1++0
, ce qui donne Faux lors de l'évaluation car les termes ont les sommes 3 , 8 et 8 . Comme auparavant, le programme se termine avec une erreur.la source
Brachylog , 13 octets
Essayez-le en ligne!
Explication
~c
sera unifié avec les plus grandes sous-listes en premier.la source
Pyke, 18 octets
Essayez-le ici!
la source
PowerShell v2 +,
1006461 octetsUne ligne littérale, car il s’agit d’un seul pipeline. Prend l'entrée sous forme de chaîne
$args[0]
. Boucle à travers elle sous forme dechar
tableau, chaque itération plaçant l'élément actuel avec un devant+
ou-eq
devant lui sur le pipeline en fonction du fait que la valeur actuelle est-l
essentielle ou non par rapporte
à la valeur précédente$i
. Ces chaînes sont-join
éditées ensemble et dirigées versiex
(raccourci pourInvoke-Expression
et similaire àeval
. Par exemple, pour l’entrée,2846145
cela sera évalué comme+2+8-eq4+6-eq1+4+5
, ce qui estTrue
.Ce booléen est laissé sur le pipeline et
True
/False
est écrit implicitement à l'achèvement du programme.NB: pour une entrée à un chiffre, le chiffre obtenu est laissé sur le pipeline, ce qui correspond à la valeur de vérité de PowerShell.
Exemples
la source
GNU sed 217 ou 115
Les deux incluent +1 pour -r
217:
Prend les entrées en décimal normal
Essayez-le en ligne!
115:
Prend la saisie sous forme de liste de chiffres numérotés séparés par des virgules. par exemple
123
serait1,11,111
Essayez-le en ligne!
la source
Perl, 38 + 3 (
-p
) = 41 octets-9 octets grâce à @Ton Hospel !
Comme il existe un
$'
, le code doit être dans un fichier à exécuter. Donc,-p
compte pour 3 octets. Les sorties 1 si le nombre est un nombre de Dennis 2.0 ou une chaîne vide sinon:la source
s%.%2x$&.($&.O ge$')%eg;$_=/^(2+1)\1*$/
avec l'-p
option (+3 car le code l'a$'
)A
est bien meilleur! Merci! Je ne comprends pas ce.O
que c'est ... Sans cela, cela échoue dans certains cas, mais je ne vois pas pourquoi.$'
est le chiffre suivant et tous ceux qui suivent. Donc, par exemple ,778
il se compare7
à78
laquellelt
ressemble une séquence montante. LesO
pauses qui se comparent7O
à78
(rien ci-dessus9
dans les œuvres ASCII)$' or $
`à la place de mes groupes de capture, mais je ne l'ai pas trouvé, à cause de cela" et de tous ceux qui suivront ". Merci pour le conseil!~$&le~$'
devrait être plus courteJavaScript (ES6),
666563 octets2 octets sauvés grâce à @ edc65
Prend l'entrée sous forme de chaîne. Ancienne version (ne fonctionne que dans Firefox 30+):
la source
[...x,0]
->[...x,p=t=z=0]
Mathematica, 38 octets
Fonction anonyme. Prend un nombre en entrée et renvoie
True
ouFalse
en sortie.la source
Brachylog 2, 10 octets, langue postdates challenge
Essayez-le en ligne!
C’est fondamentalement le même algorithme que la réponse de @ Fatalize (que je n’ai pas vue avant d’avoir écrit cela), mais qui a été quelque peu réorganisé pour le rendre plus golfeur sous la syntaxe de Brachylog 2.
C'est un programme complet, renvoyant
false.
s'il ne s'agit pas d'un numéro Dennis 2.0 outrue
s'il l'est.Explication
Comme d'habitude pour un programme complet de Brachylog, si toutes les affirmations peuvent être satisfaites simultanément, nous aurons un retour de vérité, sinon Falsey. L'ordre par défaut
~c
consiste à trier les partitions avec des éléments moins nombreux et les plus longs en premier. Dans Prolog (donc Brachylog), l'ordre par défaut est défini par le premier prédicat du programme (en utilisant le second comme condition de départage, etc.; ici,~c
domine, carẹ
est déterministe et n’a donc rien à commander).la source
MATL,
2423201816 octetsRetourne une truthy de Falsey matrice
Essayez-le en ligne!
Aussi, félicitations @Dennis!
Explication
la source
&=
!PHP,
10810592 octetsprend en charge l'argument, sort avec
0
pour numéro Dennis-2.0, avec1
else.panne
la source
05AB1E , 18 octets
Explication
N = 12012
utilisé comme exemple.Essayez-le en ligne!
la source
Ruby 2.3, 56 octets
Ce n’est certainement pas la façon la plus risquée de faire cela, mais cela présente quelques fonctionnalités intéressantes.
(Pas de tolérance à la nouvelle ligne, alors lancez comme
ruby dennis2.rb <<< '12012'
)la source
PHP, 144 octets
Je suis sûr qu'il existe un moyen beaucoup plus intelligent (et plus court) de le faire, mais cela ira pour le moment.
la source
Python 2, 69 octets
Prend l'entrée sous forme de chaîne.
Explication:
ex
1201212012
Conversion en liste de sommes:
1+2,0+1+2,1+2,0+1+2,
Evals et convertit à définir.
set([3])
Si la longueur de l'ensemble est 1, toutes les sommes sont identiques.
la source
JavaScript (ES6), 58
Appliquer mon conseil rarement utile https://codegolf.stackexchange.com/a/49967/21348
Il analyse le caractère de chaîne par caractère en identifiant une série de caractères ascendants. À la fin de chaque rhum, il vérifie si la somme est toujours la même.
Tester
la source
Pyth , 20 octets
Deux versions
Essayez le premier en ligne!
Essayez le second en ligne!
la source
Rubis,
11710585 octetsCela renverrait l'entier de ce numéro dennis ou
nil
s'il n'était pas un numéro dennis. Tous les entiers seront considérés comme vrais dans Ruby etnil
sont également considérés comme faux.i
est le nombre entier en cours de vérification.La troisième version revient réellement
true
etfalse
.PS a testé pour renvoyer 172 nombres entiers compris entre 1 et 1 000, comme indiqué dans la réponse.
la source
APL, 23 octets
Explication:
N←⍎¨⍕⍵
: obtenir les chiffres individuels dans l'entrée, enregistrer dansN
N⊂⍨1,2>/N
: trouver les sous-listes de nombres strictement croissants dansN
+/↑
: somme chaque sous-liste1=≢∪
: voir si la liste résultante n'a qu'un seul élément uniquela source
Ajouter ++ , 109 octets
Essayez-le en ligne!
Comment ça fonctionne
€
[1 2 0 1 2 2]
la source