Apakah ini yang utama? tanpa matematika [tertutup]

14

Tulis program atau fungsi dalam bahasa apa pun yang memberi tahu jika inputnya adalah bilangan prima.

  • Input adalah string yang mewakili bilangan alami di basis-10.
  • Outputnya adalah salah satu dari dua string "Perdana" atau "Tidak !!" yang mengidentifikasi input dengan benar.
  • Operator aritmatika, operator bit-bijaksana, variabel numerik dan konstanta, "matematika" pada umumnya, dll ... tidak diizinkan di mana pun dalam program Anda. Anda harus menggunakan operasi string untuk melakukan semua "perhitungan" yang diperlukan.
  • Anda dapat membandingkan panjang string (yang merupakan angka) - tetapi -10 pada skor Anda jika tidak.
  • Program Anda harus bekerja pada input panjang apa pun (diberikan cukup memori dan waktu).
  • Hitungan byte terendah (UTF-8) menang.
Wally
sumber
Apa batasan pada nomor tersebut? Bisakah itu negatif? Nol? Bisakah itu mengandung titik desimal?
Justin
Jika memiliki poin bonus, ini bukan kode-golf
Peter Taylor
Ditambahkan "alami" untuk menentukan batas pada input.
Wally
Saya berharap untuk dikejutkan dengan beberapa manipulasi string eksplisit gila (saya secara pribadi berpikir tentang menulis kode untuk "mengurangi" string sehingga saya bisa loop - dan saya terbelah antara string string yang panjang dan pengurangan string yang berulang ...), alih-alih saya terkejut dengan pencocokan utama regex unary kecil yang keren itu! Mungkin saya perlu mengajukan pertanyaan lagi yang melarang regex untuk melihat apakah saya mendapatkan barang yang lebih bagus? Tapi saya tidak berpikir apa pun akan bisa mendekati singkatnya regex itu.
Wally
Untuk mendapatkan "lebih banyak barang menarik" mungkin Anda bisa mencoba menjadikannya kontes-popularitas . Mengubah pertanyaan itu sendiri umumnya disukai. Dan saya tidak yakin Anda harus membuat pertanyaan baru atau mengubah apa pun hanya karena seseorang datang dengan sesuatu yang tidak Anda pikirkan - saya pikir itu cukup sering terjadi di sini. Juga, aturan lentur adalah bagian dari olahraga :)
daniero

Jawaban:

7

Ruby, 64 - 10 = 54

