Loeschian หมายเลขนี้หรือไม่


33

จำนวนเต็มบวกkคือจำนวน Loeschianถ้า

  • kสามารถแสดงเป็นi*i + j*j + i*jสำหรับi, jจำนวนเต็ม

ตัวอย่างเช่นหมายเลข Loeschian บวกแรกคือ: 1( i=1, j=0); 3( i=j=1); 4( i=2, j=0); 7( i=2, j=1); 9( i=-3, j=3); ... โปรดทราบว่าi, jหารับkไม่ได้ที่ไม่ซ้ำกัน ตัวอย่างเช่น9สามารถสร้างด้วยi=3, j=0.

ลักษณะอื่น ๆ ที่เทียบเท่าของตัวเลขเหล่านี้คือ:

  • kสามารถแสดงเป็นi*i + j*j + i*jสำหรับi, jintegers เชิงลบ (สำหรับคู่ของจำนวนเต็มแต่ละi, jมีคู่ของ integers เชิงลบที่ทำให้เดียวกันk)

  • มีชุดของkรูปหกเหลี่ยมที่ต่อเนื่องกันซึ่งก่อให้เกิด tesselation บนตารางหกเหลี่ยม (ดูภาพประกอบสำหรับk = 4และสำหรับk = 7) (เนื่องจากคุณสมบัตินี้ตัวเลขเหล่านี้ค้นหาแอปพลิเคชันในเครือข่ายการสื่อสารเคลื่อนที่เซลลูลาร์)

  • ดูการอธิบายลักษณะเพิ่มเติมในหน้า OEISของลำดับ

ความท้าทาย

รับจำนวนเต็มบวกออกผลลัพธ์จริงถ้ามันเป็นจำนวน Loeschianหรือผลเท็จ

โปรแกรมหรือฟังก์ชั่นควรจัดการ (พูดน้อยกว่าหนึ่งนาที) อินพุตได้มากถึง1000หรือ จำกัด ประเภทของข้อมูล

รหัสกอล์ฟ ชนะสั้นที่สุด

กรณีทดสอบ

ตัวเลขต่อไปนี้ควรให้ผลลัพธ์ที่เป็นจริง:

1, 4, 7, 12, 13, 108, 109, 192, 516, 999

ตัวเลขต่อไปนี้ควรให้ผลลัพธ์ที่ผิดพลาด:

2, 5, 10, 42, 101, 102, 128, 150, 501, 1000

ที่เกี่ยวข้อง (ตามที่ระบุไว้โดย @PeterTaylor)
Luis Mendo

หมายเหตุสำหรับอัลกอริทึมแรงเดรัจฉาน: ถ้าคุณทำซ้ำถึง reducek คุณจะลดความซับซ้อนของอัลกอริทึมจาก O (n²) ถึง O (n) โดยมีค่าใช้จ่ายบางไบต์ c;
ร็อด

i, j non-negative integersหรือ9 (i=-3, j=3)- อันไหนล่ะ?
ติตัส

1
@Titus โอ้ตอนนี้ฉันเห็น สำหรับจำนวนเต็มแต่ละคู่ i, j มีคู่ที่ไม่เป็นลบที่ให้ค่า k เท่ากัน
Luis Mendo

คำตอบ:


17

เยลลี่ , 11 9 ไบต์

ÆF‘%3,2ḄȦ

ลองออนไลน์! หรือตรวจสอบกรณีทดสอบทั้งหมด

พื้นหลัง

ในผลการเรียนเบื้องต้นในรูปแบบสมการกำลังสองไบนารีa² + ab + b²ผู้เขียนพิสูจน์ทฤษฎีบทต่อไปนี้เกี่ยวกับตัวเลขLöschian

ทฤษฎีบท 16. เงื่อนไขที่จำเป็นและเพียงพอของจำนวนเต็มไม่ใช่เชิงลบที่จะอยู่ในรูปแบบรฒร + AB + b² คือว่าในตัวประกอบที่สำคัญของช่วงเวลาอื่น ๆ ทั้งหมดกว่า 3 ที่ไม่ได้อยู่ในรูปแบบ (6k + 1) ได้แม้แต่ เลขยกกำลัง

