데니스 넘버 2.0 자릿수의 세 개의 최대

PPCG 사용자 및 선출 모드는 @Dennis는 단지 100,000 담당자를 통해 적립 두 번째 이제까지 사용자가되었습니다!

여기에 이미지 설명을 입력하십시오

이것은 내가 다른 사람에게서 얻지 못한 완전히 독창적 인 아이디어 이지만 그의 사용자 ID를 바탕 12012으로 공물로 도전합시다 !

그것을 보면, 그의 ID에는 두 개의 별개의 “섹션”이 있음을 알 수 있습니다.

12

012

이 두 섹션은 모두 3을 더합니다. 그것은 꽤 흥미로운 속성입니다.

“Dennis 2.0 숫자”를 양의 정수로 정의하여 엄격하게 증가하는 숫자의 최대 하위 시퀀스가 ​​모두 같은 숫자가되도록합니다. 예를 들어

123

엄격하게 증가하는 자릿수의 최대 하위 목록이 하나뿐이기 때문에 Dennis 2.0 숫자이며 6의 합계입니다. 또한 2,846,145는 증가하는 자릿수의 세 개의 최대 하위 목록, 즉

28
46
145

모든 합은 10입니다. 또한 동일한 숫자를 반복하는 숫자 예를 들어 다음과 777같이 나눌 수 있으므로 Dennis 2.0 숫자 여야합니다.

7
7
7

이는 분명 일곱 모든 합계입니다.

같은 숫자 는 Dennis 2.0 숫자 42아닙니다 .

4
2

분명히 같은 숫자와 합치 지 않습니다.

도전

주어진 숫자가 Dennis 2.0 숫자인지 여부를 판별하기 위해 프로그램 또는 함수를 작성해야합니다. 문자열, 숫자, 파일, 함수 인수 / 반환, STDIN / STDOUT 등의 합리적인 입력 형식으로 입력하고 출력 한 다음 이 숫자가 Dennis 2.0 인 경우 정확한 값 을 반환 할 수 있습니다. 그렇지 않으면 거짓 값입니다. 참고로, 모든 Dennis 2.0 번호는 최대 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

표준 허점이 적용되며 바이트 단위로 측정 된 최단 응답이 승리합니다!



답변

젤리, 13 12 바이트

@Dennis 덕분에 1 바이트.

DIṠ’0;œṗDS€E

온라인으로 사용해보십시오!

설명

DIṠ’0;œṗDS€E    Main link. Argument: N
D               Convert N to its digits.
 I              Find the differences between the elements.
  Ṡ             Find the sign of each difference. This yields 1 for locations where the
                list is strictly increasing and 0 or -1 elsewhere.
   ’            Decrement. This yields 0 for locations where the list is strictly
                increasing and -1 or -2 elsewhere.
    0;          Prepend a 0.
        D       Get another list of digits.
      œṗ        Split the list of digits at truthy positions, i.e. the -1s and -2s.
         S€     Sum each sublist.
           E    Check if all values are equal.

답변

자바 스크립트 (ES6), 72 70 바이트

문자열을 입력으로 사용합니다. false 또는 true 값 (숫자 일 수 있음)을 반환합니다.

정규 표현식을 사용하여 다음과 같은 입력 문자열을 변환합니다 "2846145".

"(a=2+8)&&(a==4+6)&&(a==1+4+5)"

그런 다음 eval()이 표현을 호출 하십시오.

let f =

n=>eval(n.replace(/./g,(v,i)=>(v>n[i-1]?'+':i?')&&(a==':'(a=')+v)+')')

console.log(f("101"));
console.log(f("102"));
console.log(f("777"));
console.log(f("2846145"));

답변

파이썬, 50 바이트

r='0'
for d in input():r=d+'=+'[r<d]*2+r
1/eval(r)

input()문자열로 평가할 것으로 예상 되므로 입력에 파이썬 2의 따옴표가 필요합니다. 출력은 종료 코드 를 통해 이루어집니다 . 여기서 0 은 성공 (거짓)을 나타내고 1 은 실패 (거짓)를 나타냅니다.

Ideone에서 테스트하십시오 .

작동 원리

r 을 문자열 0으로 초기화 하고 입력의 모든 숫자 d 를 반복 합니다.

  • 경우 d는 의 첫 번째 숫자보다 큰 R (초기에 0 의 값을 이전 한 후 동일 D ) r<d로 평가되는 '=+'[r<d]*2수율 ++.

  • 경우 D는 처음 숫자보다 작은 R , '=+'[r<d]*2수율 ==.

  • 경우 d는 의 첫 번째 자리에 동일한 R , R은 싱글 캐릭터보다 더 길어질 수 D 하므로 '=+'[r<d]*2수율 한번 ==.

모든 경우에 숫자 d 와 생성 된 두 문자는 r 앞에 추가됩니다 .

