Asal mı? matematik olmadan [kapalı]


14

Girişin asal sayı olup olmadığını belirten herhangi bir dilde bir program veya işlev yazın.

  • Girdi, taban-10'daki doğal sayıyı temsil eden bir dizedir .
  • Çıktı iki dizgiden biri "Prime" veya "Not !!" girdiyi doğru bir şekilde tanımlar.
  • Aritmetik işleçler, bit-bilge işleçleri, sayısal değişkenler ve sabitler, genel olarak "matematik-öğeleri", vb. Programınızın hiçbir yerine izin verilmez. Gerekli tüm "hesaplamaları" yapmak için dize işlemlerini kullanmalısınız .
  • Dize uzunluklarını (sayı olan) karşılaştırabilirsiniz, ancak eğer yoksa -10 puanınızla puanlayabilirsiniz.
  • Programınız herhangi bir uzunluk girişi üzerinde çalışmalıdır (yeterli bellek ve zaman verilir).
  • En düşük bayt sayısı (UTF-8) kazanır.

Sayıdaki sınırlar nelerdir? Olumsuz olabilir mi? Sıfır? Ondalık basamak içerebilir mi?
Justin

Bonus puanları varsa, kod golf
Peter Taylor

Girdi üzerindeki sınırları belirlemek için "doğal" eklendi.
Wally

Ben bazı çılgın açık dize manipülasyon (kişisel olarak bir dize "azaltmak için bir dize azaltmak için kod yazma düşünüyordum - ve ben dize uzun bölümü ve tekrarlanan dize çıkarma ... arasında parçalanmış umuyordum o serin küçük regex tekli başbakan ile şaşırdı! Belki de daha da harika şeyler alıp almadığımı görmek için regex'e izin vermeme sorusunu tekrar sormam gerekiyor? Ama hiçbir şeyin bu normal ifadenin özüne yaklaşabileceğini sanmıyorum.
Wally

"Daha harika şeyler" elde etmek için belki de popülerlik yarışması yapmayı deneyebilirsiniz . Sorunun kendisini değiştirmek genellikle hoşnutsuzdur. Ve birileri aklınıza gelmeyen bir şey bulduğu için yeni bir soru sormanız veya herhangi bir şeyi değiştirmeniz gerektiğinden emin değilim - sanırım burada oldukça sık oluyor. Ayrıca, kural bükme sporun bir parçası :)
daniero

Yanıtlar:


7

Yakut, 64-10 = 54

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

Bu, '1' (artı bir yeni satır) dizesinden giriş dizesine yinelenir, Ruby'nin 1 ekleme gibi korkunç bir lot gibi görünen ancak teknik olarak hiçbir noktada üst düzey bir sayısal değişken oluşturmayan yerleşik dize yineleme yöntemini kullanarak . Bir n-uzunluğu dizesi oluşturmak için n girişinin n yinelemeleri olacağı gerçeğini kullanır, ardından bu dizenin aynı alt dizelere gruplanıp gruplanamayacağını belirlemek için normal bir ifade kullanır.


"Harita {? 1}" daki "1" bir Fixnum mu? - öyleyse, "map ('1') olarak değiştirmek zorunda kalabilirsiniz? İfade ile ilgili herhangi bir belge bulamıyorum? 1 Ruby'nin eski sürümlerinde ASCII kodları döndürdüğü ve şimdi bir dize döndürdüğüne dair bazı ipuçları dışında .
Wally

? 1, '1' ile aynıdır, 1 karakterlik bir dize değişmezidir. 1'den ilki bütün örnekleri başka bir karakterle değiştirebilirim.
histokrat

Tamam - bu yapıyı her yerde iyi tarif edemedim!
Wally

Ben bunu "kazanan" olarak seçiyorum çünkü matematikten bile bahsetmiyorum bile.
Wally

3
Abigail'e şapka ipucu yok mu? Utanç. Bu 1998 perl çözümünün düz bir limanıdır: catonmat.net/blog/perl-regex-that-matches-prime-numbers
skibrianski 16:14

