สี่เหลี่ยมจัตุรัสเป็นอย่างไร


20

ในฐาน-10 ทั้งหมดสี่เหลี่ยมที่สมบูรณ์แบบสิ้นสุดใน0 , 1 , 4 , 5 , 6หรือ9

ในฐาน-16 ทั้งหมดสี่เหลี่ยมที่สมบูรณ์แบบสิ้นสุดใน0 , 1 , 4หรือ9

Nilknarf อธิบายว่าทำไมสิ่งนี้ถึงเป็นอย่างไรและทำอย่างไรให้ได้ผลดีในคำตอบนี้แต่ฉันจะให้คำอธิบายสั้น ๆ ที่นี่:

เมื่อยกกำลังสองจำนวน Base- N , Nหลัก "คน" จะไม่ได้รับผลกระทบจากสิ่งที่อยู่ในหลัก "หมื่น" หรือ "ร้อย" หลักเป็นต้น เฉพาะตัวเลข "คน" ในN เท่านั้นที่มีผลกับตัวเลข "คน" ในN 2ดังนั้นวิธีที่ง่าย (แต่อาจไม่ใช่นักกอล์ฟที่สุด) ในการค้นหาตัวเลขสุดท้ายที่เป็นไปได้ทั้งหมดสำหรับN 2คือการหาn 2 mod 10สำหรับทั้งหมด0 <= n < 10 ผลลัพธ์แต่ละรายการเป็นตัวเลขสุดท้ายที่เป็นไปได้ สำหรับ Base-M คุณอาจพบว่าn 2สมัยม.ทั้งหมด0 <= n < เมตร

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

แบบทดสอบ:

 Input -> Output
 1     -> 0
 2     -> 0,1
 10    -> 0,1,5,6,4,9
 16    -> 0,1,4,9
 31    -> 0,1,2,4,5,7,8,9,10,14,16,18,19,20,25,28
 120   -> 0,1,4,9,16,24,25,36,40,49,60,64,76,81,84,96,100,105

นี่คือดังนั้นจึงใช้กฎมาตรฐาน!

(หากคุณพบว่ามันง่ายเกินไปหรือคุณต้องการคำถามเชิงลึกเพิ่มเติมเกี่ยวกับหัวข้อนี้ให้พิจารณาคำถามนี้: ครอบคลุมพื้นที่น้อยที่สุดสำหรับการทดสอบกำลังสองของการตกค้างของฉาก )


1
จำเป็นต้องมีการเรียงลำดับผลลัพธ์หรือไม่
Shaggy

@Shaggy Nope! Mego ไม่อนุญาตให้ทำซ้ำ ในทางทฤษฎีแล้ว N อาจมีขนาดใหญ่มากดังนั้นการทำซ้ำจึงทำให้เอาต์พุตไม่สามารถอ่านได้ ฉันจะตอบคำถาม
Lord Farquaad

เอาต์พุตเป็นชุดที่ยอมรับได้หรือไม่?
มนุษย์โดยรวม

2
@tallyallyhuman ทำไมถึงไม่ถูกต้อง ชุดเป็นคอลเลกชันที่ไม่มีการเรียงลำดับและจะต้องไม่ถูกเรียงลำดับดังนั้น ...
Mr. Xcoder

คำตอบ:



19

Google ชีต52 51 47 ไบต์