모든 입력 숫자가 처리되면 eval(r)생성 된 표현식을 평가합니다.

  • 입력이 엄격하게 증가하는 (양수) 숫자 시퀀스로 구성된 경우 표현식은 해당 합계로 평가됩니다.

    예를 들어, 정수 12345 는 식 5++4++3++2++1++0을 산출하며 평가시 15 를 산출 합니다. 각 초 +단항 더하기이므로 결과에 영향을 미치지 않습니다. 115 로 나누는 것은 유효합니다 (결과는 중요하지 않습니다). 프로그램이 정상적으로 종료됩니다.

  • 입력이 엄격하게 증가하는 두 자릿수 시퀀스로 구성된 경우 간단한 비교로 표현됩니다.

    예를 들어 정수 12012 는식이 2++1++0==2++1++0되며, 두 항의 합계가 3 이므로 평가할 때 True가 됩니다 . 1True ( 1 )로 나누는 것은 유효합니다 (결과는 중요하지 않습니다). 프로그램이 정상적으로 종료됩니다.

    한편, 정수 12366 개 발현 결과 6==6++3++2++1++0산출, 거짓 조건이 합계를 갖기 때문에 검사시 612 . 1False ( 0 )로 나누면 ZeroDivisionError가 발생합니다 . 프로그램이 오류와 함께 종료됩니다.

  • 입력이 숫자 세 개 이상의 엄격하게 증가하는 시퀀스로 구성하는 경우, 표현식은 구성 연쇄 비교 반환, 진정한 관련된 모든 비교는 반환의 경우에만 사실 .

    예를 들어, 정수 94,536 발현 결과 6++3==5++4==9++0산출, 트루 모든 용어들은 합이 때문에 검사시 9 . 이전과 마찬가지로 프로그램이 정상적으로 종료됩니다.

    한편, 정수 17,263 발현 결과 3==6++2==7++1++0산출, 거짓 조건이 합이 때문에 검사시 3 , 8 , 및 8 . 이전과 마찬가지로 프로그램이 오류와 함께 종료됩니다.


답변

Brachylog , 13 바이트

~c@e:{<+}a!#=

온라인으로 사용해보십시오!

설명

~c               Find a list of integers which when concatenated result in the Input
  @e             Split the integers into lists of digits
    :{<+}a       Each list of digit is stricly increasing, and compute its sum
          !      Discard all other choice points (prevents backtracking for smaller sublists)
           #=    All sums must be equal

~c 가장 큰 하위 목록과 먼저 통합됩니다.


답변

파이크, 18 바이트

mb$1m>0R+fMbms}lt!

여기 사용해보십시오!

mb                 -         map(int, input)
  $                -        delta(^)
   1m>             -       map(^, 1>i)
      0R+          -      [0]+^
         f         -     input.split_at(^)
          Mb       -    deep_map(int, ^)
            ms     -   map(sum, ^)
              }    -  uniquify(^)
               lt! - len(^) == 1

답변

PowerShell v2 +, 100 64 61 바이트

-join([char[]]$args[0]|%{("+$_","-eq$_")[$_-le$i];$i=$_})|iex

이것은 모두 하나의 파이프 라인이므로 문자 그대로의 단일 라이너입니다. 입력을 문자열로 $args[0]받습니다. A와 그것을 통해 루프 char-array하는 전류와 소자 중 하나를 배치하는 각 반복 +또는 -eq여부에 따라 파이프 라인 상에 그것의 앞에 현재 값은 -lESS보다 또는 – e이전 값 QUAL $i. 이러한 문자열되어 -join함께 에드에 파이프 및 iex짧은 ( Invoke-Expression및 유사한 eval. 예를 들어, 입력 2846145으로 이러한 평가한다 +2+8-eq4+6-eq1+4+5True.

해당 부울은 파이프 라인에 남아 있으며 프로그램 완료시 True/ False가 암시 적으로 작성됩니다.

NB-한 자릿수 입력의 경우 결과 숫자는 파이프 라인에 남습니다. 이는 PowerShell에서 확실한 값입니다.

PS C:\Tools\Scripts\golfing> 2846145,681,777,12366,2|%{"$_ -> "+(.\dennis-number-20.ps1 "$_")}
2846145 -> True
681 -> False
777 -> True
12366 -> False
2 -> 2

답변

GNU sed 217 또는 115

둘 다 -r에 +1 포함

217 :

s/./&,/g;s/^/,/g;:;s,0,,;s,2,11,;s,3,21,;s,4,31,;s,5,41,;s,6,51,
s,7,61,;s,8,71,;s,9,81,;t;s/(,1*)(1*)\1,/\1\2X\1,/;t;s/,//g
s,1X1(1*),X\1a,;t;/^1.*X/c0
/Xa*$/s,a*$,,;y,a,1,;/1X1/b;/1X|X1/c0
c1

보통 10 진수로 입력을받습니다.

온라인으로 사용해보십시오!


115 :

s/^|$/,/g;:;s/(,1*)(1*)\1,/\1\2X\1,/;t;s/,//g
s,1X1(1*),X\1a,;t;/^1.*X/c0
/Xa*$/s,a*$,,;y,a,1,;/1X1/b;/1X|X1/c0
c1

쉼표로 구분 된 숫자 자릿수 목록을 단항으로 입력합니다. 예를 들면 1231,11,111

온라인으로 사용해보십시오!