Kembalikan bilangan bulat dengan jumlah digit persegi

31

Pengantar dan Kredit

Kita semua tahu dan menyukai aturan kita yang luar biasa untuk menguji apakah suatu angka dapat dibagi dengan 11 atau 3, yang merupakan jumlah yang pintar dari angka-angka tersebut. Sekarang tantangan ini membawa ini ke tingkat yang baru, dengan mengharuskan Anda menghitung jumlah digit dan kemudian memeriksa apakah hasilnya adalah kuadrat bilangan bulat sempurna, yang tidak satu pun dari operasi yang biasanya dapat dilakukan sangat singkat. Karena properti ini juga sangat sulit dilihat ketika melihat angka, kami ingin ini dilakukan untuk seluruh daftar angka sehingga kami dapat menyelamatkan pekerjaan manusia. Jadi ini adalah Anda tantangan sekarang!

Ini adalah tugas di program pemrograman fungsional universitas saya. Tugas ini sekarang ditutup dan telah dibahas di kelas dan saya memiliki izin profesor saya untuk mempostingnya di sini (saya bertanya dengan jelas).

Spesifikasi

Memasukkan

Input Anda adalah daftar bilangan bulat non-negatif, dalam format I / O standar apa pun.
Anda dapat memilih format daftar sesuai kebutuhan bahasa Anda

Keluaran

Outputnya adalah daftar bilangan bulat, dalam format I / O standar apa pun.

Melakukan apa?

Saring setiap bilangan bulat dari daftar input yang jumlah digitnya bukan persegi (dari bilangan bulat).
Urutan elemen tidak dapat diubah, mis. Jika Anda mendapatkannya [1,5,9]Anda tidak dapat kembali[9,1]

Kasing sudut potensial

0 adalah bilangan bulat non-negatif dan dengan demikian input yang valid dan 0 juga merupakan akar bilangan bulat yang valid, misalnya 0 dianggap sebagai bilangan bulat bilangan bulat.
Daftar kosong adalah input dan output yang valid juga.

Yang menang?

Ini adalah kode-golf sehingga jawaban tersingkat dalam byte menang!
Aturan standar berlaku tentu saja.

Uji Kasus

[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] -> []

Contoh Langkah-demi-Langkah

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]
SEJPM
sumber
11
Tantangan pertama yang bagus, dan selamat datang di situs!
DJMcMayhem
Untuk tantangan di masa depan, perhatikan kotak pasir . Ini adalah tempat di mana kita meletakkan tantangan sebelum kita menempatkannya di situs utama sehingga mereka dapat ditinjau dan konten mereka dipertanyakan sehingga mereka (mudah-mudahan) akan lebih baik diterima di utama. Bukannya ini pertanyaan yang buruk (saya sebenarnya cukup suka)
Blue
@muddyfish, saya sudah membaca tentang ini dan mempertimbangkan untuk memposting di sana tetapi memutuskan untuk tidak melakukannya, karena saya yakin, bahwa tidak ada yang bisa saya lewatkan / lakukan dengan sangat salah di sini :) Tentu saja jika saya memiliki beberapa keraguan mungkin ada sesuatu Saya rindu saya akan memposting di sana.
SEJPM
12
Meskipun benar-benar baik-baik saja untuk menghindari kotak pasir, jika Anda memposting di sana saya akan menyarankan agar Anda membuat tantangan hanya tentang menguji integer individu. Tugas yang menarik adalah tes, membungkus tugas itu dengan filter tidak terlalu menarik. Yang tampaknya dilakukan adalah membuat tantangan jauh lebih sulit dalam bahasa esoterik yang tidak memiliki array sebagai tipe. Itu mungkin terdengar agak keras, tapi ini masih posting pertama yang bagus. Hanya mengatakan bahwa kotak pasir ada di sana karena tidak peduli seberapa yakin Anda Anda tidak melewatkan apa pun, Anda melewatkan sesuatu.
FryAmTheEggman
1
@FryAmTheEggman Saya dapat mengatakan untuk Mathematica bahwa membuat fungsi ini bisa membuat rumit hal-hal dengan cara yang agak tidak sepele, jadi itu tidak terlalu membosankan.
LLlAMnYP

Jawaban:

10