ตามที่ระบุไว้ในหน้า OEIS ที่เกี่ยวข้องเนื่องจากจำนวนเต็มทั้งหมดสอดคล้องกับ0 , 1หรือ2 modulo 3จำนวน3เป็นเพียงนายกที่สอดคล้องกับ0และตัวเลขทั้งหมดของรูปแบบ(6k + 1)จะสอดคล้องกับ1ทฤษฎีบทสามารถระบุผลัดกันได้ดังนี้

จำนวนเต็มไม่เป็นลบ n เป็นจำนวนLöschianเฉพาะในกรณีที่ปัจจัยสำคัญทั้งหมดของ n ที่สอดคล้องกับ 2 โมดูโล 3 มีเลขชี้กำลัง

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

ÆF‘%3,2ḄȦ  Main link. Argument: n (integer)

ÆF         Yield the prime factorization of n, as prime-exponent pairs.
  ‘        Increment all primes and exponents, turning primes of the form 3k - 2
           into multiples of 3 and odd exponents into multiples of 2.
   %3,2    Reduce all incremented primes/exponents modulo 3/2.
           n is Löschian if and only if this does not result in a [0, 0] pair.
           Due to Jelly's form of vectorization, this yields [3, 2] if n = 1.
       Ḅ   Unbinary; convert each pair from base 2 to integer.
           Note that [x, y] = [0, 0] if and only if 2x + y = 0.
        Ȧ  All; return 1 if the result contains no zeroes, 0 otherwise.

17

เรติน่า , 66 63 45 43 36 ไบต์

^()(\1(?<1>.\1))+(\1(.(?(4).\4)))*$

แม้จะมีชื่อเรื่องว่า Retina แต่นี่เป็นเพียง regex. NET แบบธรรมดาซึ่งยอมรับการแสดงตัวเลข Loeschian

อินพุต 999 และ 1,000 ทำได้ดีในเสี้ยววินาที

ลองออนไลน์! (บรรทัดแรกเปิดใช้งานชุดทดสอบที่แยกบรรทัดด้วยฟีดและอีกสองรายการจะดูแลการแปลงเป็นเอกเพื่อความสะดวก)

คำอธิบาย

วิธีการแก้ปัญหานั้นขึ้นอยู่กับการจำแนกประเภทที่อินพุตสามารถเขียนได้ทั้งแบบi*i + j*(i + j)บวกiและไม่ลบj(เนื่องจากเราไม่ต้องจัดการอินพุต0) และนั่นn*nเป็นเพียงผลรวมของnจำนวนเต็มคี่แรก การตีกอล์ฟนี่เป็นแบบฝึกหัดที่น่าสนใจในการอ้างอิงล่วงหน้า

"การอ้างอิงไปข้างหน้า" คือเมื่อคุณใส่ backreference ภายในกลุ่มที่อ้างอิง แน่นอนว่าใช้ไม่ได้เมื่อกลุ่มถูกใช้เป็นครั้งแรกเนื่องจากยังไม่มีสิ่งใดที่จะต้องอ้างอิงกลับ แต่ถ้าคุณใส่สิ่งนี้ไว้ในลูป ในทางกลับกันคุณสามารถสร้างการจับภาพที่ใหญ่ขึ้นด้วยการวนซ้ำแต่ละครั้ง สิ่งนี้สามารถใช้เพื่อสร้างรูปแบบที่กะทัดรัดมากสำหรับสิ่งต่าง ๆ เช่นหมายเลขสามเหลี่ยมสี่เหลี่ยมและหมายเลขฟีโบนักชี

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

(^.|..\1)+$

ในการทำซ้ำครั้งแรก..\1ไม่สามารถทำงานได้เพราะ\1ยังไม่มีคุณค่า ดังนั้นเราจึงเริ่มต้นด้วยการจับตัวเดียวในกลุ่ม^. 1ในการวนซ้ำครั้งต่อไปจะ^.ไม่ตรงกันอีกต่อไปเนื่องจากสมอ แต่ตอนนี้..\1ใช้ได้ มันตรงกับตัวละครสองตัวมากกว่าซ้ำก่อนหน้านี้และปรับปรุงการจับภาพ วิธีนี้เราจับคู่กับการเพิ่มตัวเลขคี่รับสี่เหลี่ยมหลังจากการวนซ้ำแต่ละครั้ง

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

