โปรแกรม Swap แบ่งครึ่งเพื่อทดสอบตัวหาร


19

สี่จำนวนเต็มดังนี้

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

  1. ที่สมบูรณ์แบบ ( OEIS A000396 ) ถ้าผลรวมของตัวหารที่เหมาะสมของNเท่ากับN ลำดับเริ่มต้นด้วย 6, 28, 496, 8128, 33550336, 8589869056, 137438691328, 2305843008139952128 ...
  2. refactorable ( OEIS A033950 ) ถ้าจำนวนของตัวหารของNเป็นตัวหารของN ลำดับเริ่มต้นด้วย 1, 2, 8, 9, 12, 18, 24, 36, 40, 56, 60, 72, 80, 84, 88, 96, 104, 108, 128 ...
  3. ปฏิบัติ ( OEIS A005153 ) ถ้าทุกจำนวนเต็ม1 ≤ K ≤ Nเป็นผลรวมของบางอย่างที่แตกต่างของตัวหารN ลำดับเริ่มต้นด้วย 1, 2, 4, 6, 8, 12, 16, 18, 20, 24, 28, 30, 32, 36, 40, 42, 48, 54, 56 ...
  4. คอมโพสิตสูง ( OEIS A002128 ) ถ้าจำนวนทุก1 ≤ K <Nมีตัวหารอย่างเคร่งครัดน้อยกว่าN ลำดับเริ่มต้นด้วย 1, 2, 4, 6, 12, 24, 36, 48, 60, 120, 180, 240, 360, 720, 840, 1260, 1680, 2520, 5040 ...

สี่โปรแกรม

งานของคุณคือการเขียนสี่โปรแกรม (หมายถึงโปรแกรมเต็มนิยามฟังก์ชันหรือฟังก์ชั่นที่ไม่ระบุชื่อที่ทำงาน I / O โดยใด ๆ ของวิธีการมาตรฐาน ) แต่ละโปรแกรมจะแก้ปัญหาการเป็นสมาชิกของหนึ่งในลำดับเหล่านี้ กล่าวอีกนัยหนึ่งแต่ละโปรแกรมจะใช้จำนวนเต็มบวกN ≥ 1เป็นอินพุตและส่งออกค่าจริงถ้าNอยู่ในลำดับและค่าเท็จถ้าไม่ คุณสามารถสันนิษฐานได้ว่าNอยู่ในขอบเขตของประเภทจำนวนเต็มมาตรฐานของภาษาการเขียนโปรแกรมของคุณ

โปรแกรมจะต้องเกี่ยวข้องในวิธีดังต่อไปนี้ มีสี่สายABCDเช่นนั้น

  1. AC เป็นโปรแกรมที่รับรู้ตัวเลขที่สมบูรณ์แบบ
  2. AD เป็นโปรแกรมที่รับรู้จำนวน refactorable
  3. BC เป็นโปรแกรมที่จดจำตัวเลขที่ใช้งานได้จริง
  4. BD เป็นโปรแกรมที่รับรู้ตัวเลขคอมโพสิตสูง

เกณฑ์การให้คะแนน

คะแนนของคุณคือความยาวทั้งหมด (เป็นไบต์) ของสตริงABCDหรือในคำอื่น ๆ จำนวนไบต์ทั้งหมดของสี่โปรแกรมหารด้วยสอง คะแนนต่ำสุดในแต่ละภาษาการเขียนโปรแกรมเป็นผู้ชนะ ใช้กฎมาตรฐานของ

ตัวอย่างเช่นถ้าสี่สตริงa{, b{n, +n}และ=n}?จากนั้นโปรแกรมที่สี่a{+n}, a{=n}?, b{n+n}และb{n=n}?, และคะแนนเป็น 2 + 3 + 3 + 4 = 12


คำตอบ:


6

JavaScript (ES6), 46 + 55 + 6 + 36 = 282 274 ... 158 143 ไบต์

A:

n=>(r=0,D=x=>x&&D(x-1,n%x||(r++?q-=x:q=n)))(n)

B:

n=>(q=(g=D=x=>x&&!(n%x||(g|=m>2*(m=x),0))+D(x-1))(m=n))

ค:

?!g:!q

D:

?(P=k=>--k?D(n=k)<q&P(k):1)(n):n%r<1

ผลที่ได้คือ 4 ฟังก์ชั่นที่ไม่ระบุชื่อที่ให้ truthy / ค่า falsy สำหรับปัจจัยการผลิตของตน ( AC, ADและBCให้true/ false, BDให้1/ 0)

ตัวอย่างการทดสอบ


1
ฉันชอบวิธีที่คุณกระจายรหัสจริงไปทั่วทั้ง 4 ส่วนและผสมกับ "เงื่อนไข" ซึ่งแตกต่างจากฉัน (ฉันมีรหัสในส่วน A และ B และ "เงื่อนไข" ในส่วน C และ D. )
Erik the Outgolfer

2

เยลลี่ , 8 + 17 + 2 1 + 2 = 29 28 ไบต์

A:

Æṣ⁼$Ædḍ$

B:

ÆDŒPS€QṢwRµṖÆdṀ<Ʋ

ค:

ƭ

D:

0?

สำหรับตัวเลขในทางปฏิบัติ (BC) 0นั้นผิดพลาดและผลลัพธ์อื่นใดที่เป็นจริง

AC และ BC เป็นโปรแกรมที่สมบูรณ์เนื่องจากไม่สามารถใช้งานซ้ำได้


BC และ BD ดูเหมือนว่าจะทำงานไม่ถูกต้อง
Jonathan Allan

ÆDŒPS€ḟ@RṆµṖÆd<ÆdẠµทำงานเป็น B ในราคาสองไบต์ (และทำให้ BC คืนค่า 0 และ 1 เหมือนกับที่อื่น ๆ )
Jonathan Allan

@JonathanAllan โอ้ไม่มันก็ดูเหมือนว่าฉันสับสนกับŒP ŒṖน่าละอาย! ใช้งานได้ไหมถ้าคุณแก้ไข (เช่นลองแก้ไขใหม่ของฉัน) ไม่ใช่ว่ามันง่ายมากที่จะทดสอบต่อไปนั่นคือเหตุผลที่ฉันยังไม่ได้รวมลิงค์ TIO
Erik the Outgolfer

0

Haskell , 69 + 133 + 3 + 3 = คะแนน 208

A:

d n=filter((<1).mod n)[1..n]
f n=[sum(d n)-n==n,length(d n)`elem`d n]

B:

import Data.List
d n=filter((<1).mod n)[1..n]
f n=[all(\n->any(==n)$sum$subsequences$d n)[1..n],all((<length(d n)).length.d)[1..n-1]]

ค:

!!0

D:

!!1

ลองออนไลน์!

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


1
ฉันไม่รู้เรื่อง Haskell มากนัก แต่สิ่งนี้สามารถช่วยคุณได้subsequences
Asone Tuhid

[x|x<-[1..n],mod n x<1]filter((<1).mod n)[1..n]จะสั้นกว่า
Laikoni
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.