คืนค่าจำนวนเต็มด้วยผลบวกสี่เหลี่ยมจัตุรัส


31

บทนำและเครดิต

เราทุกคนรู้และชื่นชอบกฎที่ยอดเยี่ยมของเราในการทดสอบว่าจำนวนนั้นหารด้วย 11 หรือ 3 ซึ่งเป็นเพียงผลรวมที่ฉลาดกว่าตัวเลขของตัวเลข ตอนนี้ความท้าทายนี้จะนำคุณไปสู่ระดับใหม่โดยกำหนดให้คุณคำนวณผลรวมของตัวเลขแล้วตรวจสอบว่าผลลัพธ์เป็นสี่เหลี่ยมจัตุรัสที่สมบูรณ์แบบหรือไม่ซึ่งการดำเนินการใด ๆ ที่ทำได้สั้นมาก เนื่องจากสถานที่แห่งนี้มองเห็นได้ยากเมื่อมองที่ตัวเลขเราต้องการให้ทำรายการทั้งหมดเพื่อให้สามารถบันทึกงานของมนุษย์ได้ นี่คือความท้าทายของคุณตอนนี้!

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

สเปค

อินพุต

ข้อมูลที่คุณป้อนเป็นรายการจำนวนเต็มที่ไม่เป็นลบในรูปแบบ I / O มาตรฐานใด ๆ
คุณสามารถเลือกรูปแบบรายการตามที่ภาษาของคุณต้องการ

เอาท์พุต

เอาต์พุตคือรายการของจำนวนเต็มในรูปแบบ I / O มาตรฐานใด ๆ

จะทำอย่างไร?

กรองจำนวนเต็มทุกตัวออกจากรายการอินพุตที่ผลรวมของตัวเลขไม่ใช่ aa square (ของจำนวนเต็ม)
ลำดับขององค์ประกอบอาจไม่สามารถเปลี่ยนแปลงได้เช่นหากคุณทำให้[1,5,9]คุณไม่ได้รับผลตอบแทน[9,1]

กรณีมุมที่อาจเกิดขึ้น

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

ใครชนะ?

นี่คือ code-golf ดังนั้นคำตอบที่สั้นที่สุดในหน่วยไบต์ชนะ!
ใช้กฎมาตรฐานแน่นอน

กรณีทดสอบ

[1,4,9,16,25,1111] -> [1,4,9,1111]
[1431,2,0,22,999999999] -> [1431,0,22,999999999]
[22228,4,113125,22345] -> [22228,4,22345]
[] -> []
[421337,99,123456789,1133557799] -> []

ตัวอย่างทีละขั้นตอน

Example input: [1337,4444]
Handling first number:
Sum of the digits of 1337: 1+3+3+7=14
14 is not an integer square, thus will be dropped!
Handling second number:
Sum of the digits of 4444: 4+4+4+4=16
16 is an integer square because 4*4=16, can get into the output list!
Example output: [4444]

11
ความท้าทายแรกที่ดีและยินดีต้อนรับสู่เว็บไซต์!
DJMcMayhem

สำหรับอนาคตความท้าทายทราบจาก sandbox เป็นสถานที่ที่เราเผชิญกับความท้าทายก่อนที่เราจะนำพวกเขาไปไว้ในเว็บไซต์หลักเพื่อให้สามารถรับการตรวจสอบและเนื้อหาของพวกเขาจะถูกสอบถามเพื่อที่พวกเขาจะได้รับการตอบรับที่ดีกว่า ไม่ใช่ว่านี่เป็นคำถามที่ไม่ดีเลย (จริง ๆ แล้วฉันชอบมันมาก)
บลู

@muddyfish ฉันได้อ่านเกี่ยวกับเรื่องนี้และคิดว่าจะโพสต์ที่นั่น แต่ตัดสินใจที่จะไม่ทำเพราะฉันมั่นใจว่าไม่มีอะไรที่ฉันจะพลาด / ทำผิดอย่างน่ากลัวที่นี่ :) แน่นอนถ้าฉันมีข้อสงสัยบางอย่างอาจมีบางอย่าง ฉันคิดถึงฉันจะโพสต์ที่นั่น
SEJPM

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