แต่ฉันคิดหาวิธีที่แตกต่างในการเขียน "ผลรวมของจำนวนเต็มคี่ที่ต่อเนื่องกัน" นี้ซึ่งให้ผลiในกลุ่มการจับที่ท้ายที่สุด แน่นอนiเลขคี่ TH 2i-1เป็นเพียง สิ่งนี้ทำให้เรามีวิธีเพิ่มการอ้างอิงไปข้างหน้าเพียง 1 ครั้งในการทำซ้ำแต่ละครั้ง นั่นคือส่วนนี้:

^()(\1(?<1>.\1))+

สิ่งนี้()จะผลักการจับภาพที่ว่างเปล่าไปยังกลุ่ม1(เริ่มต้นiไปที่0) นี่เป็น^.|วิธีที่ง่ายกว่าวิธีแก้ปัญหาข้างต้น แต่การใช้งาน|ในกรณีนี้จะค่อนข้างยุ่งยาก

(\1(?<1>.\1))แล้วเรามีวงหลัก \1ตรงกับก่อนหน้านี้i, (?<1>.\1)จากนั้นปรับปรุงกลุ่มด้วย1 i+1ในแง่ของใหม่ iเราเพิ่งจับคู่2i-1ตัวละคร สิ่งที่เราต้องการ

เมื่อเราทำเสร็จแล้วเราได้จับคู่สี่เหลี่ยมจตุรัสi*iและกลุ่ม1ยังคงมีiตัวละครอยู่

ส่วนที่สองนั้นอยู่ใกล้กับการจับคู่สี่เหลี่ยมจัตุรัสอย่างง่ายที่ฉันได้แสดงไว้ด้านบน ตอนนี้เราไม่สนใจ backreference 1:

(.(?(4).\1))*

นี่เป็นพื้นเดียวกัน(^.|..\4)*ยกเว้นว่าเราไม่สามารถใช้^เพราะเราไม่ได้อยู่ที่จุดเริ่มต้นของสตริง แต่เราใช้เงื่อนไขเพื่อจับคู่เพิ่มเติม.\1เฉพาะเมื่อเราใช้กลุ่ม4แล้ว แต่ในความเป็นจริงมันก็เหมือนกัน j*jนี้จะช่วยให้เรา

สิ่งเดียวที่ขาดหายไปคือj*iคำศัพท์ เรารวมสิ่งนี้เข้ากับj*jโดยใช้ประโยชน์จากความจริงที่ว่าการj*jคำนวณยังต้องใช้jการวนซ้ำ ดังนั้นสำหรับแต่ละซ้ำเรายังก้าวไปเคอร์เซอร์โดยมีi \1เราแค่ต้องแน่ใจว่าจะไม่เขียนลงในกลุ่ม4เพราะมันจะยุ่งกับตัวเลขคี่ที่ต่อเนื่องกัน นั่นเป็นวิธีที่เรามาถึง:

(\1(.(?(4).\1)))*

2
ยิ่งฉันอ่านสิ่งนี้มากเท่าไรฉันก็ยิ่งเข้าใจน้อยเท่านั้น ฉันต้องการทราบว่า regex จำนวนมาก
Javier Diaz

@JavierDiaz มีชุดของโพสต์ที่อธิบายการอ้างอิงไปข้างหน้าใน Stack Overflow ตาม Java regex ตัวอย่างอาจมีความเรียบง่ายกว่าเล็กน้อย
Martin Ender

13

CJam ( 16) 15 ไบต์)

{mF{~\3%2=&},!}

การสาธิตออนไลน์

นี่คือบล็อก ("ฟังก์ชันที่ไม่ระบุชื่อ") ซึ่งรับอินพุตในสแต็กและใบไม้0หรือ1บนสแต็ก มันใช้คุณสมบัติที่เป็นตัวเลขถ้า Loeschian ถ้ามันไม่มีตัวประกอบสำคัญเท่ากับ 2 mod 3 ที่มีหลายหลากคี่

ขอบคุณเดนนิสสำหรับการประหยัดหนึ่งไบต์


ว้าวตัวละครที่ดี!
Luis Mendo


6

Haskell, 42 ไบต์

f k=or[k==i*i+j*j+i*j|i<-[0..k],j<-[0..i]]

ตัวอย่างการใช้: f 501->False ->

