ตัวเลขเดนนิส 2.0


54

ผู้ใช้ PPCG และ mod ที่ได้รับการเลือกตั้ง@Dennisกลายเป็นผู้ใช้รายที่สองที่มีรายได้มากกว่า 100k!

ป้อนคำอธิบายรูปภาพที่นี่

นี่เป็นความคิดดั้งเดิมโดยสิ้นเชิงที่ฉันไม่ได้รับจากใครเลยแต่ลองทำตามความท้าทายจากรหัสผู้ใช้ของเขา12012เพื่อเป็นบรรณาการ!

เมื่อมองดูคุณจะสังเกตเห็นว่ามี "ส่วน" ที่แตกต่างกันสองรายการสำหรับ ID ของเขา

12

และ

012

ทั้งสองส่วนนี้รวมกันเป็น 3 ซึ่งเป็นคุณสมบัติที่น่าสนใจทีเดียว

ลองกำหนด "เดนนิสเบอร์ 2.0" เป็นจำนวนเต็มบวกใด ๆ ที่ทุก ๆ การเรียงลำดับสูงสุดของตัวเลขที่เพิ่มขึ้นอย่างเคร่งครัดเป็นจำนวนเดียวกัน ตัวอย่างเช่น,

123

เป็นตัวเลขเดนนิส 2.0 เพราะมีเพียงหนึ่งในรายการย่อยสูงสุดของตัวเลขที่เพิ่มขึ้นอย่างเคร่งครัดและจะรวมเป็น 6 นอกจากนี้ 2,846,145 ยังเป็นหมายเลขเดนนิส 2.0 เพราะทั้งสามรายการย่อยสูงสุดของตัวเลขเพิ่มขึ้น ได้แก่

28
46
145

10ผลรวมทั้งหมดเพื่อ นอกจากนี้ตัวเลขที่เพิ่งทำซ้ำตัวเลขเดียวกันจะต้องเป็นตัวเลขเดนนิส 2.0 เพราะ777สามารถแยกย่อยได้

7
7
7

ซึ่งรวมทั้งหมดเจ็ดอย่างชัดเจน

จำนวนเช่น42เป็นไม่ได้จำนวน 2.0 เดนนิสเพราะมันถูกทำลายลงไป

4
2

ซึ่งชัดเจนไม่รวมกับหมายเลขเดียวกัน

ความท้าทาย

คุณต้องเขียนโปรแกรมหรือฟังก์ชั่นเพื่อตรวจสอบว่าหมายเลขที่กำหนดเป็นหมายเลขเดนนิส 2.0 หรือไม่ คุณสามารถนำเข้าและส่งออกในรูปแบบการป้อนข้อมูลที่เหมาะสมเช่นเป็นสตริงเป็นตัวเลขจากไฟล์อาร์กิวเมนต์ funtion / return จาก STDIN / STDOUT ฯลฯ จากนั้นส่งกลับค่าความจริงหากตัวเลขนี้เป็นเดนนิส 2.0 ตัวเลขและค่าเท็จถ้าไม่ สำหรับการอ้างอิงนี่คือทุกหมายเลขเดนนิส 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

ช่องโหว่มาตรฐานใช้และคำตอบที่สั้นที่สุดวัดเป็นไบต์ชนะ!


1
สำหรับการอ้างอิง Martin Ender เป็นคนแรกที่ได้รับ 100k rep
Erik the Outgolfer

1
12366 เป็นหมายเลข 2.0 ที่ถูกต้องหรือไม่ (123 | 6 | 6 กับ 1236 | 6)
Sp3000

2
@ sp3000 นั่นไม่ใช่หมายเลขเดนนิส มันจะเป็น1236|6
DJMcMayhem

ฉันสามารถนำตัวเลขแต่ละหลักมาเป็นตัวเลขแทนค่าที่ไม่เป็นเอกภาพ,ระหว่างกันได้หรือไม่? นี่อาจจะยืดได้มาก
Riley

13
เดนนิสที่กลัวฉันจะทำลายพวกเราทุกคนในการท้าทายนี้
downrep_nation

คำตอบ:


15

เยลลี่, 13 12 ไบต์

1 ไบต์ต้องขอบคุณ @Dennis

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.

16

JavaScript (ES6), 72 70 ไบต์

รับสตริงเป็นอินพุต ส่งคืนค่าเท็จหรือค่าจริง (ซึ่งอาจเป็นตัวเลข)

