素数ですか?数学なし[非公開]


14

入力が素数であるかどうかを判断する任意の言語でプログラムまたは関数を作成します。

  • 入力は、10を底とする自然数を表す文字列です。
  • 出力は、2つの文字列「Prime」または「Not !!」のいずれかです。入力を正しく識別します。
  • 算術演算子、ビット単位の演算子、数値変数と定数、一般的な「数学スタッフ」などは、プログラムのどこでも使用できません。必要なすべての「計算」を行うには、文字列操作を使用する必要があります。
  • 文字列の長さ(数字)を比較できますが、そうでない場合は-10をスコアと比較します。
  • プログラムは、任意の長さの入力で動作するはずです(十分なメモリと時間が与えられます)。
  • 最小バイトカウント(UTF-8)が優先されます。

数の限界は何ですか?マイナスになることはありますか?ゼロ?小数点を含めることはできますか?
ジャスティン

ボーナスポイントがある場合、コードゴルフ
ピーターテイラー

入力の境界を指定するために「自然」を追加しました。
ウォーリー

私はいくつかのクレイジーな明示的な文字列操作に驚かれることを望んでいました(私は文字列を「減らす」ためにコードを書いてループすることができると考えていました-そして文字列の長い除算と繰り返される文字列の減算の間で引き裂かれました...)、代わりに私はそのクールな小さな正規表現単項プライムマッチャーに驚いた!おそらく、さらに素晴らしいものが得られるかどうかを確認するために正規表現を許可しないで、もう一度質問する必要がありますか?しかし、その正規表現の簡潔さに近いものができるとは思いません。
ウォーリー14

「もっと素晴らしいもの」を手に入れるには、多分あなたはそれを人気コンテストにしようとすることができます。しかし、質問自体を変更することは一般に眉をひそめています。そして、誰かがあなたが考えていなかった何かを思いついたという理由だけで、あなたが新しい質問をするか、何かを変更するべきかどうかはわかりません-それはここでかなり頻繁に起こると思います。また、ルールの曲げはスポーツの一部です:)
daniero 14

回答:


7

ルビー、64-10 = 54

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

これは、文字列「1」(および改行)から入力文字列まで反復します。Rubyの組み込みの文字列反復メソッドを使用します。1を追加するように見えますが、技術的には高レベル数値変数を作成しません。nの入力に対してn回の反復があるという事実を使用して、長さnのストリングを作成し、正規表現を使用して、そのストリングを同一のサブストリングにグループ化できるかどうかを判別します。


「map {?1}」の「1」はFixnumですか?-もしそうなら、「map( '1')」に変更する必要がありますか?古いバージョンのRubyではASCIIコードを返し、文字列を返すというヒントを除いて、式?1に関するドキュメントは見つかりません。
ウォーリー

?1は '1'と同じで、1文字の文字列リテラルです。1以外のすべてのインスタンスを他の任意のキャラクターに置き換えることができます。
histocrat

わかりました-その構造がどこにもうまく説明されていませんでした!
ウォーリー14

私はこれを「勝者」として選択します。数学のヒントさえも避けるために邪魔にならないからです。
ウォーリー

3
アビゲイルに帽子はありませんか?恥のために。これは1998年のperlソリューションのストレートポートです。catonmat.net
blog /

16

ルビー:52-10 = 42

その有名な素数一致正規表現のバリエーションを使用します。

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

明確にするために、nは自分自身にn?_*gets.to_i追加する文字列操作です。nは入力番号です。私が見るように、文字列の長さは比較されませんので、10文字のボーナス基準を満足させる必要があります。"_"


1
私はRubyに慣れていないので、間違っている場合は修正しますが、「to_i」は文字列を整数に変換しませんか?単項の素朴な素数チェッカーが好きではないということではありません…
ウォーリー14

1
@Wally「変換」は正しい言葉ではないと思いますが、このメソッドはintを返します、はい。それでも、私は次のいずれも使用せずArithmetic operators, bit-wise operators, numeric variables and constants、メソッドの呼び出しを"math-stuff" in general..?として実際に分類することはできません。
ダニエロ14

@danieroは妥当だと思われます-おそらく仕様の端にあるでしょう。
ウォーリー14

3

Perl 52-10 = 42

実装

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

デモ

$ 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は本当に素数ではありません。
エリクセニド14

数値配列インデックスを使用します-そのため、仕様の端です。
ウォーリー

pop代わりに使用し$ARGV[0]、4文字を保存し、数値配列インデックスを削除します
mob 14

1

ECMAScript 6、159-10 = 149

正規表現のタスクのように聞こえます。通常どおりprompt/ を使用したI / O。alert

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ループは、純粋に正規表現によって各反復ごとに1つずつ10進数を減らします。最後の正規表現は、最初に1つの因子と一致し、次に文字列の残りに対して最初の因子1を繰り返すことにより、xの合成数で構成される文字列と一致します。


明確で簡潔な文字列デクリメント機能が好きです。
ウォーリー

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]

目的の結果を出力するNという関数を作成します。縮小されていないバージョンは次のようになります。私はいくつかの変数をクリーンアップするためにハンドミニファイを行ってから、それをuglifyで実行し、それから再びハンドミニファイしました。

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

このスニペットを使用してテストしました:

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

1
これがどのように機能するかはわかりませんが、数値変数(i)と算術演算子(i ++)が表示されます。
ウォーリー14

ああ、そのようなforループができなかったことに気づきませんでした。今夜、それを書き換えます。
Sugendran

基本的に、長さが素数である文字列の配列を作成しています。したがって、入力を取得すると、文字列の長さの値が入力と一致するまで文字列に文字を追加し続けます。次に、この文字列を取得し、既知の素数で均等に分割できるかどうかを確認します。私ができない場合、それは素数でなければなりません。そして、除算とは、既知の素数文字列を取得し、それ自体に追加し続けることを意味します。文字列の長さは、問題の文字列以上です。
Sugendran

コードを更新しましたが、実際には文字数がわずかに減少します:)
Sugendran 14

涼しい。これは正規表現と同じアイデアのように見えますが、より効率的で、実際のロジックを明示的に示しています。
ウォーリー

0

バッシュ66-10 = 56

実装

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

デモ

$ 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

上記のように、1は素数ではありません。
ウォーリー14

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.