พยายามอยู่รวมกันทั้งหมดiจาก0ไปkและjจากไป0 ผลตอบแทนถ้าความเสมอภาคiorTruek==i*i+j*j+i*jถือเป็นเวลาอย่างน้อยหนึ่งในชุดค่าผสม

@flawr พบรุ่นที่แตกต่างกันเล็กน้อยโดยมีจำนวนไบต์เดียวกัน:

f k|v<-[0..k]=or[(i+j)^2==k+i*j|i<-v,j<-v]

ผมไม่ทราบว่าเกี่ยวกับorเย็น =) บางทีคุณอาจมีความคิดวิธีการใช้ถ้อยคำกอล์ฟนี้ทางเลือก: f k|v<-[0..k]=or[(i+j)^2==k+i*j|i<-v,j<-v]?
ข้อบกพร่อง

@ flawr: ไม่ทราบวิธีการตีรุ่นของคุณต่อไป หากคุณไม่รังเกียจฉันจะเพิ่มคำตอบของฉันเป็นรุ่นอื่น
nimi

5

Java 8, 81 ไบต์

k->{for(int i=0,j;i<=k;i++)for(j=0;j<=k;)if(i*i+j*j+i*j++==k)return 1;return 0;};

ใช้งานง่ายไร้เดียงสา รหัสเดียวกันบังเอิญเป็น C # แต่การใช้งานมากกว่า->=>


;สามน้อยไบต์เพราะคุณสามารถละเว้นวงเล็บปีกกาและสิ้นสุด ประณาม!
TheLethalCoder

@TheLethalCoder ฉันทำไม่ได้จริงฉันทำผิด - นับไบต์เดียวกันกับ C #
Justin

ทำให้ฉันรู้สึกดีขึ้นอยู่แล้ว :)
TheLethalCoder

doesn't นี้ดูเหมือนจะทดสอบเชิงลบหรือi j
ติตัส


4

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

1 ไบต์ขอบคุณไมล์

²S+P
‘ṗ2’Ç€i

ลองออนไลน์!

ตรวจสอบ testcases

คำแนะนำเมื่อทดสอบตัวเลขจำนวนมาก (ใหญ่กว่า 50): ไม่

ความจริงเป็นจำนวนบวก Falsey เป็นศูนย์

คำอธิบาย

‘ṗ2’Ç€i   main chain, argument: z
‘ṗ2’      generate all pairs of numbers between 0 and z inclusive
    ǀ    apply the helper link to each pair
      i   find the index of z in the result

²S+P   helper link, argument: [x,y] (a pair of numbers)
²      compute [x*x, y*y]
 S     x*x+y*y
  +P   x*x+y*y+x*y

ถูกผูกไว้ (สำหรับ) ตอนนี้ ... :-)
Luis Mendo

เราควรใช้ประโยชน์จากคุณลักษณะของเปโตร ... ?
Luis Mendo

@ LuisMendo ดูเหมือนว่าน่าสนใจ แต่ดูเหมือนว่ามันจะนานขึ้น
Leaky Nun

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

@ ไมลส์ฉลาดขอบคุณ
Leun Nun


3

MATL , 14 13 ไบต์

t:0hU&+HM&*+m

ลองออนไลน์! หรือตรวจสอบกรณีทดสอบทั้งหมด

ขาออกหรือ10

คำอธิบาย

t:    % Implicitly input number k. Duplicate. Generate vector [1 2 ...k]
0h    % Concatenate a 0. Gives [1 2 ... k 0]
U     % Square, element-wise. Gives [1 4 ... k^2 0]
&+    % Sum of all pairs from this vector. Gives a (k+1)×(k+1) matrix
HM    % Push [1 2 ... k 0] again
&*    % Product of all pairs from this vector. Gives a (k+1)×(k+1) matrix
+     % Add the two matrices
m     % True if k is a member of the resulting matrix. Implicitly display

คุณเพิ่งออกจากสนามกอล์ฟเยลลี่หรือไม่?
Leun Nun

@LeakyNun มาดูกันว่ามันจะอยู่ได้นานเท่าไหร่ บางทีฉันอาจชะลอการอธิบายรหัสเล็กน้อย :-P
Luis Mendo


ตาคุณ - - -
แม่ชี

@LeakyNun Aw :-( ตอนนี้ฉันสามารถเพิ่มคำอธิบาย :-)
Luis Mendo

3

Python ขนาด 49 ไบต์

