私の後ろにサタンプライムをゲット!


22

サタンプライム

彼らは誰なの?
彼らはしているPrimes含む666
これらサタン-素数です:[46663,266677,666599,666683,616669]
これらはありません[462667,665669,36363631,555]

プロット

6661より大きいすべての数字の後ろにはサタンプリムスがいます

チャレンジ

整数n>6661が与えられた場合、サタンプライムを背後(または等しい)で、それ自体に最も近いものを見つけます。

Integerのn=30000背後には3つのSatan-Primes(SP)があります[6661, 16661, 26669]
あなたのコード26669は、その後ろに最も近いものを返す必要があります

テストケース

入力->出力

6662->6661    
10000->6661    
66697->66697 (a SP returns himself)  
328765->326663  
678987->676661
969696->966677

ルール

Yorコードはn、あなたの言語の範囲内で動作するはずです。

これはなので、バイト単位の最短回答が勝ちです!


1
「約1分」を定義します。30秒ですか?私は個人的に30分と分がそれほど違わないと思います...またボーナスは一般的に眉をひそめている...また、私は、これはと思うかもしれないより良いようだったoutput the nth satan prime挑戦...
ソクラテスのフェニックス

ok ok people ...ボーナスは削除されます

チャレンジタイトルの編集を気にしないでください。
シャギー

3
@Shaggyタイトル変更はどのような点に役立ちますか...?
コナーオブライエン

3
@ ConorO'Brien Rhymingと表示される古風な、私は推測します。
wizzwizz4

回答:



7

ニーム、9バイト

>ͻ:D+6S𝕚÷

説明:

>         Increment input
 ͻ        Start infinite loop
  :        Previous prime
   D       Duplicate
    +6     Push 666
      S    Swap
       𝕚   See if 666 is a substring of the top of the stack
        ÷  If true, break

オンラインでお試しください!


それでは、「66を数字の前に追加」をプッシュする組み込み関数が本当にありますか?O_O Neimは進歩しました。
エリックアウトゴルファー

1
どの+6ように666をプッシュしますか?それとも、ニームはまさにその金属ですか?
ロバートフレイザー

6
@RobertFraserはどうやら+x612 +の文字コードを意味しますx。のコードは6たまたま54なので、612 + 54 = 666です。
fergusq

@EriktheOutgolferまあ、Neimは2バイトを使用して、3桁の数字すべてと4桁の数字を表現できます。
Okx

2
@EriktheOutgolfer '\+*=100,356,612,868(プラス次の文字の序数)
ジョナサンアラン

7

ゼリー10 9バイト

@Dennisのおかげで10%節約!

ÆRwÐf666Ṫ

オンラインでお試しください!

説明

ÆR          # All primes in range [2, input]
   Ðf      # Keep those which satisfy
  w        # truthy if y is in x
     666   #           ^ (this is y)
        Ṫ  # Tail (take the last element)

代替案:ÆRẇ@Ðf666Ṁ
ミスターXcoder

5
テール(666の直後)が十字架のように見えるのが大好きです。
ケイン

4
wの代わりに動作するはずですẇ@
デニス

@Dennis s / sh / w /もちろん動作します:p
エリック・ザ・アウトゴルファー

5

Pyth15 14バイト

Daveの助けを借りて1バイトを保存しました

969696私のマシンのメモリエラーとそれ以上のものですが、十分なメモリが与えられていれば問題ありません。

ef&/`T*3\6P_TS

ここで試してみるか、テストスイートをご覧ください


どうやって?

ef&/ `T * 3 \ 6P_TSQ-完全なプログラム、最後に暗黙的な入力(Q)

             SQ-範囲[1、Q]
 f-フィルター。
          P_T-プライムですか?
  &-そして
   / `T * 3 \ 6-666が含まれています。
e-最後の要素。
                -結果を暗黙的に出力します。

Pyth、14バイト

ef/`T*\63fP_TS

ここで試してみてください!


