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]
Jawaban:
Pyke, 6 byte
Coba di sini!
sumber
Mathematica,
3936 byteFungsi anonim:
LLlAMnYP menyimpan satu byte. Terima kasih!
Martin Ender menyelamatkan tiga lainnya mengganti
IntegerQ
denganAtomQ
. Pintar! (Hasil dari√
akan tepat, sehingga mengembalikan ekspresi majemuk sepertiSqrt[5]
jika argumennya bukan persegi.)sumber
...Digits@#&
alih-alih...Digits[#]&
Jelly,
87 byte1 byte terima kasih kepada @ Sp3000 .
Suite uji.
Penjelasan
sumber
Brachylog v2, 8 byte
Cobalah online!
Penjelasan
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.sumber
Pyth, 10 byte
Suite uji.
Penjelasan
sumber
CJam, 14 byte
Terima kasih kepada @FryAmTheEggman karena telah menghemat satu byte!
Cobalah online!
Ini adalah blok tanpa nama yang mengharapkan daftar input pada tumpukan dan membiarkan daftar yang difilter di atasnya.
Penjelasan
sumber
Haskell -
706059 bytePemakaian:
Cukup mudah; menghitung jumlah digit dan memeriksa apakah floor (sqrt (y)) ^ 2 == y
Sunting: Mencuri ide memeriksa daftar kotak dari C. Quilley
sumber
f=
diperlukan untuk jawaban ini.05AB1E,
1910 bytePenjelasan
Cobalah online
Sunting: Disimpan 9 byte berkat @Adnan
sumber
vySO
dan memeriksa segera apakah itu kuadrat atau tidak. Aku punya ini untuk 5:tDï->
. Ada juga builtin khusus yang mencetaky
ketika sama dengan1
, yaitu (—
). Jadi, itu akan terjadivySOtDï->—
.R ,
5755 byteGunakan
Filter
pada vektor. Asumsikan bilangan bulat 32 bit jadi maks. 10 digit.Kasus sudut: mengembalikan
NULL
untuk vektor kosong dannumeric(0)
untuk vektor tanpa angka yang valid. Keduanya memiliki panjang nol sehingga harus dapat diterima.-2 Terima kasih kepada @Giuseppe
Cobalah online!
sumber
PowerShell ,
6454 byteCobalah 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 untukWhere-Object
(fungsi yang mirip denganfilter
) 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 ketikanot
ed menjadiTrue
sementara akar non-integer menjadiFalse
.Seperti disebutkan di tempat lain "mengembalikan" array kosong tidak ada artinya, karena dikonversi menjadi
$null
begitu meninggalkan ruang lingkup, sehingga output untuk input kosong tidak ada artinya.Contohnya
sumber
$n%1
memeriksa apakah hanya int$args|?{!([math]::Sqrt(([char[]]"$_"-join'+'|iex))%1)}
Python 2, 76 byte
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)
sumber
Oracle SQL 11.2, 213 byte
Tidak bermain golf
sumber
Brachylog , 26 byte
Contoh:
Penjelasan
Ini adalah situasi di mana sesuatu bekerja agak terlalu baik ...
~^[X:2]
bagian ini berlaku untuk positif dan negatifX
, jadi untuk menghindari duplikat saya harus menentukan ituX > 0
.Bagian
;.0
ini ada di sini karena bug (enumerate tidak berfungsi pada integer 0).Predikat utama
Predikat 1
sumber
Python 2, 53 byte
Uji di Ideone .
sumber
f([1111111111111111])
, sepertinyarepr(n)
berisi'L'
danint('L')
melempar aValueError
. Saya merasa Anda perlu distr(n)
sini?J,
3327 byte6 byte terima kasih kepada @miles .
Dalam penerjemah online,
inv
tidak ditanamkan. Ubah itu menjadi^:_1
gantinya.Pemakaian
Di mana
>>
STDIN dan<<
STDOUT.Sedikit tidak berbulu
Versi 33 byte sebelumnya
Pemakaian
Di mana
>>
STDIN dan<<
STDOUT.Sedikit tidak berbulu
sumber
f&.g
untuk menerapkang
, kemudianf
, dan kemudian kebalikan darig
mempersingkat*:@<.@%:
menjadi<.&.%:
2 byte. Anda dapat mengatur ulang dan hanya menggunakan lantai untuk mendapatkan#~[:(=<.)@%:+/"1@(10&#.inv)
untuk 27 byte manainv
adalah^:_1
, dan sudah didefinisikan.Javascript 66 byte
Terima kasih untuk SergioFC karena telah menghemat 7 byte
sumber
c+d
sajac-+-d
? Selain itu, Anda dapat menggunakann%1==0
untuk menguji apakah hasilnya int, jadi mungkin Anda dapat menyimpan beberapa byteb=>!(Math.sqrt((b+"").split``.reduce((c,d)=>c-+-d))%1)
untuk memfilterPerl 5, 42 byte
41, ditambah 1 untuk
-pe
bukan-e
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$s
menguji apakah$s
memiliki 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:
s/./$s+=$&/ger
menambahkan setiap karakter numerik ke$s
(dan baris baru adalah 0 seperti di atas)sumber
JavaScript (Node.js) , 48 byte
Cobalah online!
Penjelasan
sumber
MATL,
161413 byteCobalah secara Online!
Penjelasan
sumber
Julia - 38 byte
Sangat mudah untuk melihat apa yang dilakukannya.
digits
mengubah angka menjadi daftar digitnya,sum
sehingga menghitung digit-sum,√
kemudian akan menghasilkan angka utuh jika angka tersebut adalah kuadrat, jika tidak akan ada bagian fraksional.%1
hanya akan mengembalikan bagian pecahan, dan jika itu nol (==0
),filter
akan menyimpannya di daftar, jika tidak maka akan disaring.Digunakan sebagai
![22228,4,113125,22345]
sumber
Jolf, 8 byte
Coba di sini!
Penjelasan
sumber
MATLAB,
524342 byteMenciptakan fungsi anonim bernama
ans
yang 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.sumber
Clojure, 110 byte
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
sumber
Perl 6 ,
3835 byteUji:
sumber
C,
143141 byteTidak dicoba coba online
sumber
Retina , 69
Karena menguji kuadrat sempurna di retina. Ini dapat dimodifikasi untuk perhitungan root kuadrat integer umum .
Input adalah daftar yang dipisahkan oleh baris baru.
Cobalah online.
a
a
unary dinyatakan sebagaib
s, dipisahkan dengan spasisumber
%
konfigurasi,\G
dan meneruskan referensi. Silakan mengambilnya: retina.tryitonline.net/... :)Python, 50 byte
Jika n adalah daftar input angka
sumber
Ruby , 39 byte
Cobalah online!
sumber
K (oK) ,
191713 byteLarutan:
Cobalah online!
Penjelasan:
Catatan:
sumber
func#list
) ?MathGolf ,
54 byteCobalah online!
Penjelasan:
MathGolf masih dalam pengembangan,
jadi saya berasumsi input implisit akan segera datang untuk memotong byte pertama.Yay!sumber