ความปลอดภัยในตัวเลข


22

เขียนโปรแกรมเพื่อตรวจสอบว่ามีการเรียงลำดับธาตุของจำนวนเต็มบวกมีคุณสมบัติว่าสำหรับทุกจำนวนเต็มnเกิดขึ้นในลำดับที่มีไม่เกินnเลขอื่น ๆ nที่เกิดขึ้นระหว่างสองติดต่อกัน

ยกตัวอย่างเช่น2, 3, 5, 2, 3, 6, 2, 3, 5, 2, 3, 6, ...จะมีคุณสมบัตินี้: คู่เกิดขึ้นติดต่อกันของทุก2มีสองที่มากที่สุดจำนวนเต็มระหว่างพวกเขา (เช่น2, 3, 5, 2และ2, 3, 6, 2; คู่เกิดขึ้นติดต่อกันของทุก3มีที่มากที่สุดสามจำนวนเต็มระหว่างพวกเขาและเช่นเดียวกันสำหรับและ56

อย่างไรก็ตาม2, 3, 5, 2, 3, 4, 2, 3, 5, 2, 3, 4, ...ไม่ได้มีคุณสมบัตินี้: เกิดขึ้นสองครั้งติดต่อกัน4คือ4, 2, 3, 5, 2, 3, 4มีจำนวนมากกว่าสี่ระหว่างพวกเขา

อินพุต : การแทนค่าที่เป็นไปตามลำดับของเลขจำนวนเต็มบวก ตัวอย่างเช่นรายการที่ จำกัด เช่น{2, 3, 5, 2, 3, 6}สามารถแสดงลำดับอนันต์แรก2, 3, 5, 2, 3, 6, 2, 3, 5, 2, 3, 6, ...ข้างต้น (สำหรับเรื่องนั้นปัญหาอาจระบุได้สำหรับรายการที่ จำกัด ที่ล้อมรอบแทนที่จะเป็นรายการที่ไม่มีวันสิ้นสุด)

เอาท์พุท : มูลค่าความจริง / เท็จ

ตัวอย่างความจริง:

{1}
{8, 9}
{2, 3, 4}
{5, 5, 3, 3, 6}
{2, 3, 5, 2, 3, 6}
{6, 7, 3, 5, 3, 7}
{9, 4, 6, 7, 4, 5}
{1, 1, 1, 1, 1, 100, 1}
{1, 9, 1, 8, 1, 7, 1, 11}

ตัวอย่างที่เป็นเท็จ:

{1, 2, 3}
{2, 3, 9, 5}
{3, 5, 4, 4, 6}
{2, 3, 5, 2, 3, 4}
{3, 5, 7, 5, 9, 3, 7}
{5, 6, 7, 8, 9, 10, 11}
{1, 9, 1, 8, 1, 6, 1, 11}

นี่คือดังนั้นรหัสที่สั้นที่สุดชนะ สนับสนุนคำตอบในทุกภาษา


รายการอินพุตมีองค์ประกอบอย่างน้อยหนึ่งองค์ประกอบเสมอหรือไม่
nimi

2
@nimi ไม่เช่นนั้นมันจะไม่แสดงลำดับเป็นช่วงอนันต์
Martin Ender

1
หากคุณใช้ลำดับของมอร์สและเพิ่มจำนวนเต็มบวกคงที่ที่มากกว่า 1 ในแต่ละคำคุณจะมีลำดับอนันต์แบบ aperiodic กับคุณสมบัตินี้
SuperJedi224

คำตอบ:


7

Haskell, 60 57 56 55 ไบต์

f(a:b)=b==[]||length(fst$span(/=a)b)<=a&&f b
g x=f$x++x

สมมติว่ารายการอินพุตมีองค์ประกอบอย่างน้อยหนึ่งองค์ประกอบ

ตัวอย่างการใช้งาน: ->g [1] ลองออนไลน์!True

อนุญาตaเป็นหัวของรายการและbหาง ผลลัพธ์คือTrueถ้าbว่างเปล่าหรือจำนวนองค์ประกอบที่จุดเริ่มต้นของbสิ่งนั้นไม่เท่ากับหรือaมากกว่าaและการเรียกซ้ำของf bก็เป็นTrueอย่างอื่นFalseเช่นกัน เริ่มต้นด้วยรายการอินพุตสองครั้ง

แก้ไข: @Leo บันทึก 3 ไบต์ ขอบคุณ!

แก้ไข 2: @Laikoni บันทึก 1 ไบต์ ขอบคุณ!


การใช้ takeWhile แทนการขยายคุณสามารถหลีกเลี่ยงการจับคู่รูปแบบและบันทึกวิธีแก้ปัญหาที่ดีสามไบต์ได้ ! :)
Leo