มันใช้นิพจน์ทั่วไปเพื่อแปลงสตริงอินพุตเช่นเป็น"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"));


เยี่ยมมากนั่นเป็นความคิดที่ฉลาดจริงๆ :-)
ETHproductions

ชอบไอเดียนั้นด้วย! แต่สิ่งนี้ไม่ทำงาน: console.log (f ("2011")); // false console.log (f ("189")); // 18
user470370

3
@ user470370 - ฉันคิดว่าถูกต้องจริง คำจำกัดความระบุ"ส่วนประกอบของตัวเลขที่เพิ่มขึ้นอย่างเข้มงวด"ดังนั้น2011แยกเป็น 2 / 01 / 1และไม่ใช่หมายเลข D2.0 สำหรับ189มันเป็นหมายเลข D2.0 และ18เป็นค่าจริง
Arnauld

อัพแน่นอนคุณพูดถูก ไม่เคยเห็นมาก่อน ฉันคิดว่าฉันต้องปรับปรุงวิธีการแก้ปัญหาของตัวเอง: D
user470370

15

Python ขนาด 50 ไบต์

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

คาดว่าinput()จะประเมินเป็นสตริงดังนั้นอินพุตจำเป็นต้องมีเครื่องหมายอัญประกาศล้อมรอบใน Python 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เมื่อประเมิน โปรดทราบว่าแต่ละวินาที+เป็นเอกบวกดังนั้นจึงไม่ส่งผลกระทบต่อผล การหาร1ด้วย15ถูกต้อง (ผลลัพธ์ไม่สำคัญ); โปรแกรมออกจากปกติ

  • หากอินพุตประกอบด้วยสองหลักที่เพิ่มขึ้นอย่างเข้มงวดลำดับนิพจน์ประกอบด้วยการเปรียบเทียบอย่างง่าย

    ยกตัวอย่างเช่นเลขที่12012ผลลัพธ์ในการแสดงออก2++1++0==2++1++0ซึ่งอัตราผลตอบแทนที่แท้จริงเมื่อประเมินตั้งแต่คำทั้งสองมียอดรวม3 การหาร1ด้วยTrue ( 1 ) ถูกต้อง (ผลลัพธ์ไม่สำคัญ) โปรแกรมออกจากปกติ

    บนมืออื่น ๆ , เลขที่12366ผลลัพธ์ในการแสดงออก6==6++3++2++1++0ซึ่งผลตอบแทนถัวเฉลี่ยเท็จเมื่อประเมินตั้งแต่ข้อตกลงมีผลบวก6และ12 หาร1โดยเท็จ ( 0 ) ยกZeroDivisionError ; โปรแกรมออกจากข้อผิดพลาด

  • ถ้าใส่ประกอบด้วยสามหรือมากกว่าอย่างเคร่งครัดลำดับที่เพิ่มขึ้นของตัวเลขการแสดงออกประกอบด้วยการเปรียบเทียบถูกล่ามโซ่ซึ่งผลตอบแทนที่แท้จริงและถ้าหากเปรียบเทียบที่เกี่ยวข้องทั้งหมดกลับทรู

    ยกตัวอย่างเช่นเลขที่94536ผลลัพธ์ในการแสดงออก6++3==5++4==9++0ซึ่งอัตราผลตอบแทนที่แท้จริงเมื่อประเมินตั้งแต่แง่ทุกคนมีผลรวม9 เมื่อก่อนโปรแกรมจะออกตามปกติ

    บนมืออื่น ๆ , เลขที่17263ผลลัพธ์ในการแสดงออก3==6++2==7++1++0ซึ่งผลตอบแทนถัวเฉลี่ยเท็จเมื่อประเมินตั้งแต่ข้อตกลงมีผลบวก3 , 8และ8 เมื่อก่อนโปรแกรมจะออกโดยมีข้อผิดพลาด


11
เกี่ยวกับเวลาที่ฉันโพสต์ความท้าทายนี้ลงไป ...
Dennis

7

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 จะรวมกับรายการย่อยที่ใหญ่ที่สุดก่อน



6

PowerShell v2 +, 100 64 61 ไบต์

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

