Usuário PPCG e mod eleito, @Dennis acabou de se tornar o segundo usuário a ganhar mais de 100k repetições!
Essa é uma ideia totalmente original, que eu não recebi de mais ninguém , mas vamos fazer um desafio baseado em seu ID de usuário, 12012
como uma homenagem!
Olhando para ele, você notará que existem duas "seções" distintas no ID dele.
12
e
012
Ambas as seções somam 3. Isso é uma propriedade bastante interessante.
Vamos definir um "número Dennis 2.0" como qualquer número inteiro positivo em que toda subsequência máxima de dígitos estritamente crescentes seja igual ao mesmo número. Por exemplo,
123
é um número Dennis 2.0 porque existe apenas uma sub-lista máxima de dígitos estritamente crescentes e soma 6. Além disso, 2.846.145 também é um número Dennis 2.0 porque as três sublistas máximas de dígitos crescentes, a saber
28
46
145
Tudo soma para 10
. Além disso, os números que apenas repetem o mesmo dígito devem ser números Dennis 2.0, porque, por exemplo, 777
podem ser divididos em
7
7
7
que claramente todos somam sete.
Um número que não42
seja o número Dennis 2.0, pois é dividido em
4
2
que claramente não somam o mesmo número.
O desafio
Você deve escrever um programa ou função para determinar se um determinado número é um número Dennis 2.0 ou não. Você pode obter entrada e saída em qualquer formato de entrada razoável, por exemplo, como uma string, como um número, de um arquivo, argumentos / retorno de função, de STDIN / STDOUT, etc. e, em seguida, retornar um valor verdadeiro se esse número for um Dennis 2.0 número e um valor falso se não for. Para referência, eis todos os números do Dennis 2.0 de até 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
As brechas padrão se aplicam e a resposta mais curta, medida em bytes, vence!
fonte
1236|6
,
entre eles? Provavelmente isso está exagerando bastante.Respostas:
Geléia,
1312 bytes1 byte graças a @Dennis.
Experimente online!
Explicação
fonte
JavaScript (ES6),
7270 bytesToma uma string como entrada. Retorna um valor falso ou verdadeiro (que pode ser um número).
Está usando uma expressão regular para transformar uma sequência de entrada, como
"2846145"
em:Então chama
eval()
essa expressão.fonte
2011
divide como2 / 01 / 1
e não é um número D2.0. Quanto a189
, é um número D2.0 e18
é um valor verdadeiro.Python, 50 bytes
Espera
input()
avaliar uma string, para que a entrada precise de aspas no Python 2. A saída é via código de saída , em que 0 indica sucesso (verdade) e 1 indica falha (falsidade).Teste em Ideone .
Como funciona
Inicializamos r na string 0 e iteramos sobre todos os dígitos d na entrada.
Se d for maior que o primeiro dígito de r (inicialmente 0 , então igual ao valor anterior de d ),
r<d
avaliará como Verdadeiro e'=+'[r<d]*2
renderá++
.Se d for menor que o primeiro dígito de r , será
'=+'[r<d]*2
gerado==
.Se d for igual ao primeiro dígito de r , r será maior que a sequência singleton d , portanto,
'=+'[r<d]*2
produzirá novamente==
.Em todos os casos, o dígito d e os dois caracteres gerados são anexados a r .
Depois que todos os dígitos de entrada foram processados,
eval(r)
avalia a expressão gerada.Se a entrada consistir em uma única sequência estritamente crescente de dígitos (positivos), a expressão será avaliada como sua soma.
Por exemplo, o número inteiro 12345 resulta na expressão
5++4++3++2++1++0
, que gera 15 quando avaliada. Observe que cada segundo + é uma vantagem unária , portanto não afeta o resultado. Dividir 1 por 15 é válido (o resultado não é importante); o programa sai normalmente.Se a entrada consistir em duas seqüências estritamente crescentes de dígitos, a expressão consistirá em uma comparação simples.
Por exemplo, o número inteiro 12012 resulta na expressão
2++1++0==2++1++0
, que produz True quando avaliado, pois os dois termos possuem a soma 3 . Dividir 1 por Verdadeiro ( 1 ) é válido (o resultado não é importante); o programa sai normalmente.Por outro lado, o número inteiro 12366 resulta na expressão
6==6++3++2++1++0
, que gera Falso quando avaliado, pois os termos têm as somas 6 e 12 . Dividir 1 por False ( 0 ) gera um ZeroDivisionError ; o programa sai com um erro.Se a entrada consistir em três ou mais sequências estritamente crescentes de dígitos, a expressão consistirá em uma comparação encadeada , que retornará True se e somente se todas as comparações envolvidas retornarem True .
Por exemplo, o número inteiro 94536 resulta na expressão
6++3==5++4==9++0
, que gera True quando avaliado, pois todos os termos têm soma 9 . Como antes, o programa sai normalmente.Por outro lado, o número inteiro 17263 resulta na expressão
3==6++2==7++1++0
, que produz False quando avaliada, pois os termos possuem as somas 3 , 8 e 8 . Como antes, o programa sai com um erro.fonte
Braquilog , 13 bytes
Experimente online!
Explicação
~c
unificar-se-á primeiro com os maiores sublistas.fonte
Pyke, 18 bytes
Experimente aqui!
fonte
PowerShell v2 +,
1006461 bytesUm one-liner literal, pois esse é o único canal. Recebe a entrada como uma sequência
$args[0]
.char
Faz um loop através dele como uma matriz, cada iteração colocando o elemento atual com um+
ou-eq
à frente dele no pipeline com base em se o valor atual é-l
ess ou thane
qual ao valor anterior$i
. Essas seqüências de caracteres são-join
editadas juntas e canalizadas paraiex
(abreviaçãoInvoke-Expression
e semelhante aeval
. Por exemplo, para entrada,2846145
isso será avaliado como+2+8-eq4+6-eq1+4+5
, o que éTrue
.Esse booleano é deixado no pipeline e
True
/False
é implicitamente gravado na conclusão do programa.NB - para entrada com um dígito, o dígito resultante é deixado no pipeline, que é um valor verdadeiro no PowerShell.
Exemplos
fonte
GNU sed 217 ou 115
Ambos incluem +1 para -r
217:
Aceita entrada em decimal normal
Experimente online!
115:
Recebe a entrada como uma lista separada por vírgula dos dígitos dos números em unário. por exemplo,
123
seria1,11,111
Experimente online!
fonte
Perl, 38 + 3 (
-p
) = 41 bytes-9 bytes graças a @Ton Hospel !
Como existe um
$'
, o código precisa estar em um arquivo para ser executado. Então-p
conta para 3 bytes. Gera 1 se o número for um número Dennis 2.0 ou uma sequência vazia, caso contrário:fonte
s%.%2x$&.($&.O ge$')%eg;$_=/^(2+1)\1*$/
com a-p
opção (+3 porque o código tem$'
)A
é muito melhor! Obrigado! Mas eu não entendo.O
... Sem ele, ele falha em alguns casos, mas não consigo entender o porquê.$'
é o próximo dígito e todos os seguintes. Então, por exemplo,778
ele se compara7
ao78
qual selt
parece com uma sequência crescente. AsO
quebras e que se comparam7O
a78
(qualquer coisa acima9
em ASCII funciona)$' or $
`em vez dos meus grupos de captura, mas não consegui encontrá-lo, por causa disso" e todos os que estão atrás dele ". Obrigado pela dica!~$&le~$'
deve ser 1 mais curtoJavaScript (ES6),
666563 bytesGuardado 2 bytes graças a @ edc65
Recebe a entrada como uma sequência. Versão antiga (funciona apenas no Firefox 30 ou superior):
fonte
[...x,0]
->[...x,p=t=z=0]
Mathematica, 38 bytes
Função anônima. Pega um número como entrada e retorna
True
ouFalse
como saída.fonte
Braquilog 2, 10 bytes, desafio de pós-datas de idiomas
Experimente online!
Esse é basicamente o mesmo algoritmo da resposta de @ Fatalize (que eu não vi até depois de ter escrito isso), mas reorganizado um pouco para torná-lo mais eficiente sob a sintaxe do Brachylog 2.
É um programa completo, retornando
false.
se não for um número do Dennis 2.0 outrue
se for.Explicação
Como sempre, para um programa completo do Brachylog, se todas as asserções puderem ser cumpridas simultaneamente, obtemos um retorno verdadeiro, caso contrário, falsey. A ordem padrão para
~c
é classificar partições com menos elementos mais longos primeiro e, no Prolog (portanto, Brachylog), a ordem padrão definida pelo primeiro predicado no programa (usando o segundo como um desempate etc.); aqui,~c
domina, porqueẹ
é determinista e, portanto, não tem nada para pedir).fonte
MATL,
2423201816 bytesRetorna uma verdade de matriz falsey
Experimente Online!
Além disso, parabéns @Dennis!
Explicação
fonte
&=
!PHP,
10810592 bytesrecebe entrada do argumento, sai com
0
para o número Dennis-2.0, com1
else.demolir
fonte
05AB1E , 18 bytes
Explicação
N = 12012
usado como exemplo.Experimente online!
fonte
Ruby 2.3, 56 bytes
Quase certamente não é a maneira mais divertida de fazer isso, mas mostra alguns recursos interessantes de linguagem.
(Não é tolerante a novas linhas, execute como
ruby dennis2.rb <<< '12012'
)fonte
PHP, 144 bytes
Tenho certeza de que há uma maneira muito mais inteligente (e mais curta) de fazer isso, mas servirá por enquanto.
fonte
Python 2, 69 bytes
Recebe a entrada como uma sequência.
Explicação:
ex
1201212012
Converte em lista de somas:
1+2,0+1+2,1+2,0+1+2,
Avalia e converte para definir.
set([3])
Se o comprimento do conjunto for 1, todas as somas serão iguais.
fonte
JavaScript (ES6), 58
Aplicando minha dica raramente útil https://codegolf.stackexchange.com/a/49967/21348
Ele verifica a string char por char, identificando a sequência de caracteres ascendentes; no final de cada rum, verifica se a soma é sempre a mesma
Teste
fonte
Pitão , 20 bytes
Duas versões
Experimente o primeiro online!
Experimente o segundo online!
fonte
Rubi,
11710585 bytesIsso retornaria o número inteiro desse número de dennis ou,
nil
se não, um número de dennis. Todos os números inteiros serão considerados verdadeiros em ruby e também serãonil
considerados falsos.i
é o número inteiro que está sendo verificado.Terceira versão realmente retorna
true
efalse
.PS testado para retornar 172 números inteiros de 1 a 1000, como na resposta.
fonte
APL, 23 bytes
Explicação:
N←⍎¨⍕⍵
: obter os dígitos individuais na entrada, armazenar emN
N⊂⍨1,2>/N
: encontre as sublistas de números estritamente crescentes emN
+/↑
: soma cada sublist1=≢∪
: veja se a lista resultante possui apenas um elemento exclusivofonte
Adicione ++ , 109 bytes
Experimente online!
Como funciona
€
[1 2 0 1 2 2]
fonte