lambda n:0in[(n-3*i*i+0j)**.5%1for i in range(n)]

ใช้รูปแบบสมการกำลังสองเทียบเท่าได้รับใน OEIS n == 3*i*i+j*jของ ตรวจสอบว่าn-3*i*iเป็นรูปสี่เหลี่ยมจัตุรัสที่สมบูรณ์แบบสำหรับใด ๆiโดยการหาสแควร์รูทและตรวจสอบว่ามันเป็นจำนวนเต็มหรือเท่ากับ 0 โมดูโล 1 โปรดทราบว่า Python คำนวณรากที่สองของสี่เหลี่ยมที่สมบูรณ์แบบโดยไม่ผิดพลาดจุดลอย +0jทำให้มันเป็นตัวเลขที่ซับซ้อนในการหลีกเลี่ยงข้อผิดพลาดในรากที่สองของลบ


3

C (gcc), 71 69 ไบต์

i,j,r;f(n){for(r=i=n+1;i--;)for(j=n;j--;)r*=n!=i*i+j*j+i*j;return!r;}

69 i,j,r;f(n){for(r=i=n+1;i--;)for(j=n;j--;)r*=n!=i*i+j*j+i*j;return!r;}ไบต์:
owacoder

doesn't นี้ดูเหมือนจะทดสอบเชิงลบหรือi j
ติตัส

@Titus คำถามคำสั่งที่ไม่ใช่เชิงลบและi j
orlp

บวกkแต่ไม่ได้และi jลองดูตัวอย่างให้ละเอียด
ติตัส

@Titus Quoting ความท้าทายจาก: " kสามารถแสดงเป็นi*i + j*j + i*jสำหรับi, j ที่ไม่ใช่เชิงลบจำนวนเต็ม." คุณมองใกล้ ๆ
orlp

2

C #, 84 82 81 ไบต์

k=>{for(int i=0,j;i<=k;++i)for(j=0;j<=k;)if(i*i+j*j+i*j++==k)return 1;return 0;};

ทางออกไร้เดียงสา 1 = จริง, 0 = เท็จ


2

VBA, 68 67 ไบต์

Function L(N):For a=0To N:For b=0To a:L=L+(N=a^2+a*b+b^2):Next b,a

การค้นหาที่ไร้เดียงสาเริ่มช้าลงเล็กน้อยสำหรับ n = 1,000 Excel รับรู้ผลตอบแทนเป็นศูนย์เป็นเท็จและผลตอบแทนอื่น ๆ ทั้งหมดเป็นความจริง

โปรดทราบว่าไม่จำเป็นต้องทำการสอบสวนค่าลบiและjเนื่องจากได้รับi> j> = 0 :

(-i) 2 + (-i) (- j) + (-j) 2 = i 2 + ij + j 2

(ผลลัพธ์เดียวกันกับฉันและj )

(-i) 2 + (-i) j + j 2 = ฉัน2 - ij + j 2

ฉัน2 + i (-j) + (-j) 2 = ฉัน2 - ij + j 2

(ถ้ามีค่าลบมันไม่สำคัญว่าอันไหน) และจากนั้น

(ij) 2 + (ij) j + j 2 = (i 2 - 2ij + j 2 ) + (ij - j 2 ) + j 2 = i 2 - ij + j 2

และเนื่องจากทั้งสอง(ij)และjไม่เป็นลบตัวเลขใด ๆ ของหมายเลข Loeschian ที่เกี่ยวข้องกับจำนวนลบสามารถทำได้โดยใช้ตัวเลขที่ไม่เป็นลบ


บันทึกเป็นไบต์Next:Next-> Next b,aขอบคุณ Taylor Scott


doesn't นี้ดูเหมือนจะทดสอบเชิงลบหรือi j
ติตัส

ดูจุดแรกภายใต้ "ลักษณะอื่นที่เทียบเท่า" โปรดทราบว่ากรณีทดสอบทั้งหมดเกิดขึ้นอย่างถูกต้อง ฉันจะเพิ่มความชอบธรรมทางคณิตศาสตร์ให้กับคำตอบของฉัน (ถ้าทำได้)
Joffan

ขอโทษด้วยนะความผิดของฉัน overread ที่ไม่จำเป็น
ติตัส