@Leo: จับได้ดี! โดยปกติแล้วการใช้spanจะสั้นกว่าการใช้takeWhileดังนั้นฉันจึงไม่ได้มองเลย
nimi

takeWhileสามารถย่อให้สั้นมากfst$spanหรือfst.spanบันทึกไบต์อื่นได้
Laikoni

@Laikoni: ใช่แน่นอน! ขอบคุณ!
nimi

Love haskell;)
theonlygusti

6

Python , 57 56 ไบต์

-1 ไบต์ขอบคุณที่เดนนิส (แทนที่i+1:i+v+2ด้วยi:i-~vกับiชดเชยจาก 1 enumerate)

lambda a:all(v in(a+a)[i:i-~v]for i,v in enumerate(a,1))

ลองออนไลน์!

ฟังก์ชั่นที่ไม่มีชื่อการรายการaและการทดสอบเงื่อนไขที่ว่าแต่ละค่าvปรากฏinชิ้นที่เกี่ยวข้องกับสิทธิในการเรียงต่อกันของaด้วยตัวเอง(a+a)[i:i-~v]ที่ดัชนี 1-based ของvในa, i, enumerate(a,1)ให้บริการโดย


1
นั่นเป็นแรงบันดาลใจให้กับคำตอบ Jelly 8-byte :) คุณสามารถบันทึกไบต์เช่นนี้
Dennis

6

JavaScript (ES6), 67 65 55 54 51 49 ไบต์

บันทึก 3B ด้วย @ETHproductions และ 2B ขอบคุณ @Arnauld

a=>!a.some((b,c)=>a.concat(a).indexOf(b,++c)>b+c)

คำอธิบาย

ฟังก์ชันนี้กำหนดฟังก์ชันที่ใช้อาร์เรย์aเป็นอินพุต จากนั้น.someวิธีจะวนซ้ำในอาร์เรย์นั้นโดยเรียกใช้ฟังก์ชันอื่นสำหรับทุกองค์ประกอบ

ฟังก์ชั่นภายในนี้ใช้เวลาสองข้อโต้แย้งbและcมูลค่าปัจจุบันและดัชนีของมัน c + 1ฟังก์ชั่นพบว่าดัชนีของค่าปัจจุบันที่เริ่มต้นจากดัชนี จากนั้นจะตรวจสอบว่าดัชนีนี้มากกว่าค่าปัจจุบันบวกกับดัชนีปัจจุบัน (ความแตกต่างระหว่างการเกิดขึ้นสองครั้งที่มีค่าเดียวกันมากกว่าหรือไม่b) โปรดทราบว่าสิ่งนี้จะส่งกลับสิ่งที่เราต้องการตรงข้าม

หากหนึ่งในผลตอบแทนค่าเหล่านี้คือtrueการ.someกลับมาทำงานtrueได้เป็นอย่างดี หากไม่มีการตรวจสอบย้อนกลับtrueการกลับมาทำงาน.some falseตรงกันข้ามกับค่าที่เราต้องการคืนอีกครั้งดังนั้นผลลัพธ์นี้จึงถูกทำให้เป็นโมฆะและส่งคืนแล้ว

ทดสอบมัน

ลองกรณีทดสอบทั้งหมดที่นี่:

let f=
a=>!a.some((b,c)=>a.concat(a).indexOf(b,++c)>b+c)

let truthy = [[1], [8, 9], [2, 3, 4], [5, 5, 3, 3, 6], [2, 3, 5, 2, 3, 6], [6, 7, 3, 5, 3, 7], [9, 4, 6, 7, 4, 5], [1, 1, 1, 1, 1, 100, 1], [1, 9, 1, 8, 1, 7, 1, 11]];
let falsy  = [[1, 2, 3], [2, 3, 9, 5], [3, 5, 4, 4, 6], [2, 3, 5, 2, 3, 4], [3, 5, 7, 5, 9, 3, 7], [5, 6, 7, 8, 9, 10, 11], [1, 9, 1, 8, 1, 6, 1, 11]];

console.log("Truthy test cases:");
for (let test of truthy) {
    console.log(`${test}: ${f(test)}`);
}

console.log("Falsy test cases:");
for (let test of falsy) {
    console.log(`${test}: ${f(test)}`);
}