16

Yakut: 52-10 = 42

Bu ünlü prime-regex'in bir varyasyonunu kullanarak.

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

Daha açıkçası: ?_*gets.to_iekler bir dize operasyondur "_"kendisine n zamanlarda, nerede n girdi numarasıdır. Gördüğüm gibi, hiçbir dize uzunluğu karşılaştırılmamıştır, bu yüzden 10 karakter bonus kriterini karşılamalıdır.


1
Ruby'ye aşina değilim, eğer yanılıyorsam beni düzeltin, ama "to_i" dizeyi bir tamsayıya dönüştürmez mi? Ben tek başına parlak başbakan sevmiyorum değil ...
Wally

1
@Wally Ben "convert" doğru kelime olduğunu düşünmüyorum, ama yöntem bir int döndürür, evet. Yine de, aşağıdakilerden hiçbirini kullanmıyorum Arithmetic operators, bit-wise operators, numeric variables and constantsve bir yöntemi çağırarak gerçekten "math-stuff" in general..?
daniero

@daniero Kulağa makul geliyor - belki de spesifikasyonun kenarında.
Wally

3

Perl 52-10 = 42

uygulama

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

gösteri

$ 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

4
1 gerçekten asal değil.
elixenide

Sayısal bir dizi dizini kullanır - bu nedenle spesifikasyonun kenarında.
Wally

popBunun yerine kullanın $ARGV[0], 4 karakter kaydedin, sayısal dizi dizinini kaldırın
mafya

1

ECMAScript 6, 159-10 = 149

Normal ifade için bir görev gibi görünüyor. G / Ç ile prompt/ alerther zamanki gibi.

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

While döngüsü, ondalık sayıyı her yinelemeyi yalnızca normal ifadeyle birer birer azaltır. Son normal ifade, ilk önce bir faktörü eşleştirerek, ardından ilk faktörü bir dizenin geri kalanı için tekrarlayarak bileşik x sayısından oluşan bir dize ile eşleşir.


Dize azaltma işlevini seviyorum - açık ve özlü.
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]

İstenen sonucu yazdıracak N adında bir işlev oluşturur. Sonlandırılmamış sürüm buna benzer. Bazı değişkenleri temizlemek için bir el küçültme yaptım ve sonra bunu çirkinleştirerek çalıştırdım ve sonra el tekrar küçülttü.

// 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!!");
}

Bu snippet'i kullanarak test ettiniz:

for(var X=0;X<10;X++) {
  console.log('checking: ' + X);
  N(X.toString());
}

1
Bunun nasıl çalıştığından emin değilim, ancak sayısal bir değişken (i) ve aritmetik işleç (i ++) görüyorum.
Wally

Oh, böyle bir for döngüsü yapamayacağımı bilmiyordum .. bu gece yeniden yazacak.
Sugendran

Temelde uzunlukları asal olan dizeleri bir dizi üretiyorum. Bir girdi aldığımda, dizenin uzunluk değeri girdiyle eşleşene kadar bir dizeye karakterler eklemeye devam ediyorum. Daha sonra bu ipi alıp, bilinen primerlerden herhangi birine eşit olarak bölüp bölemeyeceğimi görüyorum. Eğer yapamıyorsam asal olmalı. Ve bölünerek, bilinen asal dizeyi alıp kendisine eklemeye devam ediyorum, dizenin uzunluğu söz konusu dizeye eşit veya daha büyüktür.
Sugendran

Kodu güncelledim, aslında karakter sayısını biraz azaltır :)
Sugendran

Güzel. Normal ifade ile aynı fikir gibi görünüyor, ancak daha etkili ve açık bir şekilde gerçek mantığı gösteriyor.
Wally

0

Bash 66-10 = 56

uygulama

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

gösteri

$ 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

Yukarıdaki gibi, 1 asal değildir.
Wally

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.