Pyke, 6 byte

#s,DBq

Coba di sini!

#      - Filter list on truthiness:
 s     -    digital_root(^)
  ,    -   sqrt(^)
    Bq -  int(^) == ^
Biru
sumber
5

Mathematica, 39 36 byte

Fungsi anonim:

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

LLlAMnYP menyimpan satu byte. Terima kasih!

Martin Ender menyelamatkan tiga lainnya mengganti IntegerQdengan AtomQ. Pintar! (Hasil dari akan tepat, sehingga mengembalikan ekspresi majemuk seperti Sqrt[5]jika argumennya bukan persegi.)

Lynn
sumber
Satu byte yang akan disimpan dengan ...Digits@#&alih-alih...Digits[#]&
LLlAMnYP
4

Jelly, 8 7 byte

1 byte terima kasih kepada @ Sp3000 .

DSƲðÐf

Suite uji.

Penjelasan

DSƲðÐf  Main monadic chain. Argument: z

     Ðf  Filter for truthiness:
D            convert to base 10
 S           sum
  Ʋ         is perfect square
Biarawati Bocor
sumber
4

Brachylog v2, 8 byte

{ẹ+√ℤ&}ˢ

Cobalah online!

Penjelasan

{ẹ+√ℤ&}ˢ
{     }ˢ  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

The &berarti bahwa unsur-unsur keluaran adalah sama seperti yang di daftar masukan, tapi akan error jika input blok bukan nomor persegi, sehingga kami mendapatkan daftar masukan dengan unsur-unsur dengan non-square jumlah digit dibuang.

Perhatikan bahwa mungkin awalnya ada masalah ketidakakuratan titik mengambang di sini (beberapa bilangan bulat non-kuadrat yang sangat besar memiliki akar kuadrat bilangan bulat karena pembulatan). Namun, Brachylog mendukung bignum aritmatika, dan sebenarnya perilaku ini diperhitungkan dalam penerapannya : bilangan yang merupakan kuadrat sempurna akan memiliki akar kuadratnya yang dilaporkan sebagai bilangan bulat, sedangkan bilangan yang bukan kuadrat sempurna (tetapi cukup dekat sehingga akar kuadrat adalah integral) akan memiliki akar kuadratnya dilaporkan sebagai float dengan nilai integral. Dengan mudah, hanya mengizinkan jenis nilai pengembalian yang pertama, memberikan kegagalan pernyataan untuk yang terakhir.

ais523
sumber
3

Pyth, 10 byte

fsI@sjT;2Q

Suite uji.

Penjelasan

fsI@sjT;2Q

f        Q  Filter for the following in Q(input):
     jT;        convert to base 10
    s           sum
   @    2       square-root
 sI             is integer (is invariant under flooring)
Biarawati Bocor
sumber
3

CJam, 14 byte

Terima kasih kepada @FryAmTheEggman karena telah menghemat satu byte!

{{Ab:+mq_i=},}

Cobalah online!

Ini adalah blok tanpa nama yang mengharapkan daftar input pada tumpukan dan membiarkan daftar yang difilter di atasnya.

Penjelasan

{e # memulai blok baru
 Ab e # dikonversi ke basis 10 -> nomor split menjadi digit
 : + e # jumlah digit
 mq e # dapatkan akar kuadrat
 _ e # menduplikasi hasilnya
 yaitu # convert to integer
 = e # periksa apakah root kuadrat yang dikonversi dan yang asli sama
} e # end block
, e # memfilter daftar input
Denker
sumber
3

Haskell - 70 60 59 byte

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

Pemakaian:

> 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]

Cukup mudah; menghitung jumlah digit dan memeriksa apakah floor (sqrt (y)) ^ 2 == y

Sunting: Mencuri ide memeriksa daftar kotak dari C. Quilley

Setan
sumber
2
Pendekatan yang menarik. Saya tidak yakin f=diperlukan untuk jawaban ini.
Michael Klein
3

05AB1E, 19 10 byte

vySOtDï->—

Penjelasan

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

Cobalah online

Sunting: Disimpan 9 byte berkat @Adnan