14バイト:ef&/`T*3\6P_TS
デイブ

私は誤ってエンディングQを追加しました。その14
デイブ

"666"は、文字列666を記述する効率的な方法ではありません*3\6
デイブ


4

Bash + Core Utils、51 49バイト

seq $1|tac|factor|awk 'NF==2&&/666/&&!a--&&$0=$2'

コマンドライン引数を取ります。数値が大きいと非常に遅くなる可能性があります。


これにより、すべての「サタンプライム」が6661まで出力されますが、入力の下の最も近いもののみが印刷されるはずですオンラインで試してください。1つの修正方法は|head -1、最後に追加するだけです。
ジャスティンマリナー

@JustinMariner笑、おっと、それを修正
markasoftware

4

Mathematica、64 62 61 53バイト

#//.i_/;!PrimeQ@i||ToString@i~StringFreeQ~"666":>i-1&

@KellyLowderのおかげで-1バイト

-8バイト(すごい)@Notatreeのおかげ

説明

入力してください。これらの条件下でデクリメントします:

  • 入力が素数ではない、または

  • 入力の数字に3つの6が連続して含まれていません。

サタンの素数に達するまで、それを繰り返します。


2
非常に素晴らしい。首相は6で終了することはできませんので、あなたは終わり_ 1以上を失うことができる
ケリーLowder

@KellyLowderの良い点
ジョンファン

1
これは、文字列でさえ短い:#//.i_/;!PrimeQ@i||ToString@i~StringFreeQ~"666":>i-1&
未ツリー

1
@Notatreeすごい!いいね!
ジョンファンミン


3

ジャプト、14バイト

õ fj w æ_sø666

試して

そこにとして見ていました、50%の時間ベースのボーナス:を完了テストケース969696半秒下で。


説明

integerの暗黙的な入力U

õ

から整数の配列を生成1Uます。

fj

フィルター(f)プライム。

w

逆。

æ_

以下1をチェックする関数を介して渡されたときに、真理値(この場合)を返す最初の要素を返します。

sø666

文字列に変換された整数(s)には(ø)666。


より高速な代替案、15バイト

繰り返しますが、元々は時間ベースのボーナスがあったので、これは代替の、はるかに高速なソリューションで、これ以上ゴルフをすることはできません。

U-@j *U´sø666}a

試して


2

PowerShell、128バイト

param($n)function f($a){for($i=2;$a-gt1){if(!($a%$i)){$i;$a/=$i}else{$i++}}}for(){if($n-match666-and($n-eq(f $n))){$n;exit}$n--}

オンラインでお試しください!

PowerShellには素因数分解が組み込まれていないため、これはPrime Factors Buddiesに関する私の答えからコードを借用しています。

入力を受け取り$n、入力function fの要素を計算する新しいものを宣言します$a。入力$aが素数の場合、これは単にを返します$a

プログラムの主要部分は無限for()ループです。ループ内では、$n -matchesがesに反する666かどうか、および$n素数(つまり、の$nすべての要素に一致するかどうか)をチェックし$nます。そうである場合$n、パイプラインとexitに配置し、暗黙的な出力を使用します。それ以外の場合は、デクリメント$n--してループを継続します。


鉱山バージョンをトリミングし、バイトカウントの半分に達することができました
TessellatingHeckler

2

パイソン277の 76バイト

編集:@ Mr.Xcoderのおかげで-1バイト

実行時間が遅い、で実行 O(n^2)

lambda x:max(q for q in range(x+1)if"666"in`q`*all(q%t for t in range(2,q)))

オンラインでお試しください!

別の76バイトソリューション

lambda x:max(q*("666"in`q`*all(q%t for t in range(2,q)))for q in range(x+1))

オンラインでお試しください!

SymPy 73バイト

lambda x:max(q for q in primerange(0,x+1)if"666"in`q`)
from sympy import*

オンラインでお試しください!


76バイト:lambda x:max(q for q in range(x+1)if"666"in`q`*all(q%t for t in range(2,q)))-使用max()の代わりに[][-1]
氏Xcoder


2

MATL、16バイト

ZqP"@V'666'Xf?@.

MATL Online試しください

説明

         Implicitly grab input (n)
Zq       Compute the primes up to n (output is in increasing order)
P        Flip the array (so larger primes come first)
"        For each prime
  @V     Convert it to a string
  '666'  Push the string literal '666' to the stack
  Xf     Find the location of '666' in the prime
  ?      If it was present...
    @.   Push it to the stack and break
         Implicitly display the stack contents

2

C ++ 389バイト

#include <iostream>
#include <boost/multiprecision/cpp_int.hpp>
#include <boost/multiprecision/miller_rabin.hpp>
using namespace boost::random;typedef boost::multiprecision::cpp_int Z;int main(int,char**v){mt19937 m(clock());independent_bits_engine<mt11213b,256,Z>g(m);Z n{v[1]},p;while(p++<=n)if(miller_rabin_test(p,25,g)&&p.convert_to<std::string>().find( "666" )!=-1)std::cout<<p<<" ";}

これは完全なプログラムです!
コンパイルするにはBoostが必要です。(または、お気に入りのオンラインC ++シェルにコピーして貼り付けます。)
コマンドラインからnを引数として実行します。

ゴルフをしていない:

#include <iostream>
#include <boost/multiprecision/cpp_int.hpp>
#include <boost/multiprecision/miller_rabin.hpp>
using namespace boost::random;

typedef boost::multiprecision::cpp_int integer;

int main( int argc, char** argv )
{
  mt19937 mt( clock() );
  independent_bits_engine <mt11213b, 256, integer> rng( mt );

  integer input {argv[ 1 ]};
  integer possible;

  while (possible++ <= input)
    if (
      // is_prime( possible )
      miller_rabin_test( possible, 25, rng )
    && 
      // possible has "666" in it
      (possible.convert_to <std::string> ().find( "666" ) != std::string::npos))

    std::cout << possible << " ";
}

ショートカットは、乱数テストの観点から作成されました。元のコードは6661で可能な素数のテストを開始し、2ずつ増加しました。また、nposの代わりに(-1)があるため、コンパイラの警告が表示されます。

それでも、これは非常に迅速に実行されます。私の古いAMD Sempron 130で、1,000,000未満の214のサタンプライムをすべて見つけるのに約40秒しかかかりませんでした。

:^ D


2

Bash + bsd-gamesパッケージ、33

  • @FedericoPoloniのおかげで2バイト節約されました。
primes 2 $[$1+1]|grep 666|tail -1

オンラインでお試しください


最後の2つのコマンドをに置き換えると、1バイトを節約できますtail -n1
フェデリコポロニ

@FedericoPoloni当たり前- tailここで忘れたなんて信じられない。実際tail -1、さらに1つ少なくなっています。
デジタル外傷


1

JavaScript(ES6)、55 54バイト

@ThePirateBayのおかげで-1バイト。

f=n=>/666/.test(d=n)&eval("while(n%--d);d<2")?n:f(n-1)

入力が大きいと非常に遅くなります。このコードのゴルフの答えから適応した素数テスト

タイミング

  • 入力に10000は10秒かかりました
  • 入力に328765は3分かかりました
  • 入力に678987は9分かかりました
  • 入力に969696は16分かかりました

テスト

これらの一部は、ブラウザを数分間ハングさせます。

より高速なバージョン、56バイト

各テストケースを1秒以内に完了します。

f=n=>/666/.test(n)&&eval("for(d=2;n%d++;);d>n")?n:f(n-1)

;[6662, 10000, 328765, 678987, 969696].forEach(n=>console.log(`f(${n}) -> ${f(n)}`))


2
絶対にやらないでください。これはコードゴルフであり、パフォーマンスはまったく無関係です。以前の55バイトの回答にロールバックすることを強くお勧めします。また、あなたは置き換えることにより、54バイトに、それを減らすことができd==1d<2いるのでn>6661

52バイト:f=n=>/666/.test(n)&(g=d=>n%--d?g(d):d<2)(n)?n:f(n-1)ただし、大きな数値では再帰エラーがスローされます。
シャギー

f=n=>/666/.test(d=n)-eval("while(n%--d);d")?f(n-1):n
l4m2

1

ルビー、676658、56のバイト

+7バイトを含む-rprime

->z{z.downto(1).find{|x|/666/=~x.to_s&&x.prime?}}

かなり高速で、最大~2^52約1秒2^64で5分以内に値を計算します(2011 MBP、Ruby 2.3.1)。


1

スタックス、10 バイト

ü>:Ñb/VP6─

実行してデバッグする

説明(開梱):

^w:pc$666$#! Full program, implicit input-parsing
^            Increment input
 w           do-while:
  :p           Previous prime
    c$         Copy and stringify
      666$     Push "666"
          #    Number of occurences
           !   Logical not
             Implicit output

素敵なプログラム。スタックスをお試しいただきありがとうございます。参考までに、この
再帰的

@再帰ああ、thx
wastl



0

C#(.NET Core)117 115 112バイト

f=>{for(int i=f;i>1;i--){int p=1,j=2;while(j<i)if(i%j++<1)p=0;if(p>0&$"{i}".Contains("666"))return i;}return 0;}

オンラインでお試しください!

  • 不要なブレースを削除することで2バイト節約されました。
  • int宣言を組み合わせることで3バイト節約されます。

これはもっと短くできると確信しています。たぶん、再帰的にfunc f外側のforループを呼び出して削除することによって。

再帰的アプローチ、85バイト

i=>{int p=1,j=2;while(j<i)if(i%j++<1)p=0;return p>0&$"{i}".Contains("666")?i:f(--i);}

オンラインでお試しください!

Func<int,int> f = null最初のセットを設定する必要があるため、このアプローチがcode-golfの範囲内に収まるかどうかはわかりfませんが、これは再度呼び出されますが、バイトにはカウントされません。明確化をいただければ幸いです。

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