เยี่ยมมากนั่นคือสิ่งที่ฉันคิดขึ้นมาเช่นกัน :-) คุณสามารถสร้างอาเรย์สองเท่าได้ตั้งแต่เริ่มต้นและใช้.shift()เพื่อบันทึกในส่วน:a=>!a.some(b=>z.indexOf(z.shift())>b,z=a.concat(a))
ETHproductions

เฮ่นักกอล์ฟที่ยอดเยี่ยมก็คิดเหมือนกัน ;-) ฉันคิดว่าจะใช้กะเช่นกัน แต่ฉันไม่ได้ใช้เพราะมันกลับกลายเป็นอีกต่อไป การสร้างอาเรย์คู่หนึ่งครั้งและเลื่อนทุกครั้งนั้นฉลาดจริงๆ ขอบคุณ!
ลุค

จะa=>!a.some((n,i)=>a.concat(a).indexOf(n,++i)>n+i)ทำงานอย่างไร
Arnauld

ใช่แล้ว. ขอบคุณ!
ลุค

4

เยลลี่ 11 ไบต์

ṣZL
;çЀ<‘P

ลองออนไลน์!

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

;çЀ<‘P  Main link. Argument: A (array)

;        Concatenate A with itself.
 çD€     For each n in A, call the helper with left arg. A + A and right arg. n.
     ‘   Increment all integers in A.
    <    Perform element-wise comparison of the results to both sides.
      P  Take the product of the resulting Booleans.


ṣZL      Helper link. Left argument: A. Right argument: n

ṣ        Split A at all occurrences of n.
 Z       Zip to transpose rows and columns.
  L      Length; yield the number of rows, which is equal to the number of columns
         of the input to Z.

3

เยลลี่ขนาด 8 ไบต์

ṙJḣ"‘Œpċ

Insipred โดย@ JonathanAllan คำตอบของงูหลาม

ลองออนไลน์!

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

ṙJḣ"‘Œpċ  Main link. Argument: A (array)

 J        Yield the indicies of A, i.e., [1, ..., len(A)].
ṙ         Rotate; yield A, rotated 1, ..., and len(A) units rotated to the left.
    ‘     Increment; add 1 to all elements of A.
  ḣ"      Head zipwith; truncate the n-th rotation to length A[n]+1.
     Œp   Take the Cartesian product of all resulting truncated rotations.
       ċ  Count the number of times A appears in the result.

2

SWI-Prolog ขนาด 83 ไบต์

a(L,[H|R]):-nth0(X,R,H),H>=X,a(L,R);length(R,N),nth0(X,L,H),H>=N+X,a(L,R).
a(_,[]).


รายการควรจะป้อนสองครั้ง:

a([1,2,3],[1,2,3]).

หากสิ่งนี้ไม่ถือว่ายอมรับได้คุณอาจเพิ่มภาคแสดง

a(L):-a(L,L).

ซึ่งเพิ่ม 14 ไบต์พิเศษ

ลองออนไลน์


หมายเหตุ: คุณอาจทดสอบกรณีเท็จที่แตกต่างกันในคราวเดียวโดยแยกแบบสอบถามของคุณด้วย ';' (หรือ) และทดสอบกรณีจริงที่แตกต่างกันโดยแยกด้วย ',' (และ)

เช่นใช้ตัวอย่าง OP:

a([1],[1]),
a([8, 9],[8, 9]),
a([2, 3, 4],[2, 3, 4]),
a([5, 5, 3, 3, 6],[5, 5, 3, 3, 6]),
a([2, 3, 5, 2, 3, 6],[2, 3, 5, 2, 3, 6]),
a([6, 7, 3, 5, 3, 7],[6, 7, 3, 5, 3, 7]),
a([9, 4, 6, 7, 4, 5],[9, 4, 6, 7, 4, 5]),
a([1, 1, 1, 1, 1, 100, 1],[1, 1, 1, 1, 1, 100, 1]),
a([1, 9, 1, 8, 1, 7, 1, 11],[1, 9, 1, 8, 1, 7, 1, 11]).

และ

a([1, 2, 3],[1, 2, 3]);
a([2, 3, 9, 5],[2, 3, 9, 5]);
a([3, 5, 4, 4, 6],[3, 5, 4, 4, 6]);
a([2, 3, 5, 2, 3, 4],[2, 3, 5, 2, 3, 4]);
a([3, 5, 7, 5, 9, 3, 7],[3, 5, 7, 5, 9, 3, 7]);
a([5, 6, 7, 8, 9, 10, 11],[5, 6, 7, 8, 9, 10, 11]);
a([1, 9, 1, 8, 1, 6, 1, 11],[1, 9, 1, 8, 1, 6, 1, 11]).