@Joffan คุณสามารถรวมตัวNext:Nextเพื่อNext b,a
เทย์เลอร์สกอตต์

@Joffan กำลังมองหาวิธีการแก้ปัญหาของคุณอีกครั้งอาจเป็นเพราะการขาดหายไป:End Functionในตอนท้ายของการแก้ปัญหาของคุณ
Taylor Scott

1

Javascript (ใช้ไลบรารีภายนอก - นับได้) (63 ไบต์)

k=>_.Range(0,k+1).Any(i=>_.Range(0,k+1).Any(j=>i*i+j*j+i*j==k))

เชื่อมโยงไปยังห้องสมุด: https://github.com/mvegh1/ คำอธิบายรหัสนับจำนวน: สร้างช่วงของจำนวนเต็มตั้งแต่ 0 ถึง k (เรียกช่วงนี้ว่า "i") และทดสอบว่า "i" ตรงกับคำกริยาหรือไม่ เพรดิเคตนั้นจะสร้างช่วงจาก 0 ถึง k (เรียกสิ่งนี้ว่าช่วง "j") และทดสอบว่า "j" ใดตรงกับภาคที่แน่นอน เพรดิเคตนั้นเป็นสูตร loeschian

enter image description here


1

Perl 6 ,  52 51  50 ไบต์

->\k{?first ->(\i,\j){k==i*i+j*j+i*j},(0..k X 0..k)}
->\k{?grep ->(\i,\j){k==i*i+j*j+i*j},(0..k X 0..k)}

{?grep ->(\i,\j){$_==i*i+j*j+i*j},(0..$_ X 0..$_)}

คำอธิบาย:

{
  # Turn the following into a Bool
  # ( Technically not necessary as a list of 1 or more values is truthy )
  ?

  # find all where the code block returns a truthy value
  grep

  # pointy block that takes one value (list of 2 values)
  # and gives each of the values in it a name
  ->
    $ ( \i, \j )
  {
    # return true if the definition matches
    $_ == i*i + j*j + i*j
  },

  # a list of 2 element lists (possible i and j values)
  ( 0..$_ X 0..$_ )
}

ทดสอบ:

use v6.c;
use Test;

my @true = 0, 1, 4, 7, 12, 13, 108, 109, 192, 516, 999;
my @false = 2, 5, 10, 42, 101, 102, 128, 150, 501, 1000;

plan (@true + @false) * 2;

my &is-loeschian = {?grep ->(\i,\j){$_==i*i+j*j+i*j},(0..$_ X 0..$_)}

for |(@true X True), |(@false X False) -> ( $input, $expected ) {
  my ($result,$seconds) = $input.&time-it;
  is $result, $expected, ~$input;
  cmp-ok $seconds, &[<], 60, "in $seconds seconds"
}

sub time-it ( $input ) {
  my $start = now;
  my $result = $input.&is-loeschian;
  my $finish = now;
  return ( $result, $finish - $start )
}
1..42
ok 1 - 0
ok 2 - in 0.00111763 seconds
ok 3 - 1
ok 4 - in 0.00076766 seconds
...
ok 19 - 516
ok 20 - in 0.19629727 seconds
ok 21 - 999
ok 22 - in 0.1126715 seconds
ok 23 - 2
ok 24 - in 0.0013301 seconds
ok 25 - 5
ok 26 - in 0.00186610 seconds
...
ok 37 - 150
ok 38 - in 0.83877554 seconds
ok 39 - 501
ok 40 - in 9.2968558 seconds
ok 41 - 1000
ok 42 - in 37.31434146 seconds

doesn't นี้ดูเหมือนจะทดสอบเชิงลบหรือi j
ติตัส

@Tios the (0..$_ X 0..$_)ผลิตรายการที่ว่างเปล่าถ้า$_น้อยกว่า0ดังนั้นจึงไม่จำเป็นต้องตรวจสอบเชิงลบiและjเพราะพวกเขาจะไม่ลบ เนื่องจากมันควรจะสร้างขึ้นมาTrueเพื่อจำนวน Loeschian ที่เป็นบวกเท่านั้นฉันจึงไม่ต้องทำอะไรเป็นพิเศษสำหรับกรณีที่เป็นลบ
แบรดกิลเบิร์ต b2gills