1
@FryAmTheEggman ฉันสามารถพูดกับ Mathematica ที่ทำให้ฟังก์ชั่นนี้ฟังได้ทำให้สิ่งต่าง ๆ ซับซ้อนในแบบที่ไม่น่าสนใจเล็กน้อยดังนั้นมันจึงไม่น่าเบื่อเลย
LLlAMnYP

คำตอบ:



5

Mathematica, 39 36 ไบต์

ฟังก์ชั่นที่ไม่ระบุชื่อ:

Select[AtomQ@√Tr@IntegerDigits@#&]

LLlAMnYP บันทึกไบต์ ขอขอบคุณ!

มาร์ตินเอนเดอร์ที่บันทึกไว้อีกสามโดยการแทนที่ด้วยIntegerQ AtomQฉลาด! (ผลลัพธ์ของจะเป็นที่แน่นอนดังนั้นจึงส่งกลับนิพจน์ผสมเช่นSqrt[5]ถ้าอาร์กิวเมนต์ของมันไม่ใช่สแควร์)


ไบต์ที่จะถูกบันทึกโดย...Digits@#&แทนที่...Digits[#]&
LLlAMnYP


4

Brachylog v2, 8 ไบต์

{ẹ+√ℤ&}ˢ

ลองออนไลน์!

คำอธิบาย

{ẹ+√ℤ&}ˢ
{     }ˢ  Map the following operation over {the input}, discarding elements that error:
 ẹ         Split into a list of digits
  +        Sum that list
   √       Take its square root
    ℤ      Assert that the result is an integer
     &     Return to the original value

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

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



3

CJam, 14 ไบต์

ขอบคุณ @FryAmTheEggman สำหรับการบันทึกหนึ่งไบต์!

{{Ab:+mq_i=},}

ลองออนไลน์!

นี่เป็นบล็อกที่ไม่มีชื่อที่คาดว่าจะมีรายการอินพุตในสแต็กและปล่อยรายการที่กรองไว้

คำอธิบาย

{e # เริ่มบล็อกใหม่
 Ab e # แปลงเป็นฐาน 10 -> แบ่งตัวเลขเป็นหลัก
 : + ตัวเลขผลรวม th #
 mq e # รับค่าสแควร์รูท
 _ e # ซ้ำผลลัพธ์
 ie # แปลงเป็นจำนวนเต็ม
 = e # ตรวจสอบว่าสแควร์รูทที่แปลงแล้วและอันเดิมมีค่าเท่ากันหรือไม่
} e # end block
, e # กรองรายการอินพุต

3

Haskell - 70 60 59 ไบต์

f=filter(\x->elem(sum.map(read.pure).show$x)$map(^2)[0..x])

การใช้งาน:

> f [0..100]
[0,1,4,9,10,13,18,22,27,31,36,40,45,54,63,72,79,81,88,90,97,100]

ค่อนข้างตรงไปตรงมา; คำนวณผลรวมของตัวเลขและตรวจสอบว่า floor (sqrt (y)) ^ 2 == y

แก้ไข: ขโมยความคิดในการตรวจสอบรายการสี่เหลี่ยมจาก C. Quilley


2
แนวทางที่น่าสนใจ ฉันไม่แน่ใจว่าf=จำเป็นสำหรับคำตอบนี้หรือไม่
Michael Klein

3

05AB1E, 19 10 ไบต์

vySOtDï->—

คำอธิบาย

vy                     # for each int in list
  SO                   # digit sum
    tDï-               # difference between sqrt() and int(sqrt())
        >              # increase by 1 giving 1 (true) when equal
         —             # print current int in list if truthy

ลองออนไลน์

แก้ไข: บันทึกแล้ว 9 ไบต์ขอบคุณ @Adnan


สำหรับการรับผลรวมของตัวเลขสำหรับแต่ละคุณสามารถทำได้vySOและตรวจสอบทันทีว่ามันเป็นสี่เหลี่ยมหรือไม่ ผมได้รับนี้ถึง tDï->5: นอกจากนี้ยังมีตัวต่อพิเศษที่พิมพ์yเมื่อเท่ากับ1ซึ่งคือ ( ) ดังนั้นจะเป็นvySOtDï->—อย่างไร
Adnan

@Adnan: ฉันไม่อยากจะเชื่อเลยว่าฉันลืม S. ฉันไม่ได้ดู - ตั้งแต่งานบอกว่าเอาท์พุทเป็นรายการ แต่ฉันเห็นคำตอบอื่นทำแบบเดียวกันดังนั้นฉันคิดว่ามันใช้ได้
Emigna

ใช่รายการที่คั่นด้วยการขึ้นบรรทัดใหม่ได้รับการยอมรับโดยค่าเริ่มต้นฉันคิดว่าเว้นแต่ความท้าทายจะบอกว่าไม่ชัดเจน
Adnan

3

R , 57 55 ไบต์

ใช้ Filterกับเวกเตอร์ สมมติว่าเป็นจำนวนเต็ม 32 บิตสูงสุด 10 หลัก

กรณีมุม: ผลตอบแทน NULLสำหรับเวกเตอร์ที่ว่างเปล่าและnumeric(0)สำหรับเวกเตอร์ที่ไม่มีตัวเลขที่ถูกต้อง ทั้งสองนี้มีความยาวเป็นศูนย์ดังนั้นควรยอมรับได้

-2 ขอบคุณ @Giuseppe

Filter(function(n)!sum(n%/%10^(0:10)%%10)^.5%%1,scan())

ลองออนไลน์!


3

PowerShell , 64 54 ไบต์

$args|?{!([math]::Sqrt(([char[]]"$_"-join'+'|iex))%1)}

ลองออนไลน์!

-10 ไบต์ขอบคุณที่มาซี่

จะเข้าเป็นอาร์กิวเมนต์บรรทัดคำสั่ง (ดูตัวอย่างด้านล่าง) ซึ่งได้รับการประมวลผลใน PowerShell $argsลงในอาร์เรย์ เราไป?ที่นามแฝงสำหรับWhere-Object(ฟังก์ชั่นที่คล้ายกับfilter) เพื่อเลือกเอาท์พุทของเรา การเลือกของเราอยู่บนพื้นฐานของการโทร .NET [math]::Sqrt()ของหลักผลรวม!(...%1)ของตัวเลขเป็นจำนวนเต็มด้วย จำนวนเต็มจะมีผลใน 0 ซึ่งเมื่อnotเอ็ดกลายเป็นในขณะที่รากที่ไม่ใช่จำนวนเต็มกลายเป็นTrueFalse

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

ตัวอย่าง

PS C:\Tools\Scripts\golfing> .\return-integers-with-square-digit-sums.ps1 1 4 9 16 25 1111
1
4
9
1111

PS C:\Tools\Scripts\golfing> .\return-integers-with-square-digit-sums.ps1 1431 2 0 22 999999999
1431
0
22
999999999

PS C:\Tools\Scripts\golfing> .\return-integers-with-square-digit-sums.ps1 22228 4 113125 22345
22228
4
22345

PS C:\Tools\Scripts\golfing> .\return-integers-with-square-digit-sums.ps1 

PS C:\Tools\Scripts\golfing> .\return-integers-with-square-digit-sums.ps1 1337 4444
4444

1
$n%1ตรวจสอบว่า int เท่านั้น$args|?{!([math]::Sqrt(([char[]]"$_"-join'+'|iex))%1)}
mazzy

2

Python 2, 76 ไบต์

lambda l:filter(lambda n:eval(("sum(map(int,`n`))**.5==int("*2)[:-6]+")"),l)

ลองที่นี่!

การใช้ eval เพื่อตรวจสอบหมายเลขที่ไม่เหมาะสมบางอย่างนั้นเป็นสิ่งที่ไม่สวยงาม
คำสั่ง eval ประเมินว่าsum(map(int,n ))**.5==int(sum(map(int,n))**.5)


2

Oracle SQL 11.2, 213 ไบต์

WITH v AS(SELECT a,SQRT(XMLQUERY(REGEXP_REPLACE(a,'(\d)','+\1')RETURNING CONTENT).GETNUMBERVAL())s FROM(SELECT TRIM(COLUMN_VALUE)a FROM XMLTABLE(('"'||REPLACE(:1,',','","')||'"'))))SELECT a FROM v WHERE s=CEIL(s);

ยกเลิกแข็งแรงเล่นกอล์ฟ

WITH v AS
(  
  SELECT a,SQRT(XMLQUERY( 
                   REGEXP_REPLACE(a,'(\d)','+\1')  -- Add a + in front of each digit 
                   RETURNING CONTENT
               ).GETNUMBERVAL())s                  -- Evaluate the expression generated by the added +
  FROM 
  (SELECT TRIM(COLUMN_VALUE)a FROM XMLTABLE(('"'||REPLACE(:1,',','","')||'"'))) -- Split string on ','
)
SELECT a FROM v WHERE s=CEIL(s) -- Is a square if square has no decimal part

2

Brachylogขนาด 26 ไบต์

:1f.
e.(:ef+~^[X:2]h>0;.0)

ตัวอย่าง:

?- run_from_file('code.brachylog',[1431:2:0:22:999999999],Z).
Z = [1431, 0, 22, 999999999]

คำอธิบาย

นี่เป็นสถานการณ์ที่บางสิ่งทำงานได้ดีเกินไป ... ~^[X:2]ส่วนนั้นเป็นจริงสำหรับทั้งบวกและลบXดังนั้นเพื่อหลีกเลี่ยงการซ้ำซ้อนฉันต้องระบุว่าX > 0นั้น

;.0ส่วนหนึ่งอยู่ที่นี่เนื่องจากข้อผิดพลาด (การระบุไม่ทำงานบนจำนวนเต็ม 0)

  • ภาคแสดงหลัก

    :1f.                Find all values of Input which satisfy predicate 1
    
  • คำกริยา 1

    e.                  Unify output with an element of the input
    (
      :ef               Find all elements of Output (i.e. all digits)
         +              Sum the digits
          ~^[X:2]       True if that sum is the result of X², whatever X is
                 h>0    Impose that X > 0
    ;                   OR
      .0                True if Output is 0
    )
    

2

Python 2, 53 ไบต์

lambda x:[n for n in x if sum(map(int,`n`))**.5%1==0]

ทดสอบบนIdeone


1
สำหรับf([1111111111111111])ดูเหมือนว่าrepr(n)มี'L'และพ่นint('L') ValueErrorฉันรู้สึกเหมือนคุณต้องการstr(n)ที่นี่?
Lynn

2
ใช่มันไม่ทำงานสำหรับ ints ที่ยาวนาน ฉันไม่คิดว่ามันจะแตกต่างจากวิธีแก้ปัญหาในภาษาที่มีจำนวนเต็มความกว้างคงที่
Dennis

2

J, 33 27 ไบต์

6 ไบต์ขอบคุณที่@miles

#~[:(=<.)@%:+/"1@(10&#.inv)

ในล่ามออนไลน์invไม่ได้รับการติดตั้ง เปลี่ยน^:_1เป็น

การใช้

>> f =: #~[:(=<.)@%:+/"1@(10&#.inv)
>> f 1 4 9 16 25 1111 0
<< 1 4 9 1111 0

>>STDIN อยู่ที่ไหนและ<<STDOUT

ungolfed เล็กน้อย

to_base_10 =: 10&#.^:_1
sum        =: +/"1
sqrt       =: %:
floor      =: <.
itself     =: ]
equals     =: =
of         =: @
is_integer =: equals floor
test       =: is_integer of sqrt
copies_of  =: #
f =: copies_of~ [: test (sum of to_base_10)

รุ่น 33 ไบต์ก่อนหน้า

(]=*:@<.@%:)@(+/"1@(10#.^:_1]))#]

การใช้

>> f =: (]=*:@<.@%:)@(+/"1@(10#.^:_1]))#]
>> f 1 4 9 16 25 1111 0
<< 1 4 9 1111 0

>>STDIN อยู่ที่ไหนและ<<STDOUT อยู่ที่ไหน

ungolfed เล็กน้อย

to_base_10 =: 10#.^:_1]
sum        =: +/"1
sqrt       =: %:
floor      =: <.
square     =: *:
itself     =: ]
equals     =: =
of         =: @
test       =: itself equals square of floor of sqrt
copies_of  =: #
f =: (test of (sum of to_base_10)) copies_of itself