Emigna
sumber
Untuk mendapatkan jumlah digit untuk masing-masing, Anda dapat melakukan vySOdan memeriksa segera apakah itu kuadrat atau tidak. Aku punya ini untuk 5: tDï->. Ada juga builtin khusus yang mencetak yketika sama dengan 1, yaitu ( ). Jadi, itu akan terjadi vySOtDï->—.
Adnan
@ Adnan: Saya tidak percaya saya lupa tentang S. Saya bahkan tidak melihat - karena tugas mengatakan untuk output sebagai daftar, tapi saya melihat jawaban lain melakukan hal yang sama jadi saya menganggap itu baik-baik saja.
Emigna
Ya, barang yang dipisahkan dengan baris baru diterima secara default, saya kira, kecuali jika tantangannya secara eksplisit mengatakan tidak.
Adnan
3

R , 57 55 byte

Gunakan Filterpada vektor. Asumsikan bilangan bulat 32 bit jadi maks. 10 digit.

Kasus sudut: mengembalikan NULLuntuk vektor kosong dan numeric(0)untuk vektor tanpa angka yang valid. Keduanya memiliki panjang nol sehingga harus dapat diterima.

-2 Terima kasih kepada @Giuseppe

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

Cobalah online!

J.Apakah
sumber
3

PowerShell , 64 54 byte

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

Cobalah online!

-10 byte berkat mazzy

Mengambil input sebagai argumen baris perintah (lihat contoh di bawah), yang diproses di PowerShell ke dalam array $args. Kami menyalurkannya ke ?alias untuk Where-Object(fungsi yang mirip dengan filter) untuk memilih output kami. Pilihan kami didasarkan pada NET panggilan [math]::Sqrt()dari digit-sum dari nomor adalah bilangan bulat dengan !(...%1). Integer akan menghasilkan 0, yang ketika noted menjadi Truesementara akar non-integer menjadi False.

Seperti disebutkan di tempat lain "mengembalikan" array kosong tidak ada artinya, karena dikonversi menjadi $nullbegitu meninggalkan ruang lingkup, sehingga output untuk input kosong tidak ada artinya.

Contohnya

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
AdmBorkBork
sumber
1
$n%1memeriksa apakah hanya int$args|?{!([math]::Sqrt(([char[]]"$_"-join'+'|iex))%1)}
mazzy
2

Python 2, 76 byte

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

Coba di sini!

Beberapa penyalahgunaan eval untuk memeriksa angka kuadrat, sisanya cukup tidak spektakuler.
Pernyataan eval dievaluasi menjadi sum(map(int,n ))**.5==int(sum(map(int,n))**.5)

Denker
sumber
2

Oracle SQL 11.2, 213 byte

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);

Tidak bermain golf

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
Jeto
sumber
2

Brachylog , 26 byte

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

Contoh:

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

Penjelasan

Ini adalah situasi di mana sesuatu bekerja agak terlalu baik ... ~^[X:2]bagian ini berlaku untuk positif dan negatif X, jadi untuk menghindari duplikat saya harus menentukan itu X > 0.

Bagian ;.0ini ada di sini karena bug (enumerate tidak berfungsi pada integer 0).

  • Predikat utama

    :1f.                Find all values of Input which satisfy predicate 1
    
  • Predikat 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
    )
    
Fatalisasi
sumber
2

Python 2, 53 byte

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

Uji di Ideone .

Dennis
sumber
1
Sebab f([1111111111111111]), sepertinya repr(n)berisi 'L'dan int('L')melempar a ValueError. Saya merasa Anda perlu di str(n)sini?
Lynn
2
Benar, itu tidak akan bekerja untuk int panjang. Saya tidak berpikir itu berbeda dari solusi dalam bahasa dengan integer lebar tetap.
Dennis
2

J, 33 27 byte

6 byte terima kasih kepada @miles .

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

Dalam penerjemah online, invtidak ditanamkan. Ubah itu menjadi ^:_1gantinya.

Pemakaian

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

Di mana >>STDIN dan <<STDOUT.

Sedikit tidak berbulu

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)

Versi 33 byte sebelumnya

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

Pemakaian

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

Di mana >>STDIN dan <<STDOUT.