2

PHP, 52 ไบต์

for(;$n=$argv[++$i];$$n=$i)!$$n|$i-$$n<$n+2?:die(1);

ใช้ลำดับจากอาร์กิวเมนต์บรรทัดคำสั่ง ออกด้วยรหัส1สำหรับความเท็จ0เพื่อความจริง ทำงานด้วย
-nr

  • วนซ้ำ$nผ่านอาร์กิวเมนต์:
    • หากไม่มีการเกิดขึ้นก่อนหน้านี้หรือเมื่อไม่นานมานี้
      ก็ไม่ต้องทำอะไรเลยมิฉะนั้นให้ออกด้วยรหัส1
    • จดจำการเกิดขึ้นก่อนหน้าใน$$n( ตัวแปรตัวแปร )
  • ออกด้วยรหัส0(โดยนัย)

บ้าชื่อตัวแปรของคุณไม่ถูกต้อง แต่ฉันชอบมัน
JörgHülsermann

2

เรติน่า 50 ไบต์

$
,$`
M!&`\b(1+),.*?\b\1\b
+%`(^1*)1,1+
$1
M`1,
^0

ป้อนข้อมูลเป็นรายการหมายเลข unary ที่คั่นด้วยเครื่องหมายจุลภาค

ลองออนไลน์!

คำอธิบาย

$
,$`

ทำซ้ำอินพุตเพื่อให้เราสามารถตรวจสอบขั้นตอนที่พันรอบ ๆ

M!&`\b(1+),.*?\b\1\b

การแข่งขันและผลตอบแทนแต่ละ (ที่สั้นที่สุด) 11,111,1,11ส่วนระหว่างสองเหมือนกันค่าเช่น

+%`(^1*)1,1+
$1

นำตัวเลขออกซ้ำ ๆ จากหมายเลขแรกพร้อมด้วยหมายเลขทั้งหมดหลังจากนั้น หากช่องว่างมีขนาดเล็กพอจะลบหมายเลขแรกทั้งหมด มิฉะนั้นตัวเลขอย่างน้อยหนึ่งหลักจะยังคงอยู่

M`1,

นับความถี่ที่1,ปรากฏในทุกบรรทัด หากปรากฏที่ใดก็ได้หนึ่งในขั้นตอนนั้นกว้างเกินไป

^0

พยายามจับคู่หมายเลขที่ขึ้นต้นด้วย0(เช่น0ตัวเองเท่านั้น) นี่เป็นการลบล้างตรรกะของเอาต์พุตอย่างมีประสิทธิภาพ


2

JavaScript (ES6), 47 ไบต์

a=>![...a,...a].some((n,i)=>a[-n]-(a[-n]=i)<~n)

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

เรากลับมาใช้อาร์เรย์การป้อนข้อมูลในการจัดเก็บตำแหน่งของการเกิดขึ้นพบล่าสุดของแต่ละจำนวนเต็มในa aเราใช้กุญแจสำคัญในการจัดเก็บตำแหน่งนี้เพื่อที่จะไม่ยุ่งเกี่ยวกับดัชนีเดิมของ-na

เมื่อa[-n]มีการทดสอบจริงเกิดขึ้น เมื่อa[-n]ไม่มีตัวตนนิพจน์จะa[-n] - (a[-n] = i)เท่ากับundefined - i == NaNและการเปรียบเทียบด้วยความ~nผิดพลาดเสมอซึ่งเป็นผลลัพธ์ที่คาดหวัง

กรณีทดสอบ


2

เรติน่า ,  41 39 ไบต์

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

$
,$`,
((1)+,)(?=(?<-2>1+,)*(\1|$))

^$

อินพุตคือรายการหมายเลข unary ที่คั่นด้วยเครื่องหมายจุลภาค เอาต์พุตเป็น0เท็จและ1เป็นจริง

ลองออนไลน์! (ชุดทดสอบที่แปลงโดยอัตโนมัติจากทศนิยม)

ฉันเพิ่งเรียนรู้เกี่ยวกับการสร้างสมดุลของกลุ่มดังนั้นฉันจึงอยากลองพวกเขา พวกเขาไม่ใช่เครื่องมือที่ง่ายที่สุดที่จะใช้ แต่มั่นใจว่ามีประสิทธิภาพ

คำอธิบาย

$
,$`,

