Usuario PPCG y mod elegido, @Dennis se convirtió en el segundo usuario en ganar más de 100k rep.
Esta es una idea totalmente original, que no obtuve de nadie más , ¡pero hagamos un desafío basado en su ID de usuario, 12012
como tributo!
Al mirarlo, notará que hay dos "secciones" distintas en su ID.
12
y
012
Ambas secciones suman un 3. Esa es una propiedad bastante interesante.
Definamos un "número Dennis 2.0" como cualquier número entero positivo donde cada subsecuencia máxima de dígitos estrictamente crecientes suma al mismo número. Por ejemplo,
123
es un número de Dennis 2.0 porque solo hay una sublista máxima de dígitos estrictamente crecientes, y suma 6. Además, 2.846.145 también es un número de Dennis 2.0 porque las tres sublistas máximas de dígitos crecientes, a saber
28
46
145
Todo suma a 10
. Además, los números que solo repiten el mismo dígito deben ser números de Dennis 2.0 porque, por ejemplo, 777
se pueden dividir en
7
7
7
que claramente todos suman siete.
Un número como no42
es un número Dennis 2.0, ya que se divide en
4
2
que claramente no suman el mismo número.
El reto
Debe escribir un programa o función para determinar si un número dado es un número Dennis 2.0 o no. Puede tomar entradas y salidas en cualquier formato de entrada razonable, por ejemplo, como una cadena, como un número, de un archivo, argumentos de función / retorno, de STDIN / STDOUT, etc. y luego devolver un valor verdadero si este número es un Dennis 2.0 número y un valor falso si no lo es. Como referencia, aquí está cada número Dennis 2.0 hasta 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
Se aplican las lagunas estándar, ¡y gana la respuesta más corta medida en bytes!
fuente
1236|6
,
entre ellos? Esto probablemente lo está estirando mucho.Respuestas:
Jalea,
1312 bytes1 byte gracias a @Dennis.
Pruébalo en línea!
Explicación
fuente
JavaScript (ES6),
7270 bytesToma una cadena como entrada. Devuelve un valor falso o verdadero (que puede ser un número).
Está utilizando una expresión regular para transformar una cadena de entrada como
"2846145"
en:Luego invoca
eval()
esta expresión.fuente
2011
divide como2 / 01 / 1
y no es un número D2.0. En cuanto a189
, es un número D2.0 y18
es un valor verdadero.Python, 50 bytes
Espera
input()
evaluar a una cadena, por lo que la entrada necesita comillas circundantes en Python 2. La salida es a través del código de salida , donde 0 indica éxito (verdad) y 1 indica falla (falsedad).Pruébalo en Ideone .
Cómo funciona
Inicializamos r en la cadena 0 e iteramos sobre todos los dígitos d en la entrada.
Si d es mayor que el primer dígito de r (inicialmente 0 , luego igual al valor anterior de d ), se
r<d
evalúa como Verdadero y'=+'[r<d]*2
produce++
.Si d es menor que el primer dígito de r , los
'=+'[r<d]*2
rendimientos==
.Si d es igual al primer dígito de r , r será más largo que la cadena de un solo tono d , por lo que se
'=+'[r<d]*2
obtiene una vez más==
.En todos los casos, el dígito d y los dos caracteres generados se anteponen a r .
Una vez que se han procesado todos los dígitos de entrada,
eval(r)
evalúa la expresión generada.Si la entrada consiste en una única secuencia estrictamente creciente de dígitos (positivos), la expresión se evalúa como su suma.
Por ejemplo, el entero 12345 da como resultado la expresión
5++4++3++2++1++0
, que produce 15 cuando se evalúa. Tenga en cuenta que cada segundo + es un plus unario , por lo que no afecta el resultado. Dividir 1 entre 15 es válido (el resultado no es importante); el programa sale normalmente.Si la entrada consta de dos secuencias estrictamente crecientes de dígitos, la expresión consiste en una comparación simple.
Por ejemplo, el entero 12012 da como resultado la expresión
2++1++0==2++1++0
, que produce Verdadero cuando se evalúa ya que ambos términos tienen suma 3 . Dividir 1 entre Verdadero ( 1 ) es válido (el resultado no es importante); el programa sale normalmente.Por otro lado, el entero 12366 da como resultado la expresión
6==6++3++2++1++0
, que produce False cuando se evalúa ya que los términos tienen las sumas 6 y 12 . Dividir 1 por False ( 0 ) genera un ZeroDivisionError ; el programa sale con un error.Si la entrada consta de tres o más secuencias de dígitos estrictamente crecientes, la expresión consiste en una comparación encadenada , que devuelve True si y solo si todas las comparaciones involucradas devuelven True .
Por ejemplo, el entero 94536 da como resultado la expresión
6++3==5++4==9++0
, que produce Verdadero cuando se evalúa ya que todos los términos tienen la suma 9 . Como antes, el programa sale normalmente.Por otro lado, el entero 17263 da como resultado la expresión
3==6++2==7++1++0
, que produce False cuando se evalúa ya que los términos tienen sumas 3 , 8 y 8 . Como antes, el programa sale con un error.fuente
Brachylog , 13 bytes
Pruébalo en línea!
Explicación
~c
se unificará con las sublistas más grandes primero.fuente
Pyke, 18 bytes
Pruébalo aquí!
fuente
PowerShell v2 +,
1006461 bytesUna línea literal, ya que esta es toda una tubería. Toma la entrada como una cadena
$args[0]
. Lo recorre en bucle como unachar
matriz, cada iteración coloca el elemento actual con+
o-eq
delante de él en la tubería en función de si el valor actual es-l
ess-than-or-e
qual al valor anterior$i
. Esas cadenas se-join
editan juntas y se canalizan aiex
(abreviaturaInvoke-Expression
y similar aeval
. Por ejemplo, para la entrada2846145
esto se evaluará como+2+8-eq4+6-eq1+4+5
, que esTrue
.Ese booleano se deja en la tubería y
True
/False
se escribe implícitamente al finalizar el programa.NB: para la entrada de un solo dígito, el dígito resultante se deja en la tubería, que es un valor verdadero en PowerShell.
Ejemplos
fuente
GNU sed 217 o 115
Ambos incluyen +1 para -r
217:
Toma entrada en decimal normal
Pruébalo en línea!
115:
Toma la entrada como una lista separada por comas de los dígitos de números en unario. por ejemplo
123
sería1,11,111
Pruébalo en línea!
fuente
Perl, 38 + 3 (
-p
) = 41 bytes-9 bytes gracias a @Ton Hospel !
Como hay un
$'
, el código debe estar en un archivo para ejecutarse. Entonces-p
cuenta para 3 bytes. Salidas 1 si el número es un número Dennis 2.0, o una cadena vacía de lo contrario:fuente
s%.%2x$&.($&.O ge$')%eg;$_=/^(2+1)\1*$/
-p
$'
A
es mucho mejor! ¡Gracias!.O
Sin embargo, no entiendo ... Sin esto, falla en algunos casos, pero no puedo ver por qué.$'
es el siguiente dígito y todos los siguientes. Entonces, por ejemplo,778
se compara7
a78
cuállt
parece una secuencia ascendente. LoO
rompe y se compara7O
con78
(todo lo anterior9
en ASCII funciona)$' or $
`en lugar de mis grupos de captura, pero no pude encontrarlo, por eso" y todos los que están después ". ¡Gracias por el consejo!~$&le~$'
debería ser 1 más cortoJavaScript (ES6),
666563 bytesGuardado 2 bytes gracias a @ edc65
Toma la entrada como una cadena. Versión anterior (solo funciona en Firefox 30+):
fuente
[...x,0]
->[...x,p=t=z=0]
Mathematica, 38 bytes
Función anónima. Toma un número como entrada y devuelve
True
oFalse
como salida.fuente
Brachylog 2, 10 bytes, desafío de fechas posteriores al idioma
Pruébalo en línea!
Este es básicamente el mismo algoritmo que la respuesta de @ Fatalize (que no vi hasta después de escribir esto), pero se reorganizó un poco para que sea más golf bajo la sintaxis de Brachylog 2.
Es un programa completo, que regresa
false.
si no es un número Dennis 2.0, otrue
si lo es.Explicación
Como de costumbre para un programa completo de Brachylog, si todas las afirmaciones pueden cumplirse simultáneamente, obtenemos un verdadero retorno, de lo contrario falsey. El orden predeterminado para
~c
es ordenar las particiones con menos elementos más largos primero, y en Prolog (por lo tanto, Brachylog), el orden predeterminado definido por el primer predicado en el programa (usando el segundo como un desempate, y así sucesivamente; aquí,~c
domina, porqueẹ
es determinista y por lo tanto no tiene nada que ordenar).fuente
MATL,
2423201816 bytesDevuelve una verdad de la matriz de Falsey
Pruébalo en línea!
Además, felicidades @Dennis!
Explicación
fuente
&=
!PHP,
10810592 bytestoma la entrada del argumento, sale con el
0
número Dennis-2.0, con1
else.Descompostura
fuente
05AB1E , 18 bytes
Explicación
N = 12012
usado como ejemplo.Pruébalo en línea!
fuente
Ruby 2.3, 56 bytes
Ciertamente, no es la mejor forma de hacer esto, pero muestra algunas características agradables del lenguaje.
(No tolera la nueva línea, así que corre como
ruby dennis2.rb <<< '12012'
)fuente
PHP, 144 bytes
Estoy seguro de que hay una forma mucho más inteligente (y más corta) de hacerlo, pero lo hará por ahora.
fuente
Python 2, 69 bytes
Toma la entrada como una cadena.
Explicación:
ex
1201212012
Convierte a la lista de sumas:
1+2,0+1+2,1+2,0+1+2,
Evalúa y convierte a conjunto.
set([3])
Si la longitud del conjunto es 1, todas las sumas son iguales.
fuente
JavaScript (ES6), 58
Aplicando mi consejo raramente útil https://codegolf.stackexchange.com/a/49967/21348
Escanea el string char por char identificando la ejecución de caracteres ascendentes, al final de cada ron comprueba si la suma es siempre la misma
Prueba
fuente
Pyth , 20 bytes
Dos versiones
¡Prueba el primero en línea!
¡Prueba el segundo en línea!
fuente
Rubí,
11710585 bytesEsto devolvería el número entero de este número dennis o,
nil
si no, un número dennis. Todos los enteros se considerarán verdaderos en ruby y tambiénnil
se considerarán falsos.i
es el entero que se está comprobando.La tercera versión en realidad regresa
true
yfalse
.PS probó para devolver 172 enteros de 1 a 1000 como en la respuesta.
fuente
APL, 23 bytes
Explicación:
N←⍎¨⍕⍵
: obtener los dígitos individuales en la entrada, almacenar enN
N⊂⍨1,2>/N
: encuentre las sublistas de números estrictamente crecientes enN
+/↑
: suma cada sublista1=≢∪
: ver si la lista resultante tiene solo un elemento únicofuente
Añadir ++ , 109 bytes
Pruébalo en línea!
Cómo funciona
€
[1 2 0 1 2 2]
fuente