ตัวอักษรตัวหนึ่งซับเนื่องจากนี่คือท่อเดียวทั้งหมด $args[0]จะเข้าเป็นสตริง charวนซ้ำเป็น-array แต่ละการวนซ้ำจะวางองค์ประกอบปัจจุบันที่มี+หรือ-eqด้านหน้าของมันลงบนไปป์ไลน์โดยพิจารณาว่าค่าปัจจุบันนั้นมีค่า-lเกินกว่าeค่าก่อนหน้า$iหรือไม่ สตริงเหล่านั้นจะถูก-joined ด้วยกันและประปา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

6

GNU sed 217 หรือ 115

ทั้งสองรวม +1 สำหรับ -r

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

รับอินพุตเป็นทศนิยมปกติ

ลองออนไลน์!


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

รับอินพุตเป็นรายการที่คั่นด้วยเครื่องหมายจุลภาคของตัวเลขตัวเลขเป็นเอก เช่น123จะเป็น1,11,111

ลองออนไลน์!


5

Perl, 38 + 3 ( -p) = 41 ไบต์

-9 ไบต์ขอบคุณ@Ton Hospel !

s%.%2x$&.(~$&le~$')%eg;$_=/^(2+1)\1*$/

เนื่องจากมี a $'รหัสจึงจำเป็นต้องอยู่ในไฟล์ที่จะเรียกใช้ ดังนั้น-pนับเป็น 3 ไบต์ เอาท์พุท 1 ถ้าตัวเลขเป็นหมายเลขเดนนิส 2.0 หรือสตริงว่างมิฉะนั้น

$ cat dennis_numbers.pl
s%.%2x$&.(~$&le~$')%eg;$_=/^(2+1)\1*$/
$ perl -p dennis_numbers.pl <<< "1
10
12315
12314"

1
ผมคิดว่านี่น่าจะเป็นวิธีที่ดีที่สุดใน Perl แต่คุณสามารถกอล์ฟมันลงไป 42: s%.%2x$&.($&.O ge$')%eg;$_=/^(2+1)\1*$/กับ-pตัวเลือก (+3 เพราะรหัสมี$')
Ton Hospel

แน่นอนว่าการใช้ผลลัพธ์ของการเปรียบเทียบแทนการสุ่มAนั้นดีกว่ามาก! ขอบคุณ! ฉันไม่เข้าใจ.Oว่า ... หากไม่มีมันก็ล้มเหลวในบางกรณี แต่ฉันไม่เห็นสาเหตุ
Dada

$'คือตัวเลขถัดไปและตัวเลขทั้งหมดที่ตามมา ดังนั้นในเช่น778มันเปรียบเทียบ7กับ78ที่ltดูเหมือนว่าลำดับที่เพิ่มขึ้น ตัวOแบ่งที่และเปรียบเทียบ7Oกับ78 (สิ่งใด ๆ ข้างต้น9ในงาน ASCII)
Ton Hospel

โอ้ถูกต้อง! ฉันมองหาวิธีที่จะใช้$' or $`แทนที่จะเป็นกลุ่มดักจับของฉัน แต่หาไม่เจอเพราะมัน" และกลุ่มอื่น ๆ หลังจากนั้น " ขอบคุณสำหรับทิป!
Dada

อืม~$&le~$'ควรสั้นกว่า 1
Ton Hospel

5

JavaScript (ES6), 66 65 63 ไบต์

บันทึก 2 ไบต์ขอบคุณ @ edc65

x=>[...x,p=t=z=0].every(c=>p>=(t+=+p,p=c)?(z?z==t:z=t)+(t=0):1)

รับอินพุตเป็นสตริง เวอร์ชันเก่า (ใช้ได้เฉพาะใน Firefox 30+):

x=>[for(c of(p=t=0,x))if(p>=(t+=+p,p=c))t+(t=0)].every(q=>q==+p+t)

คำแนะนำ: [...x,0]->[...x,p=t=z=0]
edc65

@ edc65 ขอบคุณฉันไม่ได้คิดอย่างนั้น!
ETHproductions

3

Mathematica, 38 ไบต์

Equal@@Tr/@IntegerDigits@#~Split~Less&

ฟังก์ชั่นไม่ระบุชื่อ ใช้ตัวเลขเป็นอินพุตและส่งคืนTrueหรือFalseเป็นเอาต์พุต


3

Brachylog 2, 10 ไบต์, ภาษาโพสต์วันที่ท้าทาย

ẹ~c<₁ᵐ!+ᵐ=

ลองออนไลน์!

นี่เป็นอัลกอริธึมเดียวกับคำตอบของ @ Fatalize (ซึ่งฉันไม่ได้เห็นจนกระทั่งหลังจากฉันเขียนสิ่งนี้) แต่ได้จัดเรียงใหม่เพื่อให้นักเล่นกอล์ฟภายใต้ไวยากรณ์ของ Brachylog 2

เป็นโปรแกรมเต็มรูปแบบส่งคืนfalse.หากไม่ใช่หมายเลข Dennis 2.0 หรือtrueเป็น

คำอธิบาย

ẹ~c<₁ᵐ!+ᵐ=
ẹ           Interpret the input number as a list of digits
      !     Find the first (in default order)
 ~c           partition of the digits
   <₁ᵐ        such that each is in strictly increasing order
         =  Assert that the following are all equal:
       +ᵐ     the sums of each partition

ตามปกติสำหรับโปรแกรมเต็มรูปแบบของ Brachylog หากการยืนยันทั้งหมดสามารถพบได้พร้อมกันเราจะได้รับผลตอบแทนที่แท้จริง ลำดับเริ่มต้นสำหรับ~cคือการจัดเรียงพาร์ติชันที่มีน้อยกว่าองค์ประกอบยาวก่อนและใน Prolog (เช่น Brachylog) ลำดับเริ่มต้นที่กำหนดโดยภาคแรกในโปรแกรม (ใช้ที่สองเป็น tiebreak และอื่น ๆ ที่นี่~cครอบงำ เพราะไม่แน่นอนและไม่มีอะไรจะสั่ง)


2

MATL, 24 23 20 18 16 ไบต์

Tjdl<vYsG!UlXQ&=

ส่งคืนความจริงของเมทริกซ์เท็จ

ลองออนไลน์!

นอกจากนี้ขอแสดงความยินดีกับเดนนิส!

คำอธิบาย

T       % Push a literal TRUE to the stack
        %   STACK: {1}
j       % Explicitly grab the input as a string
        %   STACK: {1, '2846145'}
d       % Compute the difference between successive ASCII codes
        %   STACK: {1, [6 -4 2 -5 3 1]}
l<      % Find where that difference is less than 1
        %   STACK: {1, [0 1 0 1 0 0]}
v       % Prepend the TRUE value we pushed previously
        %   STACK: {[1 0 1 0 1 0 0]}
Ys      % Compute the cumulative sum. This assigns a unique integer label to
        % each set of increasing numbers
        %   STACK: {[1 1 2 2 3 3 3]}
G!U     % Grab the input as numeric digits
        %   STACK: {[1 1 2 2 3 3 3], [2 8 4 6 1 4 5]}
lXQ     % Compute the sum of each group of increasing digits
        %   STACK: {[10 10 10]}
&=      % Computes element-wise equality (automatically broadcasts). A
        % truthy value in MATL is a matrix of all ones which is only the case
        % when all elements are equal:
        %   STACK: {[1 1 1
        %            1 1 1
        %            1 1 1]}
        % Implicitly display the result

ใช้งานได้ดี&=!
Luis Mendo

2

PHP, 108 105 92 ไบต์

$p=-1;foreach(str_split("$argv[1].")as$d)$p>=$d?$r&&$s-$r?die(1):($r=$s)&$s=$p=$d:$s+=$p=$d;

รับอินพุตจากอาร์กิวเมนต์ออกด้วย0สำหรับหมายเลข Dennis-2.0 และ1อื่น ๆ

ชำรุด

$p=-1;                              // init $p(revious digit) to -1
foreach(str_split("$argv[1].")as$d) // loop $d(igit) through input characters
                                    // (plus a dot, to catch the final sum)
    $p>=$d                              // if not ascending:
        ?$r                             // do we have a sum remembered 
        &&$s-$r                         // and does it differ from the current sum?
                ?die(1)                     // then exit with failure
                :($r=$s)&$s=$p=$d           // remember sum, set sum to digit, remember digit
        :$s+=$p=$d                      // ascending: increase sum, remember digit
    ;
// 

2

05AB1E , 18 ไบต์

SD¥X‹X¸«DgL*ꥣOÙg

คำอธิบาย

N = 12012 ใช้เป็นตัวอย่าง

                    # implicit input N = 12012
S                   # split input number to list of digits  
                    # STACK: [1,2,0,1,2]
 D                  # duplicate
                    # STACK: [1,2,0,1,2], [1,2,0,1,2]
  ¥                 # reduce by subtraction
                    # STACK: [1,2,0,1,2], [1,-2,1,1]
   X‹               # is less than 1
                    # STACK: [1,2,0,1,2], [0,1,0,0]
     X¸«            # append 1
                    # STACK: [1,2,0,1,2], [0,1,0,0,1]
        DgL*        # multiply by index (1-indexed)
                    # STACK: [1,2,0,1,2], [0,2,0,0,5]
            ê       # sorted unique
                    # STACK: [1,2,0,1,2], [0,2,5]
             ¥      # reduce by subtraction
                    # STACK: [1,2,0,1,2], [2,3]
              £     # split into chunks
                    # STACK: [[1,2],[0,1,2]]
               O    # sum each
                    # STACK: [3,3]
                Ù   # unique
                    # STACK: [3]
                 g  # length, 1 is true in 05AB1E
                    # STACK: 1

ลองออนไลน์!


2

Ruby 2.3, 56 ไบต์

p !gets.chars.chunk_while(&:<).map{|a|eval a*?+}.uniq[1]

เกือบจะไม่ใช่วิธีที่ง่ายที่สุดในการทำสิ่งนี้ แต่มันแสดงให้เห็นถึงคุณสมบัติทางภาษาที่ดี

(ไม่ขึ้นบรรทัดใหม่ให้ทำงานเหมือนruby dennis2.rb <<< '12012')


1

PHP, 144 ไบต์

<?php preg_match_all("/0?1?2?3?4?5?6?7?8?9?/",$argv[1],$n);foreach($n[0]as$i)if(strlen($i)&&($a=array_sum(str_split($i)))!=$s=$s??$a)die;echo 1;

ฉันแน่ใจว่ามีวิธีที่ฉลาดกว่า (และสั้นกว่า) ในการทำสิ่งนี้ แต่จะทำในตอนนี้


1

Python 2, 69 ไบต์

รับอินพุตเป็นสตริง

lambda I:len(set(eval(reduce(lambda x,y:x+',+'[y>x[-1]]+y,I+' '))))<2

คำอธิบาย:

อดีต 1201212012

แปลงเป็นรายการผลรวม:

1+2,0+1+2,1+2,0+1+2,

Evals และแปลงเป็นชุด

set([3])

หากความยาวของชุดคือ 1 ผลรวมทั้งหมดจะเท่ากัน


1

JavaScript (ES6), 58

s=>![...s,z=x=p=0].some(c=>[c>p?0:z-=(x=x||z),z-=p=c][0])

ใช้เคล็ดลับที่มีประโยชน์น้อยของฉันที่https://codegolf.stackexchange.com/a/49967/21348

มันจะสแกนสตริงถ่านโดยถ่านที่ระบุการทำงานของตัวอักษรจากน้อยไปหามากในตอนท้ายของแต่ละเหล้ารัมมันจะตรวจสอบว่าผลรวมอยู่เสมอเหมือนกัน

  • c: อักขระปัจจุบัน
  • p: อักขระก่อนหน้า
  • z: ผลรวมสะสมเมื่อสิ้นสุดการแข่งขันจะถูกเปรียบเทียบกับ ...
  • x: ผลรวมเพื่อเปรียบเทียบกับเมื่อเรียกใช้ครั้งแรกจะเท่ากับ z

ทดสอบ

f=
s=>![...s,z=x=p=0].some(c=>[c>p?0:z-=(x=x||z),z-=p=c][0])

function run()
{
  var i=I.value
  O.textContent = i + ' -> ' + f(i)
}

run()

test=`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`.split` `

numerr=0
for(i=1; i<1000; i++)
{
  v = i + '';
  r = f(v);
  ok = r == (test.indexOf(v) >= 0)
  if (!ok) console.log('Error',++numerr, v)
}  
if(!numerr) console.log('All test 1..999 ok')
<input id=I value=612324 type=number oninput='run()'>
<pre id=O>



0

ทับทิม, 117 105 85 ไบต์

# original (117):
j,k=0,?0;"#{i}".chars.group_by{|n|n>k||j=j+1;k=n;j}.values.map{|a|a.map(&:to_i).reduce(&:+)}.reduce{|m,n|n==m ?m:nil}

# inspired by PHP regexp approach (105):
"#{i}".scan(/0?1?2?3?4?5?6?7?8?9?/).map{|a|a.chars.map(&:to_i).reduce(&:+)}.reduce{|m,n|!n||n==m ?m:nil}

# some number comparison simplification (85):
!"#{i}".scan(/0?1?2?3?4?5?6?7?8?9?/).map{|a|a.chars.map(&:to_i).reduce(&:+)}.uniq[1]

นี่จะคืนค่าจำนวนเต็มของตัวเลขเดนนิสนี้หรือnilหากไม่ใช่ตัวเลขเดนนิส จำนวนเต็มทั้งหมดจะถูกพิจารณาว่าเป็นจริงในทับทิมและnilถือว่าเป็นเท็จ iเป็นจำนวนเต็มที่กำลังตรวจสอบอยู่

รุ่นที่สามจริงผลตอบแทนและtruefalse

PS ทดสอบเพื่อคืนค่าจำนวนเต็ม 172 จาก 1 ถึง 1,000 ตามคำตอบ


0

APL, 23 ไบต์

{1=≢∪+/↑N⊂⍨1,2>/N←⍎¨⍕⍵}

คำอธิบาย:

  • N←⍎¨⍕⍵: รับตัวเลขแต่ละตัวในการป้อนข้อมูลเก็บไว้ N
  • N⊂⍨1,2>/N: ค้นหารายการย่อยของตัวเลขที่เพิ่มขึ้นอย่างเคร่งครัด N
  • +/↑: รวมแต่ละรายการย่อย
  • 1=≢∪: ดูว่ารายการผลลัพธ์มีองค์ประกอบที่ไม่ซ้ำกันเพียงอย่างเดียวหรือไม่

0

เพิ่ม ++ , 109 ไบต์

D,g,@@#,BF1_B
D,k,@@#,bR$d@$!Q@BFB
D,f,@,BDdVÑ_€?1€_0b]$+€?dbLRBcB*BZB]GbL1+b]+qG€gd€bLÑ_0b]$+BcB]£k€¦+Ñ=1$ª=

