Dalam keadilan, ini didasarkan pada pertanyaan StackExchange - tapi itu pertanyaan yang bagus.
Tantangannya cukup sederhana:
- Ambil serangkaian angka
- Temukan dan cetak nomor prima bersebelahan terbesar dalam string
Mencetak:
- Jumlah karakter terendah menang.
- Victor kemungkinan akan menjadi entri skrip golf tetapi kami tidak akan menentangnya, karena kita semua bersenang-senang dan mempelajari banyak hal, benar.
- Pemenang kami akan diberikan ketika saya melihat bahwa saya belum mencentang tombol hijau.
Asumsi:
- String hanya berupa angka
- Jika string berisi huruf, Anda mungkin memiliki perilaku tidak terdefinisi
- String berisi setidaknya 1 prime
- Jika string tidak mengandung 1 bilangan prima yang valid, Anda mungkin memiliki perilaku tidak terdefinisi
- Kecepatan bukanlah kendala
- Gunakan algoritma prima yang lebih pendek daripada yang lebih cepat.
- Jika entri Anda akhirnya selesai, tidak apa-apa, pastikan itu akan terbukti terjadi sebelum panasnya kematian alam semesta.
- Panjang string dapat diasumsikan kurang dari 15 karakter
Sebagai contoh:
>> Input: 3571
<< Output: 3571
>> Input: 123
<< Output: 23
>> Input: 1236503
<< Output: 236503
>> Input: 46462
<< Output: 2
>> Input: 4684
<< Output: ValueError: max() arg is an empty sequence
>> Input: 460
<< Output: 0 # Note, zero is not a prime, but the above string has no valid prime
>> Input: 4601
<< Output: 601
>> Input: "12 monkeys is a pretty good movie, but not as good as se7en"
<< Output: ValueError: Fight Club was also good, I find Brad Pitt to be a consistantly good actor.
Kemungkinan implementasi:
- Temukan semua substring dari input, periksa apakah mereka prima. - Legostormtroopr (asli)
- Temukan semua bilangan bulat kurang dari input, periksa apakah mereka ada di input kemudian periksa apakah bilangan prima - Ben Reich
- Ambil daftar semua bilangan prima kurang dari input, periksa apakah ada di input - daniero
Jawaban:
GolfScript
4037Ini terlihat pada semua angka yang kurang dari atau sama dengan input, memfilter ke bawah ke nomor yang merupakan substring dari input, dan kemudian menyaring lebih jauh ke bilangan prima. Kemudian, dibutuhkan elemen seperti terbesar (yang jelas dijamin memiliki angka paling banyak).
Mari kita bagi menjadi dua bagian utama:
Bagian dari kode ini menyaring ke semua string integer yang terkandung dalam input. Ia menggunakan aksen kubur untuk mengubah angka menjadi string, dan kemudian
?
untuk menentukan indeks substring. Karena?
pengembalian-1
dalam hal tidak ada kontainmen, tambahkan menggunakan)
sehingga output0
untuk non-substring, yang akan berperilaku baik dengan,
penyaringan.Bagian dari kode ini menyaring ke bilangan prima dengan menghitung jumlah faktor kurang dari angka yang diberikan (bilangan bulat adalah faktor hanya jika
number factor %!
adalah 1. Bilangan prima akan memiliki tepat 1 faktor yang benar-benar kurang dari itu sendiri, demikian juga1=
.Karena angkanya berurutan, ambil yang terakhir dan kosongkan tumpukan menggunakan
)\;
Ini jelas tidak seefisien mungkin (karena agak tidak perlu berulang pada semua bilangan bulat kurang dari input), tetapi masih berakhir dengan input besar seperti
1236503
relatif cepat di komputer saya (1 menit).sumber
Python 2.7 - 84
Berikut ini adalah implementasi referensi untuk dikalahkan, saya menggunakannya untuk output contoh dalam pertanyaan, jadi ini dijamin untuk bekerja * Bukan jaminan yang sebenarnya
Peningkatan tanpa malu berdasarkan solusi yang jauh lebih baik dari Ben Reich daripada yang asli saya. Dengan bantuan utama dari Volatilitas
Mantra sebelumnya dari baris kedua meliputi:
Versi asli - 143
sumber
p
dan gantinot p(x)
dengansum(x%i for i in range(2,x))<1
- itu akan bekerja dan membuat Anda turun ke 86 karakter.sum(x%i for i in range(2,x))
akan cukup tinggi untuk sebagian besar angka. Tapi generatornya adalah ide bagus dan saya mendapatkannya di 91.all(x%i for i in range(2,x))
.all
dan tanda kurung Simpan(`x`in`N`)
beberapa lagi juga!Ruby 61
Ambil semua bilangan prima hingga N dan lihat apakah semuanya ada dalam string
Saya pikir ini hanya berfungsi pada Ruby 1.9 dan yang lebih baru, tapi saya tidak yakin.
sumber
Scala (83 karakter)
Saya tidak yakin bagaimana memberikan input ke program sehingga saya anggap
n
sebagai input. Inilah solusi aktual (berdasarkan pada mana panjang solusi dievaluasi). Di bawah ini adalah bentuk solusi yang dapat dieksekusi (yang belum golf) untuk dieksekusi bersama dengan output (untuk sampel memberikan OP miliki).Larutan:
Solusi yang dapat dieksekusi:
Output sampel:
Penjelasan:
Langkah-langkahnya cukup lurus ke depan.
input -> Temukan semua substring -> filter non primes -> cari nilai terpanjang
main(Array[String])
: Metode memberikan input sampel dan menjalankan metodeq(String)
untuk setiap inputq(String)
: Membungkus logika program aktual darip(String)
sehingga setiap pengecualian dilaporkan dengan tepat. Membantu dalam memformat output lebih baik karena input yang tidak valid akan mendapatkanNumberFormatException
di mana kekurangan prima akan melemparUnsupportedOperationException
p(String)
: Logika aktual dari program. Mari kita bagi penjelasan ini menjadi beberapa bagiann.inits
: Membuat sebuahIterator
untuk mengulangi input String (n
)flatMap(f)
: Menerapkan operasi padaIterator
dan mendorong hasilnya menjadi aList
_.tails.toList.init.map(BigInt(_))
: MembagiString
dan menghapus kosongString
dari resultanList
. Akhirnya mengkonversiString
keBigInt
yang setara denganjava.math.BigInteger
. Untuk alasan bermain golf,BigInt
dipilih (nama pendek).filter(f)
: jikaf
kembalifalse
, nilai dihapus dari resultanList
_ isProbablePrime 1
: Baris ini bisa saja ditulis_.isProbablePrime(1)
tetapi representasi yang digunakan menyimpan 1 byte. Baris ini benar-benar memeriksa apakah nilainya prima (probabilistically; karenacertainty
diatur ke1
, waktu eksekusi naik tetapi sistem memastikan (lebih atau kurang) bahwa jumlahnya adalah bilangan prima.max
: Menemukan nilai maksimum (bukanString
berdasarkan panjang. Nilai maks aktual)sumber
J (
2422)Membaca dari keyboard sebenarnya lebih pendek daripada mendefinisikan suatu fungsi.
Uji:
Penjelasan:
1!:1[1
: membaca sebaris teks dari keyboard".\.\
: evaluasi (".
) dari setiap akhiran (\.
) dari setiap awalan (\
) dari string.;
: ratakan matriks*1&p:
: kalikan setiap nilai dengan apakah itu prima atau tidak (jadi semua nonprima akan menjadi nol)>./
: dapatkan nilai terbesar dalam daftarsumber
Haskell, 94
main=getLine>>=print.maximum.filter(\x->and$map((0/=).mod x)[2..x-1]).map read.init.scanr(:)[]
sumber
main = getLine >>= print . maximum . filter isPrime . map read . allNums
adalah bentuk aslinya. itu mendapat garis dan memberikan (>>=
) ke fungsi gabungan besar - dikombinasikan dengan.
operator infiks, yang hanya menempatkan hasil dari fungsi yang tepat ke fungsi kiri. hal-hal seperti(\x -> ...)
adalah ekspresi lambda. parameter fungsi diterapkan tanpa tanda kurung dan fungsi dapat diterapkan secara parsial ((0/=)
misalnya fungsi, yang memeriksa apakah angka bukan 0).allNums = init . scanr (:) []
.scanr
pemindaian dan init menghapus nilai terakhir dari hasil scanr, yang merupakan string kosong, yang tidak dapat dibaca ke Integer.map read
membaca daftar string ke nilai yang ditentukan. dalam hal ini Integer atau sesuatu yang lain dari typeclass Integral, karenaisPrime
memerlukan Integral.filter isPrime
tidak persis, apa yang dikatakannya.isPrime x = and $ map ((0/=). mod x) [2..(x-1)]
berarti, diberi daftar dari 2 hingga (x-1), lakukan pemeriksaan divisi dan kemudian terapkanand
ke daftar Bool.Perl 6 (40 karakter, 41 byte)
get
Input pertama$_
, ini membuat panggilan pertandingan regex lebih pendek.:ex
memberikan pencocokan lengkap untuk regex, itu akan memberikan semua kemungkinan. Hyper op+«
(atau+<<
berfungsi juga) akan membuat angka dari objek Match, yang diteruskangrep
dengan&is-prime
sub sebagai pemilih. Akhirnya ambil maksimum dari daftar yang tersisa dan keluarkan.sumber
Mathematica
6747Penjelasan
Kode adalah fungsi murni. Tidak memiliki nama. Di dalamnya,
#
mewakili string input penuh.StringCases
mengambil input, #, dan memeriksa substring,a
dari satu karakter atau lebih (itu sebabnya __ digunakan alih-alih _) yang merupakan bilangan prima; PrimeQ harus mengembalikan True untuk substring.Semua kasus yang menguntungkan, yaitu substring yang merupakan bilangan prima, secara default dikembalikan dalam daftar.
〚1〛
, atau[[1]]
mengambil bagian pertama, yaitu, elemen pertama dari daftar bilangan prima.element[[1]]
adalah singkatanPart[element, 1]
. Jika ada lebih dari satu prime, yang pertama akan menjadi prime terpanjang (StringCases
periksa substring terpanjang terlebih dahulu).Contohnya
sumber
〚1〛
karakter adalah sadis pada kita, non-Mathematica, programmer. (isyarat saya dengan panik khawatir bahwa saya akan buta, kemudian melihat kurung lain dengan kebingungan bahwa mereka terlihat tajam, sedangkan yang ini tidak!)〚1〛
memiliki kurung ganda dan setara dengan[[1]]
. Saya menggunakannya karena braket ganda dianggap sebagai satu karakter.Perl 6 (50 karakter, 51 byte)
+«
memetakan string ke angka,max
mendapatkan angka terbesar,get
menerima garis./(.+)<?{(+$0).is-prime}>/
adalah ekspresi reguler yang mendapatkan semua bilangan prima<?{}>
adalah pernyataan kode.is-prime
adalahInt
metode kelas yang memeriksa apakah angka adalah bilangan prima. Saya perlu memberikan nilai ke angka dengan menggunakan+
, karena iniStr
secara default.:ex
berarti mencoba untuk menemukan SEMUA cocok (termasuk yang tumpang tindih dengan yang lain). Karena bug Rakudo Perl, saat ini mustahil digunakan dim//
sini.Ini berfungsi untuk nomor apa pun, dan jika Anda menghapus
max
(atau menggantinya dengansort
) Anda akan mendapatkan daftar semua bilangan prima dalam nomor tersebut, untuk bonus tambahan (bukan berarti ini memberikan poin, atau apa pun). Misalnya (dengansort
dalam hal ini):sumber