1
คุณสามารถใช้f&.gเพื่อนำไปใช้gแล้วจากfนั้นค่าผกผันของgการย่อ*:@<.@%:ให้เหลือ<.&.%:2 ไบต์ คุณสามารถจัดเรียงใหม่และใช้พื้นเพียงเพื่อรับ#~[:(=<.)@%:+/"1@(10&#.inv)27 ไบต์ที่invอยู่^:_1และถูกกำหนดไว้แล้ว
ไมล์

2

Javascript 66 ไบต์

a=>a.filter(b=>(e=Math.sqrt((b+"").split``.reduce((c,d)=>c-+-d)))==(e|0))

ขอบคุณสำหรับ SergioFC สำหรับการบันทึก 7 ไบต์


คุณไม่สามารถใช้c+dแทนได้c-+-dใช่ไหม นอกจากนี้คุณสามารถใช้n%1==0เพื่อทดสอบว่าผลลัพธ์เป็น int หรือไม่ดังนั้นคุณสามารถบันทึกบางไบต์ที่ใช้b=>!(Math.sqrt((b+"").split``.reduce((c,d)=>c-+-d))%1)ในการกรองได้
sergioFC

@sergioFC ฉันไม่สามารถเปลี่ยน - + - เป็น + ได้เนื่องจากพวกเขาเป็นสตริง
Bálint