=ArrayFormula(Join(",",Unique(Mod(Row(A:A)^2,A1

บันทึกแล้ว 4 ไบต์ขอบคุณ Taylor Scott

ชีตจะเพิ่มวงเล็บปิด 4 ตัวที่ท้ายสูตรโดยอัตโนมัติ

มันจะไม่ส่งคืนผลลัพธ์ตามลำดับจากน้อยไปหามาก แต่จะส่งคืนผลลัพธ์ที่ถูกต้อง

ผล


วัวศักดิ์สิทธิ์มนุษย์ที่ร้ายกาจมาก! ใครจะไปคิดบ้าง +1
bearacuda13

1
นี่คือคำตอบที่ฉันโปรดปรานที่สุด
ลอร์ด Farquaad

@ LordFarquaad ฉันประหลาดใจและยินดีที่ได้รับการตอบรับที่ดี ฉันพยายามเล่นกอล์ฟเป็นแผ่นและ Excel มากขึ้นแม้ว่าจะมีบางช่วงที่ จำกัด มันนำไปสู่สูตรอาร์เรย์มากมาย
Engineer Toast

คุณควรจะวาง)s ที่มีการยกเลิกสำหรับ -4 ไบต์
Taylor Scott

@TaylorScott ขอบคุณ! ฉันเห็นเคล็ดลับนั้นที่ไหนสักแห่ง - อาจเป็นหนึ่งในคำตอบของคุณ - และต้องจำไว้ว่าให้เริ่มใช้มัน
Engineer Toast

6

05AB1E , 5 ไบต์

Lns%ê

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

L     # Range 1 .. input
 n    # Square each
  s%  # Mod by input
    ê # Uniquify (also sorts as a bonus)

วิธีการที่ไม่sทำงานที่นี่? อินพุตซ้ำหรือไม่?
Luis Mendo

@LuisMendo คือs pop a,b; push b,aเมื่อคำสั่งพยายามป๊อปอัพบางอย่างจากสแต็กและไม่มีสิ่งใดเหลืออยู่จะใช้อินพุตต่อไป หากไม่มีการป้อนข้อมูลใด ๆ เพิ่มเติมจะใช้การป้อนข้อมูลครั้งสุดท้าย ( นี่คือตัวอย่าง ) ในกรณีนี้ฉันสามารถใช้¹ซึ่งผลักดันอินพุตแรก แต่ใช้sงานได้ดีขึ้นสำหรับชุดทดสอบ
Riley

ขอบคุณ คุณมีข้อมูลเพิ่มเติมเกี่ยวกับเกณฑ์ที่นำเข้ามาใช้ซ้ำหรือไม่ (หากมีการพูดสามอินพุตและคุณพยายามที่จะป๊อปสองค่าจากสแต็คที่ว่างเปล่า)?
Luis Mendo

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

@LuisMendo Ln¹%êเทียบเท่าที่นี่ s.
Magic Octopus Urn

6

Swift , 47 35 32 * bytes

* -3 ขอบคุณ @Alexander

อาจเป็นครั้งแรกในประวัติศาสตร์ที่ความสัมพันธ์ที่รวดเร็วเต้น Python?

{m in Set((0..<m).map{$0*$0%m})}

ลองออนไลน์!


คำอธิบาย

  • (0..<m).map{}- วนซ้ำตามช่วง[0...m)และแมปผลลัพธ์ต่อไปนี้:

  • $0*$0%m- ตารางของแต่ละจำนวนเต็ม modulo mฐาน

  • Set(...) - ลบรายการที่ซ้ำ

  • m in - กำหนดฐานให้กับตัวแปร m


ชื่อผู้ใช้เช็คเอาต์ ... รอสักครู่
Rohan Jhunjhunwala

1
เหมือนอย่าง Python นั่นเป็นเรื่องที่น่าประทับใจ ! ฉันคิดว่าฉันจะไม่เห็นวันที่จะเกิดขึ้น
Caleb Kleveter

@CalebKleveter ขอบคุณ! ฉันดีใจที่คุณพบว่ามันน่าประทับใจ :)
นาย Xcoder


3

JavaScript (ES6), 52 ไบต์

f=(m,k=m,x={})=>k?f(x[k*k%m]=m,k-1,x):Object.keys(x)

กรณีทดสอบ


รุ่นที่ไม่ใช่แบบเรียกซ้ำ60 58 ไบต์

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

m=>(a=[...Array(m).keys()]).filter(v=>a.some(n=>n*n%m==v))

กรณีทดสอบ


Non-recursive 58 bytes:m=>(a=[...Array(m).keys()]).filter(v=>a.some(n=>n*n%m==v))

@ThePirateBay จับได้ดี ขอบคุณ
Arnauld


3

Brachylogขนาด10 9 ไบต์

>ℕ^₂;?%≜ᶠ

ลองออนไลน์!

คำอธิบาย

       ≜ᶠ       Find all numbers satisfying those constraints:
    ;?%           It must be the result of X mod Input where X…
  ^₂              …is a square…
>ℕ                …of an integer in [0, …, Input - 1]

ฉันกำลังจะแนะนำ{>≜^₂;?%}ᵘเป็นทางเลือก ... จากนั้นฉันก็รู้ว่ามีจำนวนลบเช่นกัน > _ <
Erik the Outgolfer

1
@EriktheOutgolfer เมื่อกระทำการได้รับการดึงเพื่อ TIO ที่จริงผมสามารถลดคำตอบนี้ถึง 9 ไบต์แน่นอนโดยใช้
ทำให้เสียชีวิต

ตกลง ... มันจะทำงานอย่างไรเมื่อมีจำนวนลบเช่นกัน? มันจะไม่สนใจพวกเขาหรืออะไรบางอย่าง?
Erik the Outgolfer

@EriktheOutgolfer mod สามารถกำหนดเป็นส่วนที่เหลือของการหารซึ่งจะเป็นบวก (ความฉลาดทางจะใช้สัญลักษณ์) แก้ไข: นอกจากนี้สี่เหลี่ยมเป็นบวก
jaxad0127

@ jaxad0127 ฉันไม่คิดว่าเป็นอย่างนี้เพราะ>จะยังคงมีตัวเลขติดลบ afaik
Erik the Outgolfer

3

Japt , 7 6 ไบต์

Dz%UÃâ

ทดสอบมัน

บันทึก 1 ไบต์ขอบคุณOliver


คำอธิบาย

Uการป้อนข้อมูลโดยนัยของจำนวนเต็ม

Ç   Ã

สร้างอาร์เรย์ของจำนวนเต็มตั้งแต่0ถึงU-1รวมและผ่านแต่ละฟังก์ชัน

²

สี่เหลี่ยม

%U

Umodulo

â

รับองค์ประกอบที่ไม่ซ้ำกันทั้งหมดในอาร์เรย์และแสดงผลลัพธ์โดยปริยาย


1
ฉันไม่คิดว่าช่วงจะต้องรวม Dz%UÃâดูเหมือนว่าจะทำงานได้ดี
Oliver

2

Python 3 , 40 39 37 ไบต์

-1 ไบต์ขอบคุณ Mr. Xcoder -2 ไบต์ขอบคุณ Business Cat

lambda m:[*{n*n%m for n in range(m)}]

ลองออนไลน์!


1
คุณไม่สามารถแทนที่n**2ด้วยn*n?
Mr. Xcoder

ใช่ลืมไว้เสมอ > <ขอบคุณ!
มนุษย์โดยรวม

2
ก็range(m)เพียงพอแล้ว
แมวธุรกิจ

1
คุณสามารถใช้ชุด34 ไบต์
Mr. Xcoder



2

Haskell , 45 ไบต์

import Data.List
f m=nub[n^2`mod`m|n<-[0..m]]

-4 bytes จาก Anders Kaseorg

ลองออนไลน์!


รุ่นที่ไม่มีจุดน่าเศร้านั้นf m=nub$map((`mod`m).(^2))[0..m]มีความยาวเพียงแค่นั้นเว้นแต่ว่าจะมีรูปแบบที่ไม่แน่นอนเพื่อกำจัดวงเล็บเสริม
shooqie

2

MATL , 6 5 ไบต์

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

:UG\u

ลองออนไลน์!


ขอบคุณ! ฉันดูเอกสารที่ค้นหาฟังก์ชั่นนั้น แต่หาไม่พบ
Cinaski

BTW ล่ามนี้สร้างโดย Suever มีการค้นหาเอกสารคุณอาจพบว่ามีประโยชน์
Luis Mendo




1

สกาล่า , 32 30 ไบต์

การใช้เคล็ดลับง่าย ๆจาก OP อย่างง่ายดาย

(0 to n-1).map(x=>x*x%n).toSet

ลองออนไลน์!

-2 ไบต์ต้องขอบคุณ @MrXcoder ที่มีลำดับความสำคัญ (ไม่จำเป็นต้องใช้()ประมาณ*การทำงาน)

สงสัย: เป็นไปได้ไหมที่บอกให้คอมไพเลอร์เข้าใจสิ่งต่าง ๆ เช่น(โดยไม่ต้อง) โดยปริยาย ?(0 to n-1)map(x=>x*x%n)toSetimport scala.language.postfixOps


1
(0 to n-1).map(x=>x*x%n).toSetเป็นเวลา 30 ไบต์ การยกกำลังมีความสำคัญสูงกว่าโมดูโล
Mr. Xcoder

@ Mr.Xcoder ooh ~ ขอบคุณ :)
V. Courtois




0

Perl 6 , 19 ไบต์

{set (^$_)»²X%$_}

ทดสอบมัน

ขยาย:

{ # bare block lambda with implicit param 「$_」

  set        # turn the following into a Set (shorter than 「unique」)

      (
        ^$_  # a Range upto (and excluding) 「$_」
      )»²    # square each of them (possibly in parallel)

    X%       # cross modulus the squared values by

      $_     # the input
}

0

Pyth , 13 ไบต์

VQ aY.^N2Q){Y

ลองออนไลน์

ความพยายามง่อยเมื่ออธิบาย:

VQ               for N in [0 .. input-1]
                   blank space to supress implicit print inside the loop
     .^N2Q         N ^ 2 % input
   aY              append that to Y, which is initially an empty list
          )      end for
           {Y    deduplicate and implicit print

ในการจัดเรียงเอาต์พุตให้ใส่ a Sที่ด้านใดด้านหนึ่งของ{

ฉันคิดว่าควรจะมีวิธีที่สั้นกว่า ...


1
ใช่รูปแบบการทำงานของ Pyth มีแนวโน้มที่จะกระชับมากขึ้น mapเป็นเพื่อนของคุณ!
Anders Kaseorg





0

PHP , 53 ไบต์

for(;$i<$t=$argv[1];)$a[$z=$i++**2%$t]++?:print"$z
";

วนซ้ำจาก 0 ถึงหมายเลขอินพุตโดยใช้ n^2 mod baseสูตรเพื่อทำเครื่องหมายหมายเลขที่ใช้งานแล้ว มันจะไปที่ตำแหน่งนั้นในอาเรย์ตรวจสอบว่ามันเพิ่มขึ้นและส่งออกถ้ามันไม่ได้ จากนั้นจะเพิ่มทีหลังเพื่อไม่ให้พิมพ์ซ้ำค่า

ลองออนไลน์!


0

8th , 138 131 ไบต์

รหัส

[] swap dup >r ( 2 ^ r@ n:mod a:push ) 1 rot loop rdrop ' n:cmp a:sort ' n:cmp >r -1 a:@ swap ( tuck r@ w:exec ) a:filter rdrop nip

คำอธิบาย

[] - สร้างอาร์เรย์เอาต์พุต

swap dup >r - บันทึกอินพุตเพื่อใช้ในภายหลัง

( 2 ^ r@ n:mod a:push ) 1 rot loop - คำนวณสแควร์เอ็นด์

rdrop - ทำความสะอาด r-stack

' n:cmp a:sort - เรียงลำดับเอาท์พุท

' n:cmp >r -1 a:@ swap ( tuck r@ w:exec ) a:filter rdrop nip - กำจัดรายการที่ซ้ำกันจากอาร์เรย์

SED (Stack Effect Diagram) คือ:a -- a

การใช้งานและตัวอย่าง

: f [] swap dup >r ( 2 n:^ r@ n:mod a:push ) 1 rot loop rdrop ' n:cmp a:sort ' n:cmp >r -1 a:@ swap ( tuck r@ w:exec ) a:filter rdrop nip ;

ok> 120 f .
[0,1,4,9,16,24,25,36,40,49,60,64,76,81,84,96,100,105]

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