ลองออนไลน์!

มันทำงานอย่างไร

fgkf

f(x)

x1[4,4,4]0110A010

[1,2,...length(A)]0AAAAA

ต่อไปเราจะใช้ฟังก์ชั่น helper ในฐานะที่เป็นเป็น dyadic (ใช้เวลา 2 ข้อโต้แย้ง) มันจะทำงานแตกต่างกันเล็กน้อยเมื่อจับคู่กับแต่ละผู้ประกอบการ ฟังก์ชัน Dyadic pop ค่าจากสแต็กและผูกค่านั้นเป็นอาร์กิวเมนต์ที่ถูกต้องเพื่อสร้างฟังก์ชัน monadic บางส่วน ฟังก์ชั่นบางส่วนนี้จะถูกแมปผ่านแต่ละองค์ประกอบในอาร์กิวเมนต์ นี่อาร์กิวเมนต์ขวาผูกพันเป็นตัวเลขของการป้อนข้อมูลและฟังก์ชั่นบางส่วนจะถูกจับคู่มากกว่า''ggA

g(x,y)

ลองมาดูที่เพียงหนึ่งทวนของที่และ3 โปรดทราบว่าเป็นดัชนีแรกในที่สัญญาณจากตรงกับมากกว่า0ในความเป็นจริงสำหรับเราจะเห็นว่า6] เป็นดัชนีที่ไม่เป็นศูนย์เพียงตัวเดียวในและคือความยาวของบวกหนึ่งg(x,y)x:=[1,2,0,1,2]y=33AA10x=12012A=[3,6]3A6x