2

Perl 5, 42 ไบต์

41, บวก 1 -peแทน-e

my$s;map$s+=$_,/./g;$_ x=sqrt$s==~~sqrt$s

คำอธิบาย:

  • -pรับจำนวนเต็มแต่ละอินพุทบนบรรทัดใหม่และกำหนดให้$_กับสตริงนั้น
  • my$sกำหนดค่าเริ่มต้นให้เป็นตัวแปรโดย$sไม่มีอะไรใหม่สำหรับแต่ละจำนวนเต็มอินพุท
  • map$s+=$_,/./g$sคว้าตัวละครแต่ละตัวที่เป็นตัวเลขและตัวเลขเพิ่มไปยัง (ขึ้นบรรทัดใหม่กลายเป็น 0 เมื่อมีการระบุตัวเลข)
  • sqrt$s==~~sqrt$sทดสอบว่า$sมีรากที่สองที่ไม่เป็นศูนย์กลางหรือไม่และ$_ x=ทำการทดสอบ$_เป็นของตัวเองหรือสตริงว่างขึ้นอยู่กับการทดสอบนั้น
  • -p พิมพ์ $_

ขอบคุณBrad Gilbert b2gillsสำหรับการบันทึกสามไบต์

นอกจากนี้ 41 บวก 1:

my$s;s/./$s+=$&/ger;$_ x=sqrt$s==~~sqrt$s
  • s/./$s+=$&/gerเพิ่มอักขระตัวเลขแต่ละตัวลงใน$s(และขึ้นบรรทัดใหม่เป็น 0 ข้างต้น)

2

JavaScript (Node.js)ขนาด 48 ไบต์

a=>a.filter(b=>eval([...b+""].join`+`)**.5%1==0)

ลองออนไลน์!

คำอธิบาย

a =>                                  // lambda function taking one argument
    a.filter(                         // filter the list
        eval(                         // begin eval
            [...b+""]                 // convert number to array of digits 
                .join`+`              // join them with + sign
            )                         // close eval. we achieved sum of all digits of number
        **.5                          // square root of number
        %1==0                         // check for perfect square
    )                                 // end filter and return value

1

MATL, 16 14 13 ไบต์

"@tV!UsX^1\?x

ลองออนไลน์!

คำอธิบาย

        % Implicitly grab input
"       % For each number in the input
  @t    % Get this element and duplicate
  V     % Convert to it's string representation
  !     % Transpose the string so each digit is on it's own row
  U     % Convert each row to a number (separates the digits)
  s     % Compute the sum of the digits
  X^    % Compute the square root
  1\    % mod with 1 to determine if the square root is an integer
  ?x    % If there is a remainder, then remove this element from the stack
        % Implicitly display the stack contents