9 = (3*3)+(-3*-3)+(3*-3)เป็น Loeschian บวกกับi=3, j=-3; แต่ฉันว่าทุก overread จำนวน Loeschian มีที่ไม่ใช่เชิงลบและi jดังนั้นการหาตัวเลขติดลบจึงไม่จำเป็น ดังนั้นเราสามารถลบความคิดเห็นเหล่านั้นได้ ขออภัยที่ทำบาป ความผิดของฉัน.
ติตัส

@Titus ปรับเปลี่ยนรหัสเพื่อผลในการ{grep ->(\i,\j){$_==i*i+j*j+i*j},(-$_..$_ X -$_..$_)}(9) ((-3,0),(-3,3),(0,-3),(0,3),(3,-3),(3,0))จริงๆแล้วฉันอาจจะดัดแปลงมันจากคำตอบอื่น ๆ
แบรดกิลเบิร์ต b2gills

1

PowerShell v2 +, 63 56 55 ไบต์

param($k)(0..$k|%{0..($i=$_)|%{$i*($i+$_)+$_*$_}})-eq$k

รับอินพุต$kวนซ้ำสองครั้ง (วนรอบนอก$i = 0 to $k, วงใน$j = 0 to $i), การวนซ้ำแต่ละครั้งจะสร้างผลลัพธ์ของi*i + j*j + i*j(สั้นลงไปi*(i+j) + j*j) ผลการค้นหาเหล่านั้นจะถูกห่อหุ้มใน parens -eq$kและผ่านเป็นแถวไปยัง สิ่งนี้ทำหน้าที่เป็นตัวกรองเพื่อเลือกเฉพาะองค์ประกอบที่เท่ากับอินพุต ส่งออกไม่ใช่ศูนย์ (ตัวเลขกลับ) สำหรับความจริงหรือไม่มีอะไร (ว่าง) สำหรับความเท็จ ดำเนินการ1000ในประมาณ 15 วินาทีบนเครื่องของฉัน

กรณีทดสอบ

PS C:\Tools\Scripts\golfing> (1,4,7,12,13,108,109,192,516,999|%{.\loeschian-numbers.ps1 $_})-join','
1,4,7,12,13,108,109,192,516,999

PS C:\Tools\Scripts\golfing> (2,5,10,42,101,102,128,150,501,1000|%{.\loeschian-numbers.ps1 $_})-join','

PS C:\Tools\Scripts\golfing>

1

Perl, 54 + 1 ( -nแฟล็ก) = 55 ไบต์

for$i(0..$_){for$j(0..$_){$i*$i+$j*$j+$i*$j-$_?1:say}}

ความต้องการ-nและ-M5.010แฟล็กที่จะรัน:

perl -nE 'for$i(0..$_){for$j(0..$_){$i*$i+$j*$j+$i*$j-$_?1:say}}'

แสดงผลข้อมูลบางอย่างถ้าจำนวนนั้นเป็นจำนวน Loeschian และไม่มีอะไรอื่น

การนำไปใช้งานนี้ค่อนข้างน่าเบื่อดังนั้นนี่จึงเป็นอีกอันสำหรับ 87 ไบต์ตาม regex สำหรับสายตา:

perl -pE '$_=(1 x$_)=~/^(.*)(??{$1x(-1+length$1)})(.*)(??{$2x(-1+length$2)})(??{$1x length$2})$/'

ระวังด้วยอันนี้เนื่องจากการย้อนรอยจะใช้หน่วยความจำมากดังนั้นอย่าพยายามทดสอบตัวเลขที่ใหญ่เกินไป! (โดยเฉพาะตัวเลขที่ไม่ใช่ Loeschians)


1

Dyalog APL ขนาด 19 ไบต์

⊢∊(∘.(×-⍨2*⍨+)⍨0,⍳)

ตรวจสอบว่าk ∊ ( i + j ) ² - ijสำหรับ 0 ≤ i , jkใด ๆ

    คือk
เป็นสมาชิก
    ∘.รวมกันทั้งหมดของ
        × ฉันครั้งเจ
        -⍨หักออกจาก
        2*⍨ตารางของ
        + ผมบวก
    ทั้งหมดของฉัน และ เจใน
    0,ศูนย์ใช้ได้กับ
    เลข 1 ถึงk

1000 ใช้เวลา 3.3 วินาทีบน M540 ของฉันและแม้แต่น้อยในTryAPL


1