ดังนั้นสำหรับสิ่งต่อไปนี้เกิดขึ้น: อันดับแรกเราสลับทั้งสองอาร์กิวเมนต์เพื่อให้สแต็กมีตัวเลขต่ำกว่าดัชนี จากนั้นเราจะแผ่อาร์เรย์และลดดัชนี เพื่อให้ห่างไกลสแต็คที่มีลักษณะดังนี้ จากนั้นเราจะทำการคำสั่งhead เราแสดงดัชนีจากด้านบนสุดของสแต็กและใช้อักขระจำนวนมากจากสแต็กเริ่มต้นที่ด้านล่าง อัตราผลตอบแทนนี้ซึ่งจะถูกส่งกลับแล้วโดยกรัมg([1,2,0,1,2],3)[1 2 0 1 2 2][1,2]g

ดังนั้นจะถูกแมปกับแต่ละองค์ประกอบซึ่งจะส่งคืนชุดคำนำหน้าของอินพุตที่มีความยาวเพิ่มขึ้นหลากหลาย ส่วนนี้จะได้รับความสับสนเล็กน้อยดังนั้นเราจะทำงานผ่านมันด้วยการป้อนข้อมูลตัวอย่างของ12012 หลังจากการทำแผนที่ของกองซ้อนในปัจจุบันดูเหมือนว่าg(x,y)yAx:=12012g