Sedikit tidak berbulu

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
Biarawati Bocor
sumber
1
Anda dapat menggunakan f&.guntuk menerapkan g, kemudian f, dan kemudian kebalikan dari gmempersingkat *:@<.@%:menjadi <.&.%:2 byte. Anda dapat mengatur ulang dan hanya menggunakan lantai untuk mendapatkan #~[:(=<.)@%:+/"1@(10&#.inv)untuk 27 byte mana invadalah ^:_1, dan sudah didefinisikan.
miles
2

Javascript 66 byte

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

Terima kasih untuk SergioFC karena telah menghemat 7 byte

Bálint
sumber
Tidak bisakah Anda menggunakan c+dsaja c-+-d? Selain itu, Anda dapat menggunakan n%1==0untuk menguji apakah hasilnya int, jadi mungkin Anda dapat menyimpan beberapa byte b=>!(Math.sqrt((b+"").split``.reduce((c,d)=>c-+-d))%1)untuk memfilter
sergioFC
@sergioFC Saya tidak bisa mengubah - + - ke +, karena mereka adalah string
Bálint
2

Perl 5, 42 byte

41, ditambah 1 untuk -pe bukan-e

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

Penjelasan:

  • -p mendapat setiap integer input pada baris baru dan menetapkan $_ ke string itu.
  • my$s menginisialisasi variabel $s menjadi nol, lagi untuk setiap integer input.
  • map$s+=$_,/./g meraih setiap karakter numerik dan menambahkannya secara numerik $s . (Baris baru menjadi 0 saat dinotifikasi.)
  • sqrt$s==~~sqrt$smenguji apakah $smemiliki akar kuadrat nonintegral, dan $_ x=merek$_ menjadi dirinya sendiri atau string kosong tergantung pada tes itu.
  • -p cetakan $_

Terimakasih untuk Brad Gilbert b2gills karena telah menghemat tiga byte.

Juga 41 ditambah 1:

my$s;s/./$s+=$&/ger;$_ x=sqrt$s==~~sqrt$s
  • s/./$s+=$&/germenambahkan setiap karakter numerik ke $s(dan baris baru adalah 0 seperti di atas)
msh210
sumber
2

JavaScript (Node.js) , 48 byte

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

Cobalah online!

Penjelasan

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
Pengguna any3nymous
sumber
1

MATL, 16 14 13 byte

"@tV!UsX^1\?x

Cobalah secara Online!

Penjelasan

        % 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
Suever
sumber
1

Julia - 38 byte

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

Sangat mudah untuk melihat apa yang dilakukannya. digitsmengubah angka menjadi daftar digitnya, sumsehingga menghitung digit-sum, kemudian akan menghasilkan angka utuh jika angka tersebut adalah kuadrat, jika tidak akan ada bagian fraksional. %1hanya akan mengembalikan bagian pecahan, dan jika itu nol (==0 ), filterakan menyimpannya di daftar, jika tidak maka akan disaring.

Digunakan sebagai ![22228,4,113125,22345]

Glen O
sumber
1

Jolf, 8 byte

Coba di sini!

ψxd!iUuH

Penjelasan

ψxd!iUuH
ψxd       filter the input according to the input
      uH  digit sum of H (element)
     U    sqrt of
   !i     is an integer?
Conor O'Brien
sumber
1

MATLAB, 52 43 42 byte

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

Menciptakan fungsi anonim bernama ansyang dapat disebut dengan array sebagai masukan: ans([22228,4,113125,22345]).

Demo online . Demo online dalam Octave yang tidak berfungsi untuk input kosong, tetapi MATLAB tidak.

Penjelasan

Kami mengonversi setiap elemen dalam array input ke basis 10 yang akan menghasilkan array karakter 2D di mana setiap baris berisi digit angka dalam array. Untuk mengonversi karakter ini menjadi angka, kita kurangi 48 (ASCII untuk '0'). Kami kemudian menjumlahkan seluruh baris, mengambil akar kuadrat, dan menentukan apakah setiap nilai adalah kuadrat sempurna ~mod 1. Kami kemudian menggunakan boolean ini untuk memfilter array input.

Suever
sumber
1

Clojure, 110 byte

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

Hitung jumlah digit angka dan kemudian filter yang tidak ada angka yang kuadratkan sama dengan jumlah.

Anda dapat melihat hasilnya di sini - https://ideone.com/ciKOje

cliffroot
sumber
1