Matlab, 53 52 ไบต์

n=input('');[a b]=ndgrid(0:n);find((a+b).^2-a.*b==n)

ค้นหาง่ายกว่าความเป็นไปได้ทั้งหมด
ส่งออกอาร์เรย์ที่ว่างเปล่าเป็นเท็จและเวกเตอร์ที่ไม่ว่างเปล่าเป็นค่าความจริง

การพิจารณาเมทริกซ์แบบศูนย์ทั้งหมดเป็นเมทริกซ์ที่ผิดพลาดและไม่ได้เป็นศูนย์แบบเต็มเท่าความจริงเราสามารถกำจัดfindฟังก์ชันที่เป็นผลลัพธ์ในโซลูชัน47 46 ไบต์ :

n=input('');[a b]=ndgrid(0:n);(a+b).^2-a.*b==n

บันทึกหนึ่งไบต์ต้องขอบคุณ@flawr


1
(a+b).^2-a.*b==nสั้นกว่า
ข้อบกพร่อง

1

C, 66 ไบต์

โทร f()ไปที่หมายเลขเพื่อทดสอบ ฟังก์ชันส่งคืนจำนวนโซลูชันที่พบ

q,r;f(n){for(r=q=0;q++<n*n;r+=n==q%n*(q%n+q/n)+q/n*q/n);return r;}

ลองบน ideone


1

Mathematica ขนาด 44 ไบต์

MemberQ[(+##)^2-##&@@@0~Range~#~Tuples~2,#]&

ฟังก์ชั่นที่ไม่มีชื่อการจำนวนเต็มเป็น input และกลับมาหรือTrue Falseคำสั่ง0~Range~#~Tuples~2สร้างคู่สั่งของจำนวนเต็มทั้งระหว่างและใส่0 #ฟังก์ชัน(+##)^2-##&คำนวณกำลังสองของผลรวมของข้อโต้แย้งลบด้วยผลคูณของข้อโต้แย้ง เมื่อเรียกสองข้อโต้แย้งiและjนี่คือสิ่งi^2+j^2+ijที่ต้องการ ดังนั้นฟังก์ชั่นนั้นถูกเรียกใช้บน tuples ทั้งหมดจากนั้นMemberQ[...,#]ตรวจสอบว่าอินพุตเป็นหนึ่งในค่าผลลัพธ์หรือไม่


1

ASP, 39 + 4 = 43 ไบต์

o:-k=I*I+J*J+I*J;I=1..k;J=1..k.:-not o.

ผลลัพธ์: ปัญหาเป็นที่น่าพอใจถ้าหาก k เป็น Loeschian

คำตอบ Set Programmingเป็นภาษาแบบลอจิคัลคล้ายกับภาษาอารัมภบท ฉันจะใช้ที่นี่การดำเนิน Potassco , clingo

อินพุตถูกนำมาจากพารามิเตอร์ ( -ck=ยาว 4 ไบต์) ตัวอย่างการโทร:

clingo -ck=999

ตัวอย่างผลลัพธ์:

SATISFIABLE

พยายาม 1,000:

clingo -ck=1000

ตัวอย่างผลลัพธ์:

UNSATISFIABLE

คุณสามารถลองของคุณในเบราว์เซอร์ ; โชคไม่ดีที่วิธีนี้ไม่จัดการกับค่าสถานะการโทรดังนั้นคุณต้องเพิ่มบรรทัด#const k=999เพื่อให้สามารถใช้งานได้


Ungolfed & อธิบายรหัส:

v(1..k).  % predicate v(X) holds for any X in [1..k]
o:- k=I*I+J*J+I*J ; v(I) ; v(J).  % o holds if k is Loeschian.
:- not o.  % discard models where o doesn't holds (make problem unsatisfiable)

1

PHP, 70 ไบต์

for(;$i++<$k=$argv[1];)for($j=$i+1;$j--;)$i*$i+$j*$j+$i*$j-$k?:die(1);

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

ทำให้พังถล่ม

for(;$i++<$k=$argv[1];)     # loop $i from 1 to $k
    for($j=$i+1;$j--;)      # loop $j from $i to 0
        $i*$i+$j*$j+$i*$j-$k?   # if $i,$j,$k do not satisfy the equation, do nothing
        :die(1);                # else exit with return code 1
                            # implicit: exit with code 0
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.