1

Julia - 38 ไบต์

!X=filter(i->√sum(digits(i))%1==0,X)

มันค่อนข้างง่ายที่จะเห็นว่ามันทำอะไร digitsแปลงตัวเลขให้เป็นรายการของตัวเลขsumดังนั้นจึงคำนวณผลรวมตัวเลขจากนั้นจะสร้างจำนวนเต็มถ้าจำนวนนั้นเป็นรูปสี่เหลี่ยมมิฉะนั้นจะมีส่วนที่เป็นเศษส่วน %1จะส่งกลับเฉพาะส่วนที่เป็นเศษส่วนและหากเป็นศูนย์ ( ==0)filterจะเก็บไว้ในรายการมิฉะนั้นจะถูกกรองออก

ใช้เป็น ![22228,4,113125,22345]



1

MATLAB, 52 43 42 ไบต์

@(x)x(~mod(sum(dec2base(x,10)'-48).^.5,1))

สร้างฟังก์ชั่นที่ไม่ระบุชื่อชื่อansที่สามารถเรียกกับอาร์เรย์เป็น ans([22228,4,113125,22345])input:

สาธิตออนไลน์ การสาธิตออนไลน์อยู่ในระดับแปดเสียงซึ่งไม่สามารถใช้งานได้กับอินพุตว่าง แต่ MATLAB ทำ

คำอธิบาย

เราแปลงแต่ละองค์ประกอบในอาร์เรย์อินพุตให้เป็นฐาน 10 ซึ่งจะให้ผลอักขระอาร์เรย์ 2D ซึ่งแต่ละแถวมีตัวเลขของตัวเลขในอาร์เรย์ ในการแปลงอักขระเหล่านี้ให้เป็นตัวเลขเราจะลบ 48 (ASCII สำหรับ'0') จากนั้นเรารวมข้ามแถวรับสแควร์รูทและตรวจสอบว่าแต่ละค่าเป็นสแควร์ที่สมบูรณ์แบบ~mod 1หรือไม่ จากนั้นเราใช้บูลีนนี้เพื่อกรองอาร์เรย์อินพุต


1

Clojure 110 ไบต์

(fn[t](filter(fn[x](let[a(reduce +(*(count(str x))-48)(map int(str x)))](some #(=(* % %)a)(range(inc a)))))t))

คำนวณผลรวมของตัวเลขหลักแล้วกรองออกที่ไม่มีตัวเลขซึ่งกำลังสองเท่ากับผลรวม

คุณสามารถดูผลลัพธ์ได้ที่นี่ - https://ideone.com/ciKOje


1

Perl 6 ,  38   35 bytes

{.grep: {($/=sqrt [+] .comb)==$/.Int}}
{.grep: {($/=.comb.sum.sqrt)==$/.Int}}
{.grep: {($/=sqrt [+] .comb)==^$/}}
{.grep: {($/=.comb.sum.sqrt)==^$/}}

ทดสอบ:

#! /usr/bin/env perl6

use v6.c;
use Test;

my @tests = (
  [1,4,9,16,25,1111] => [1,4,9,1111],
  [1431,2,0,22,999999999] => [1431,0,22,999999999],
  [22228,4,113125,22345] => [22228,4,22345],
  [] => [],
  [421337,99,123456789,1133557799] => [],
);

plan +@tests;

my &sq-digit-sum = {.grep: {($/=sqrt [+] .comb)==^$/}}

for @tests -> $_ ( :key($input), :value($expected) ) {
  is sq-digit-sum($input), $expected, .gist
}
1..5
ok 1 - [1 4 9 16 25 1111] => [1 4 9 1111]
ok 2 - [1431 2 0 22 999999999] => [1431 0 22 999999999]
ok 3 - [22228 4 113125 22345] => [22228 4 22345]
ok 4 - [] => []
ok 5 - [421337 99 123456789 1133557799] => []

1

C, 143 141 ไบต์

  • บันทึก 2 ไบต์, @ user6188402
i;q(char*n){double m=0;while(*n)m+=*n++-48;m=sqrt(m)-(int)sqrt(m);return !m;}s(n,s)char**n;{i=-1;while(++i<s)if(q(n[i]))printf("%s\n",n[i]);}

Ungolfed ลองออนไลน์

int q(char*n)
{
    double m=0;

    while(*n) // sum digits
        m+=*n++-48;

    // get the decimal part of its square root
    m=sqrt(m)-(int)sqrt(m);

    // true if decimal part is zero
    return !m;
}

// input is text, can be a file
void s(char**n, int s)
{
    int i=-1;

    while(++i<s) // for each number in input
        if(q(n[i])) // if is square
            printf("%s\n",n[i]); // output is terminal
}

1

เรติน่า 69

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

. +
$ & A $ &
+ `\ ข \ d
$ b * 


\BB
$ &:
+ `(\ bb +) :( bb \ 1)
$ 1 $ 2:
G` (ก | 0 $)
. * a

อินพุตเป็นรายการที่คั่นด้วยบรรทัดใหม่

ลองออนไลน์

  • ขั้นตอนที่ 1 - ทำซ้ำหมายเลขในแต่ละบรรทัดและคั่นด้วย a
  • ขั้นตอนที่ 2 - แปลงตัวเลขแต่ละตัวก่อนที่จะเป็นaเอกภาพแสดงเป็นbs คั่นด้วยช่องว่าง
  • ขั้นตอนที่ 3 - ลบช่องว่าง - ตอนนี้แต่ละเครื่องพร้อมกันแสดงถึงผลรวมหลัก
  • ขั้นตอนที่ 4 และ 5 - ใช้ความจริงที่ว่าสี่เหลี่ยมที่สมบูรณ์แบบอาจแสดง 1 + 3 + 5 + 7 + ... แยกแต่ละคนให้พร้อมกัน
  • ขั้นตอนที่ 6 - ตัวกรอง grep เพียงตัวที่แบ่งออกเป็นแบบฟอร์มด้านบน
  • ด่าน 7 - ทิ้งทั้งหมดยกเว้นหมายเลขเดิม

I had a few ideas how to improve this, but ended up rewriting most of it. Nevertheless, this is still exactly your idea: duplicate input, expand digits in first half, filter squares in the form of sums of odd numbers, discard first half of remaining lines. The way I golfed the steps is via %-configuration, \G and forward references. Feel free to take it: retina.tryitonline.net/… :)
Martin Ender

1

Python, 50 bytes

filter(lambda x:sum(map(int,str(x)))**0.5%1==0,in)

If n is input list of numbers


1
Hello, and welcome to the site! Since this is a code-golf competition, e.g. who can write the shortest code, we require all submissions to be at at least somewhat golfed. We have a list of python golfing tips here. Just off the top of my head, one obvious improvement you could do is to remove all the extra whitespace, and rename your variables to one letter each. You could also take input as function arguments or STDIN instead of command line arguments.
DJMcMayhem

You should also specify the language and the byte count, which could be counted, for example, there.
nicael

1
Welcome to PPCG! In addition to what the others said, please note that all solutions must be either full programs or callable functions. So far, all of your answers have been snippets which assume that the input is stored in some variable and just evaluate to the result, which unfortunately makes them invalid. For acceptable I/O methods, see this meta post.
Martin Ender



1

MathGolf, 5 4 bytes

gÅΣ°

Try it online!

Explanation:

gÅ    Filter by the next two instructions
  Σ   The digit sum
   °  Is a perfect square?

MathGolf is still in development, so I assume implicit input is coming soon to shave off that first byte. Yay!


Congratulations on the first MathGolf answer not by me! I've discussed implicit input with Emigna, and he gave me some great ideas. It's coming, hopefully soon.
maxb
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.