puts ('1
'..gets).map{?1}*''=~/^1?$|^(11+?)\1+$/?'Not!!': :Prime

Ini beralih dari string '1' (ditambah baris baru) ke string input, menggunakan metode iterasi string bawaan Ruby yang terlihat sangat buruk seperti menambahkan 1, tetapi yang secara teknis tidak membuat variabel numerik tingkat tinggi di titik mana pun . Ia menggunakan fakta bahwa akan ada n iterasi untuk input n untuk membuat string n-length, kemudian menggunakan ekspresi reguler untuk menentukan apakah string itu dapat dikelompokkan ke dalam substring yang identik.

histokrat
sumber
Apakah "1" di "map {? 1}" adalah Fixnum? - jika demikian, Anda mungkin harus mengubahnya ke "map ('1')? Saya tidak dapat menemukan dokumentasi pada ekspresi? 1 kecuali beberapa petunjuk bahwa dalam versi Ruby yang lebih lama ia mengembalikan kode ASCII dan sekarang mengembalikan sebuah string .
Wally
? 1 sama dengan '1', string literal 1 karakter. Saya bisa mengganti semua instance 1 tetapi yang pertama dengan karakter lain.
histokrat
Ok - Saya tidak bisa menemukan konstruksi yang digambarkan dengan baik di mana saja!
Wally
Saya memilih ini sebagai "pemenang" karena itu keluar dari jalan untuk menghindari bahkan sedikit matematika.
Wally
3
Tidak ada tip untuk Abigail? Karena malu. Ini merupakan solusi langsung dari solusi perl 1998: catonmat.net/blog/perl-regex-that-matches-prime-numbers
skibrianski
16

Ruby: 52 - 10 = 42

Menggunakan variasi dari regex prime-matching yang terkenal itu.

puts ?_*gets.to_i=~/^(_|(__+?)\2+)$/?"Not!!":"Prime"

Untuk lebih jelasnya: ?_*gets.to_iadalah operasi string yang menambahkan "_"ke dirinya sendiri n kali, di mana n adalah nomor input. Seperti yang saya lihat tidak ada panjang string yang dibandingkan, sehingga harus memenuhi kriteria bonus 10 karakter.

daniero
sumber
1
Saya tidak begitu terbiasa dengan Ruby, jadi perbaiki saya jika saya salah, tetapi bukankah "to_i" mengubah string menjadi integer? Bukannya aku tidak suka pemeriksa utama yang cerdas di unary ...
Wally
1
@Wally, saya tidak berpikir "konversi" bukan kata yang tepat, tetapi metode mengembalikan int, ya. Namun, saya tidak menggunakan yang berikut ini Arithmetic operators, bit-wise operators, numeric variables and constants, dan Anda tidak dapat benar-benar mengklasifikasikan memanggil metode sebagai "math-stuff" in general..?
daniero
@daniero Kedengarannya masuk akal - mungkin tepat di ujung spec.
Wally
3

Perl 52-10 = 42

Penerapan

print((('-'x$ARGV[0])=~/^.$|^(..+?)\1+$/)?Not:Prime)

Demo

$ seq 1 10|xargs -I{} bash -c "echo -n '{} '  && perl Prime.pl {} && echo"
1 Not
2 Prime
3 Prime
4 Not
5 Prime
6 Not
7 Prime
8 Not
9 Not
10 Not
Abhijit
sumber
4
Saya tidak benar-benar prima.
elixenide
Menggunakan indeks array numerik - jadi di ujung spec.
Wally
Gunakan popalih-alih $ARGV[0], simpan 4 karakter, hapus indeks array numerik
mob
1

ECMAScript 6, 159 - 10 = 149

Kedengarannya seperti tugas untuk regex. I / O dengan prompt/ alertseperti biasa.

for(s=prompt(u=""); /[^0]/.test(s); )
  s=s.replace(/(.)(0*)$/,(_,d,t)=>u+="x"," 012345678"[d]+t.replace(/0/g,"9"))
alert(/^((xx+)\2+|x?)$/.test(u)?"Not!!":"Prime")

Loop sementara menurunkan angka desimal dengan satu setiap iterasi murni dengan regex. Regex akhir cocok dengan string yang terdiri dari bilangan komposit x, dengan terlebih dahulu mencocokkan satu faktor, lalu yang lain dengan mengulangi faktor pertama untuk sisa string.

FireFly
sumber
Saya suka fungsi decrement string - jelas dan ringkas.
Wally
1

Javascript 266

function N(a){function b(a){return P.every(function(b){if(n=b,i=a.length,j=b.length,j>i) return;if(j==i) return 1;while(n.length<i)n+=b;return n.length!=i})}if(q=A,A!=a)for(;q.length.toString()!=a;)b(q)&&P.push(q),q+=A;console.log(b(q)?"Prime":"Not!!")}A="0",P=[A+A]

Menciptakan fungsi yang disebut N yang akan mencetak hasil yang diinginkan. Versi yang tidak ditambang terlihat seperti ini. Saya melakukan minify tangan untuk membersihkan beberapa variabel dan kemudian menjalankannya melalui uglify dan kemudian tangan minify itu lagi.

// A a string of "0" for using to generate long strings
// P is the store for all known primes
A="0", P=[A+A];
function N(val) {
  function _isPrime(str) {
    // go through all the known primes and return true
    // if we don't match on any of them
    return P.every(function(prime) {
      // prime is some known string whose length is a prime number
      tsr = prime, strlen = str.length, primelen = prime.length;
      // if the string we're checking has fewer chars than
      // this then it's not a prime
      if(strlen < primelen) return 0;
      // if the string we're checking has the same number of chars
      // as the the prime we're checking against then it is a prime
      if(primelen == strlen) return 1;
      // Keep incrementing our temporary string with the prime we're
      // checking. we'll break out of the loop once the temporary string
      // is greater than or equal to the string we're testing
      while(tsr.length < strlen) {
        tsr += prime;
      }
      return !(tsr.length == strlen)
    });
  }
  // start with a string of one unit
  nstr = A
  if(A!=val) {
    // keep incrementing the string so that we can compile a list
    // of known primes smaller than this value
    while(nstr.length.toString() !== val) {
      if(_isPrime(nstr)) {
        P.push(nstr);
      }
      nstr += A;
    }
  }
  console.log(_isPrime(nstr) ? "Prime" : "Not!!");
}

Mengujinya menggunakan cuplikan ini:

for(var X=0;X<10;X++) {
  console.log('checking: ' + X);
  N(X.toString());
}
Sugendran
sumber
1
Saya tidak yakin saya melihat bagaimana ini bekerja, tetapi saya melihat variabel numerik (i) dan operator aritmatika (i ++).
Wally
Oh, tidak menyadari bahwa saya tidak bisa melakukan perulangan seperti itu .. akan menulis ulang malam ini.
Sugendran
Pada dasarnya saya menghasilkan serangkaian string yang panjangnya bilangan prima. Jadi ketika saya mendapatkan input, saya terus menambahkan karakter ke string sampai nilai panjang untuk string cocok dengan input. Saya kemudian mengambil string ini dan melihat apakah saya bisa membaginya secara merata dengan salah satu bilangan prima yang dikenal. Jika saya tidak bisa maka itu pasti prima. Dan dengan membagi saya maksud saya mengambil string prima yang dikenal dan terus menambahkannya dengan sendirinya panjang string adalah sama atau lebih besar dari string yang dimaksud.
Sugendran
Saya telah memperbarui kode, sebenarnya mengurangi jumlah karakter sedikit :)
Sugendran
Keren. Sepertinya ide yang sama dengan regex, tetapi lebih efisien dan secara eksplisit menunjukkan logika yang sebenarnya.
Wally
0

Bash 66 - 10 = 56

Penerapan

[[ -z `printf %$1s|grep -P "^(..+?)\1+$"` ]]&&echo Prime||echo Not

Demo

$ seq 1 10|xargs -I{} bash -c "echo -n '{} '  && ./Prime.sh {}"
1 Prime
2 Prime
3 Prime
4 Not
5 Prime
6 Not
7 Prime
8 Not
9 Not
10 Not
Abhijit
sumber
Seperti di atas, 1 tidak prima.
Wally