[[[1 2] [1 2 0 1 2]]]

จากนั้นเราจะผลักดันอาร์เรย์ที่มีความยาวของแต่ละแถวในองค์ประกอบด้านบนหรือในกรณีนี้อาร์เรย์5] นี่เป็นเช่นเดียวกับถ้าตัวดำเนินการแมป แต่ใช้ไบต์เพิ่มเติมเพื่อใช้ความสัมพันธ์นี้ ถัดไปข้างหน้าความแตกต่างของความยาวที่จะมาและจะใช้ได้ยอมในตัวอย่างนี้3] อาร์เรย์ใหม่นี้จะถูกบีบอัดพร้อมกับผลลัพธ์จากเพื่อสร้างและผู้ประกอบการstarmapรันบนแต่ละคู่[2,5]A10[0,3]gB

k(x,n)

starmapประกอบการใช้ฟังก์ชั่นเป็นอาร์กิวเมนต์ของตนและทำงานโดยการใช้ฟังก์ชั่น dyadic และอาร์เรย์ที่ซ้อนกัน อาร์เรย์จะต้องประกอบด้วยคู่เช่นและฟังก์ชัน dyadic จะถูกแมปกับแต่ละคู่โดยแต่ละองค์ประกอบของคู่เป็นซ้ายและขวา ข้อโต้แย้งตามลำดับk[[1,2],[3,4],[5,6]]