Perl 6 ,  38   35 byte

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

Uji:

#! /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] => []
Brad Gilbert b2gills
sumber
1

C, 143 141 byte

  • disimpan 2 byte, @ 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]);}

Tidak dicoba coba online

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
}
Khaled.K
sumber
1

Retina , 69

Karena menguji kuadrat sempurna di retina. Ini dapat dimodifikasi untuk perhitungan root kuadrat integer umum .

. +
$ & a $ &
+ `\ b \ d
$ * b 


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

Input adalah daftar yang dipisahkan oleh baris baru.

Cobalah online.

  • Tahap 1 - ulangi angka pada setiap baris, dan pisahkan dengan a
  • Tahap 2 - konversi setiap digit sebelum aunary dinyatakan sebagai bs, dipisahkan dengan spasi
  • Tahap 3 - hapus spasi - setiap unary sekarang mewakili jumlah digit
  • Tahap 4 dan 5 - Gunakan fakta bahwa kuadrat sempurna dapat dinyatakan 1 + 3 + 5 + 7 + .... Bagi masing-masing unary sesuai
  • Tahap 6 - grep filter hanya yang benar-benar terpecah menjadi bentuk di atas
  • Tahap 7 - buang semua kecuali nomor aslinya
Trauma Digital
sumber
Saya punya beberapa ide bagaimana memperbaikinya, tetapi akhirnya menulis ulang sebagian besar. Namun demikian, ini masih persis ide Anda: input duplikat, perluas digit di babak pertama, filter kotak dalam bentuk jumlah angka ganjil, buang bagian pertama dari sisa baris. Cara saya memainkan langkah-langkahnya adalah melalui %konfigurasi, \Gdan meneruskan referensi. Silakan mengambilnya: retina.tryitonline.net/... :)
Martin Ender
1

Python, 50 byte

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

Jika n adalah daftar input angka

Swadhikar C
sumber
1
Halo, dan selamat datang di situs ini! Karena ini adalah kompetisi kode-golf , mis. Siapa yang dapat menulis kode terpendek, kami mengharuskan semua kiriman setidaknya menjadi agak golf . Kami memiliki daftar tip golf python di sini . Tepat di atas kepala saya, satu perbaikan nyata yang bisa Anda lakukan adalah menghapus semua spasi putih, dan mengubah nama variabel Anda menjadi satu huruf masing-masing. Anda juga bisa mengambil input sebagai argumen fungsi atau STDIN alih-alih argumen baris perintah.
DJMcMayhem
Anda juga harus menentukan bahasa dan jumlah byte, yang dapat dihitung, misalnya, di sana .
nicael
1
Selamat datang di PPCG! Selain apa yang dikatakan orang lain, harap dicatat bahwa semua solusi harus berupa program lengkap atau fungsi yang dapat dipanggil . Sejauh ini, semua jawaban Anda berupa potongan yang mengasumsikan bahwa input disimpan dalam beberapa variabel dan hanya mengevaluasi hasilnya, yang sayangnya membuatnya tidak valid. Untuk metode I / O yang dapat diterima, lihat meta post ini .
Martin Ender
1

K (oK) , 19 17 13 byte

Larutan:

(~1!%+/.:'$)#

Cobalah online!

Penjelasan:

(~1!%+/.:'$)# / the solution
(          )# / apply function to list
          $   / convert to string
       .:'    / value (.:) each (')
     +/       / sum
    %         / square-root
  1!          / modulo 1
 ~            / not

Catatan:

  • -2 byte dengan cara mengidentifikasi kotak yang lebih cerdas
  • -4 byte terima kasih kepada ngn
streetster
sumber
1
Anda tahu tentang filter ( func#list) ?
ngn
Saya tidak, sangat bagus!
streetster
1

MathGolf , 5 4 byte

gÅΣ°

Cobalah online!

Penjelasan:

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

MathGolf masih dalam pengembangan, jadi saya berasumsi input implisit akan segera datang untuk memotong byte pertama. Yay!

Jo King
sumber
Selamat atas jawaban MathGolf pertama bukan oleh saya! Saya sudah membahas masukan implisit dengan Emigna, dan dia memberi saya beberapa ide hebat. Itu akan datang, mudah-mudahan segera.
Maks.