เช่นเดียวกับการส่งอื่น ๆ เราทำซ้ำรายการเพื่อจัดการกับการห่อ นอกจากนี้เรายังเพิ่มเครื่องหมายจุลภาคในตอนท้ายดังนั้นทุกหมายเลขจะตามด้วยเครื่องหมายจุลภาค (ซึ่งจะทำให้สิ่งต่าง ๆ ง่ายขึ้นในภายหลัง)

((1)+,)(?=(?<-2>1+,)*(\1|$))

นี่คือสิ่งที่น่าสนใจ นี่คือขั้นตอนการแทนที่เราจะแทนที่ทุกสิ่งที่จับคู่ด้วยบรรทัดแรกกับบรรทัดที่สองในกรณีนี้เราต้องการลบหมายเลขทั้งหมดที่nไม่ได้ตามด้วยn+1หมายเลขอื่น ๆ

ในการทำเช่นนั้นเราจะจับคู่หมายเลขให้แต่ละ1กลุ่มเป็นกลุ่มแรก (จับหมายเลขกลุ่ม 2 ในกรณีนี้) จากนั้นด้วย lookahead ที่เป็นบวกเพื่อให้มีการยืนยันที่มีความกว้างเป็นศูนย์เราพยายามจับคู่ในกลุ่มที่มีการทรงตัวซ้ำ ๆ-2ซึ่งจะประสบความสำเร็จไม่เกินจำนวนการจับกุมที่ทำโดยกลุ่ม2ตัวเลขตามด้วยเครื่องหมายจุลภาค หลังจากลำดับของตัวเลขนี้เราจะพอใจถ้าเราไปถึงหมายเลขแรกอีกครั้งหรือจุดสิ้นสุดของบรรทัด

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

^$

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


1
เยี่ยมมาก! :) \bมีความจำเป็นในการไม่ได้ การลบออกจะทำให้เกิดการจับคู่ที่ผิดปกติ แต่จะไม่สามารถลบตัวเลขทั้งหมดดังนั้นคุณจะไม่ได้รับสตริงว่าง
Martin Ender

@MartinEnder คุณพูดถูกต้องขอบคุณ :)
Leo

1

เยลลี่ 11 ไบต์

ẋ2ĠṢI_2<"QȦ

ลองออนไลน์!

ẋ2ĠṢI_2<"QȦ  Main link. Argument: A (array)

ẋ2           Repeat A twice to account for wrap-around.
  Ġ          Group all indices of A + A by their respective values, sorting the
             index groups by the associated values.
   Ṣ         Sort the groups lexicographically, i.e., by first appearance in A.
    I        Increments; compute the forward differences of adjacent indices in
             each of the groups.
     _2      Subtract 2 from the differences.
         Q   Unique; yield A, deduplicated.
       <"    Compare all differences in the index group corresponding to the n-th
             unique value in A with the n-th unqiue value in A.
          Ȧ  All; yield 1 if and only if none of the comparisons returned 0.


1

Röda , 50 ไบต์

f a{seq 0,#a-1|[indexOf(a[_],a[_1+1:]..a)<=a[_1]]}

ลองออนไลน์!

ที่สุด! ฉันได้รับการรอคอย สำหรับความท้าทายนี้ ...

เป็นฟังก์ชันที่ส่งคืนค่าความจริงหรือค่าเท็จ ใช้เวลาหนึ่งอาร์กิวเมนต์อาร์เรย์

มัน iterates มากกว่ากระแสของดัชนีและการตรวจสอบสำหรับแต่ละดัชนี_1ว่าระยะทางของดัชนีในปัจจุบันและดัชนีต่อไปของไม่เกินa[_1]a[_1]


วิธีการว่าจะ_1ทำงานหรือไม่
Kritixi Lithos

@KritixiLithos มันเหมือน_แต่หมายถึงค่าที่ดึงมาก่อน หากฉันใช้หลาย ๆ ตัว_แต่ละตัวจะดึงค่าแยกต่างหาก ตัวอย่างเช่น[1, 2, 3] | print(_, _, _)พิมพ์123แต่[1,2,3] | print(_, _1, _1)พิมพ์111 222 333(แยกบรรทัด)
fergusq

0

05AB1E , 13 ไบต์

Dì©v®¦©yky›_P

ลองออนไลน์! หรือเป็นชุดทดสอบ

คำอธิบาย

Dì             # duplicate input and prepend the copy to the original
  ©            # store a copy in the register
   v           # for each element in the list
    ®          # push the list from register
     ¦©        # remove the first element and store a copy in the register
       yk      # get the index of the current element in the list
         y›_   # check if it's less than or equal to the current element
            P  # product of stack
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.