นี่คือตัวอย่างซ้อนอาร์เรย์ของเราคือและการทำงานของเราคือkเราจะเน้นที่ในตอนนี้[[[1,2],0],[[1,2,0,1,2],3]]kk([1,2,0,1,2],3)

g n = 0 [ n , x , n ] n = 0 [ [ 2 , 1 , 0 , 1 , 2 ] , 3 ] n x x Bk(x,n)เริ่มต้นคล้ายกับโดยการแลกเปลี่ยนสองอาร์กิวเมนต์เพื่อให้อาร์เรย์อยู่ด้านบนสุดของสแต็ก จากนั้นเรากลับอาร์เรย์และสลับอาร์กิวเมนต์กลับ ตอนนี้เราต้องการที่จะออกจากอาร์เรย์ไม่เปลี่ยนแปลงดังนั้นเราซ้ำจำนวนเต็มและหมุนด้านบนสามข้อโต้แย้งเพื่อให้สแต็คมีรูปแบบของN] ต่อไปเรากลับอาร์เรย์ถ้า0 มิฉะนั้นองค์ประกอบด้านบนจะถูกยกเลิกและเราจัดเรียงสแต็กกลับไปว่ามันเป็นอย่างไรกับอาร์เรย์ย้อนกลับที่ด้านล่างและจำนวนเต็มที่ด้านบนหรือในตัวอย่างของเรา: . จากนั้นเราจะแผ่กองและใช้ครั้งแรกองค์ประกอบของgn=0[n,x,n]n=0[[2,1,0,1,2],3]nx. องค์ประกอบเหล่านี้จะถูกส่งกลับแล้วและแทนที่ในBxB

สำหรับการป้อนข้อมูลของเรานี้จะส่งกลับ2] (การพูดอย่างเคร่งครัดก็จะส่งกลับแต่คำสั่งซื้อไม่สำคัญสำหรับส่วนที่เหลือของโปรแกรม)[ 2 , 1 , 0 ][0,1,2][2,1,0]

หลังจากถูกแมปกับแต่ละคู่เราจะหาผลรวมของแต่ละคู่แล้วตรวจสอบว่าแต่ละองค์ประกอบมีค่าเท่ากันโดยยืนยันว่าแต่ละคู่ข้างเคียงมีค่าเท่ากันแล้วยืนยันว่า การทดสอบความเสมอภาคเหล่านั้นส่งผลให้ (ค่าความจริง) ในที่สุดผลลัพธ์นี้จะถูกส่งกลับ( x , n ) B 1k(x,n)(x,n)B1

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.