大きさの数字


24

入力として正の整数を指定すると、それが寛大な数であるかどうかが決まります。

寛容な数とは、+基数10の任意の2桁の間に符号を挿入すると、素数の整数を表すような数です。

たとえば、40427は寛大です

4+0427  = 431  is prime
40+427  = 467  is prime
404+27  = 431  is prime
4042+7  = 4049 is prime

出力

入力が寛大な場合とそうでない場合の2つの異なる値を出力する必要があります。

得点

このコンテストの目的は、このタスクを解決するために記述されたソースコードのサイズを、バイト単位でできるだけ小さくすることです。

テストケース

1       -> True
2       -> True
4       -> True
10      -> False
98      -> True
101     -> True
109     -> False
819     -> False
4063    -> True
40427   -> True
2000221 -> True

OEIS 253996


1と2が有効な入力であるという課題の定義に混乱しています。ことはおろか1任意の2つの文字の間に挿入し、プラス記号(無挿入)のみをもたらすことが1プライムされていない自体、。
魔法のタコUr

4
@MagicOctopusUrnプラス記号は2桁の間に挿入する必要があります。 122桁式の集合空ではありません。空のセットのメンバーはすべて素数です。さらに、それらはどれもありませんが、それはポイントのほかです。少しわかりにくいですが、それをお伝えしますが、他の方法よりも理にかなっていると思います。
小麦ウィザード

回答:


8

05AB1E、10バイト

コード

η¨¹.s¨R+pP

05AB1Eエンコードを使用します。オンラインでお試しください!またはすべてのテストケースを検証してください!

説明

η¨             # Take the prefixes of the input and remove the last element
  ¹.s¨         # Take the suffixes of the input and remove the last element
      R        # Reverse the array of suffixes
       +       # Vectorized addition
        p      # Check if each element is prime
         P     # Product of the array

どのようにそれがために働くありません1 - 9。空の集合の積は1?どうして?
魔法のタコUr

@MagicOctopusUrn 空の製品は常に1に等しい
Adnan

@MagicOctopusUrn製品の取得は、基本的に1セット内の各アイテムで開始し、乗算するため、
...-ETHproductions

1
ああ、数学的に理にかなっています。どれだけのように推測sum[]に相当し0、かなりスマートだっ実装する際に誘導プロパティを使用して、。
魔法のタコUr

@jontroはい、UTF-8では14バイトです。ただし、05AB1Eは05AB1Eコードページを使用します。これは10バイトです。
アドナン

7

C(gcc)、8384 85 83 84 86 75 111 バイト

すべての最適化がオフになり、GCC 32ビットでのみ有効になりました。

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

+ 1ケース用のいくつかのバイト。

+再利用可能な機能のためのいくつかのバイト。

i,j,r,s;f(a){for(i=10,r=1;a/i;i*=10)for(s=a%i+a/i,r*=s-1,j=2;j<s;)r*=s%j++>0;a=!r;}

入力を整数として受け取ります。偽の場合は1、真の場合は0を返します。

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

Mathematicaコードについての別の回答(55バイト)をご覧ください。


これは2つの別々の答えである必要があります。また、Mathematicaのソリューションは、のために誤った結果を与える1984063
-ngenisis

6

網膜、38バイト

\B
$`$*_$'$*_
S`\d
G`^_$|^(__+)\1+$
^$

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

1寛大な数字などを印刷し0ます。

説明

\B
$`$*_$'$*_

2つの数字(単語の境界ではない位置)の間の各位置を一致させ、その一致のプレフィックスとサフィックスの両方を_単項数字として使用して、単項で挿入することから始めます。したがって+、s を挿入する代わりに、合計の単項結果をそこに直接挿入します。

S`\d

ここで、文字列を数字の周りに分割して、各合計がそれぞれの行に移動し、それらの数字を削除するようにします(先頭行と末尾行も空になりますが、それは重要ではありません)。

G`^_$|^(__+)\1+$

これは、単項の非素数に一致する標準の正規表現です。Gここでrepステージを使用するということは、正の非プライムを含むすべての行を単に保持することを意味します(空の行を破棄します)。

^$

最後に、文字列が空かどうかを確認します。入力が寛大だった場合、前の段階ではすべての行が破棄され(すべて素数であるため)、これによりが得られ1ます。そうでなければ、いずれかの行が素数でない場合、それは文字列に残り、正規表現は失敗し、を与え0ます。




3

Java 8、175 171 94 88バイト

n->{long d=10,r=0,i,t;for(;d<=n;d*=10,r|=t-i)for(t=n/d+n%d,i=1;t%++i%t>0;);return r==0;}

-77 @PeterTaylorのおかげで、(String withの代わりに.substring)算術を使用し、整数が素数であるかどうかを確認するための別のメソッドを取り除くことができました。@SaraJのプライムチェックメソッド
を使用して-6バイトなので、必ず彼女に投票してください!

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

説明:

n->{                  // Method with long as both parameter and return-type
  long d=10,r=0,i,t;  //  Some temp longs
  for(;d<=n           //  Loop as long as `d` is below or equal to input `n`
                      //  (inclusive instead of exclusive due to special case 10)
      ;               //    After every iteration:
       d*=10,         //     Multiple `d` by 10
       r|=t-i)        //     and Bitwise-OR `r` with `t-i`
    for(t=n/d+n%d,    //   Set `t` to `n` integer-divided by `d` plus `n` modulo-`d`
        i=1;          //   Set `i` to 1
        t%++i%t>0;);  //   Inner oop as long as `t` modulo `i+1` modulo `t` is not 0 yet
                      //   (after we've first increased `i` by 1 with `++i`)
                      //   (if `t` equals `i` afterwards, it means `t` is a prime)
  return r==0;}       //  Return if `r` is still 0

1
これを短縮するには、少なくとも2つの方法があると思います。まず、ループインpを再帰に置き換えます。次に、メイン関数がbe returnからセンチネル値を作成し、それを使用してすべての戻り値がであることを確認することにより、1つのステートメントのみを必要とするように結果を蓄積します。p-1&-1
ピーターテイラー

1
実際、大きなものは文字列を使用しないことです。
ピーターテイラー

n->{for(long d=10,m=1;d<n;d*=10)m|=p(n/d+n%d,2)-2;return m>0;}long p(long n,int i){return i<n?p(n%i<1?1:n,i+1):n;}
ピーターテイラー

@PeterTaylor提案をありがとう!最後に提案された機能については、それが正しいと確信していますか?何か間違ったことをしていない限り、私は現在、間違った結果を出しいます。
ケビンCruijssen

1
OK、d<=n処理し10ます。スタックオーバーフローは問題になりません(仕様では処理する必要のある入力範囲は提供されていません)が、ループに戻してインライン化することで修正でき、より多くの節約が得られます
ピーターテイラー

2

Pyth、14バイト

.AmP_ssMcQ]dtU

オンラインでお試しください!True数字が寛大な場合に表示されますが、Falseそうでない場合にます。数値を文字列として受け取ります。

説明

.AmP_ssMcQ]dtU

              Q    # Implicit input Q
            tU     # Generate the range [1, 2, ..., len(Q)-1]
  m                # For each index d in the above range...
        cQ]d       # Split Q at index d
      sM           # Convert the two parts to integers
     s             # Sum
   P_              # Check it is a prime
.A                 # ...end for. Check all elements are True

2

Python 2104の102 98 96 103バイト

  • 2バイトの@Wheat Wizardのおかげで:i1回だけ呼び出されるため、完全に匿名になりました。
  • 4バイトの@Hyperneutrinoに感謝します。スライスする代わりにメインの数字から数字を取得するスマートな方法
  • @Hyperneutrinoはさらに2バイトを節約しました。 x-1xました。これは、素数チェックを行うためだけのものです。
  • x=10@Dennisと@Wheat Wizardが発見したおかげで、ケースの失敗を修正し、7バイトを追加しました:私の以前のバージョンは1をプライムと考えていました
lambda x:all((lambda x:x>1and all(x%j for j in range(2,x)))(x/10**j+x%10**j)for j in range(1,len(`x`)))

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



クール、ありがとう@HyperNeutrino
officialaimm

1
96バイトx-1範囲の最後にある必要はありません。右側の範囲は排他的です。
ハイパーニュートリノ

1
これは10(新しいテストケース)で失敗します。
デニス

1
これは10で失敗します。また、これが失敗するのは10 だけだと思います。
小麦ウィザード

2

Japt24 16バイト

これは、@ Shaggy、@ ETHproduction、および私の間のコラボレーションでした。

¬£[YîU UtY]xÃÅej

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

入力を文字列として受け取ります。


ああ!私が取り組んでいた代替ソリューションとほぼ同じです!ここまでで22バイトがありました。編集:両方からのものを組み合わせることにより、20バイトにそれを下げました。
シャギー

@Shaggyおかしい、私は今編集に取り組んでいます...それはあなたのものと驚くほど似ています:ethproductions.github.io/japt/…-
オリバー

ヒント:x配列内の項目を数字に自動的に変換します
;

うん、それも私が行きたいところです、@ ETHproductions:16 bytes
シャギー

また、XîU天才です。U¯X同じ長さで機能すると思いますが、それでも
-ETHproductions

2

ピップ25 24バイト

$&0N_%,_=1M$+(a^@_)M1,#a

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

説明

a最初のコマンドライン引数です。1,#aを含む範囲を生成1len(a)-1ます。これに、ラムダ関数をマッピングします。

$+(a^@_)
   a^@_   Split a at this index
$+(    )  Fold the resulting 2-element list on +

次に、0N_%,_=1素数性をテストする別のラムダ関数をマップします。私はこの答えからそれを取りました。そこで説明を読むことができます。最後に、論理AND($&)でリストを折りたたみます。結果は、1すべての合計が素数だった場合、0、それらのいずれかない場合、すべての場合です。

例、入力4063

                    1,#a   [1; 2; 3]
           $+(a^@_)M       [67; 103; 409]
  0N_%,_=1M                [1; 1; 1]
$&                         1

2

CJam、22バイト

r:L,({)_L<i\L>i+mp!},!

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

真実の場合は正の整数、偽の場合はゼロを出力します。

-1 ピーターテイラーによる巧妙なトリックに感謝します。
-3 Peter Taylorによる別のヒントに感謝します。


0&!より短い1+:*
ピーターテイラー

賢いです@PeterTaylorああ...あなたがいるという事実に虐待!falsy値と戻りブールと使用済みのセットの交差点を0あなたが行うことができるように0&!3の代わりにを1&!!...
エリックOutgolfer

入力を変数に割り当てると、スタックの操作が簡単になり、の,代わりにフィルター演算子を使用して、さらに3バイトを節約できますf
ピーターテイラー

PS !ブール値への変換に使用する際の悪用はありません。これはGolfScriptの標準であり、CJamの標準です。そして、それ1&!!は間違っているでしょう0&!。要件は、すべてではなく存在するため、明らかなテストです。
ピーターテイラー

@PeterTaylorそれは私が意図したものではありません...:P
エリックアウトゴルファー

2

Japt、23バイト

入力を文字列として受け取ります。

それをやった 私が取り組んでいたはるかに短い選択肢でパンチtoられた

£i+Ýe@OxXr"%+0+"'+)j

試して


@ETHproductions、いいえ、あなたは正しかったです。元のバージョンが間違っていました。寛大な素数のみをチェックします。¬£i+YÄÃe@OxX j
シャギー

私は私の心を失っていないことを知っていた; P
ETHproductions

1
失敗します4063(trueである必要があり、falseです)。ここでのトリックはJSが有力と考えていることである0あなたが進たいの手段...
ETHproductions

うーん... OK、私は代替手段があると思います-それをテストしてゴルフするのに数分かかります。
シャギー

私は(...これは他の二つの数字が続く2個の0が含まれているいくつかのケースになりましたが失敗すると思う40043だけ追加例えば、)+の後に0この問題を解決します。
-ETHproductions

2

Mathematica、75バイト

And@@Table[PrimeQ@ToExpression@StringInsert[#,"+",n],{n,2,StringLength@#}]&

Functionを期待していStringます。番目の桁の後にをPrimeQ@ToExpression@StringInsert[#,"+",n]挿入すると素数になるかどうかを返します。文字列の長さまでの範囲としてこれらの値のリストを提供します。次に、そのリストの各要素を取得します。便利な場合、が空のリストである場合、+nTable[...,{n,2,StringLength@#}]n2AndStringLength@#<2Table[...]And@@{}==True


2

Mathematica、55 50 45 49 50 54 62 バイト

個別に投稿する必要があるようです。

再測定されたコード長の+6バイト。

ngenisisのおかげで+5バイト。

And@@(qPrimeQ[#~Mod~q+⌊#/q⌋])@Rest@PowerRange@#&

入力を整数として受け取り、通常のTrueおよびを返しFalseます。イン間0xF4A1 UNICODEで、短いですFunction[,]。コード長はファイルサイズ(BOMなしのUTF-8)で測定され、正しくない場合はコメントします。

PowerRange[x]は、1、10、100 ...を返しますx。これは、Mathematica 10で導入されました。


2

平易な英語 4204 341 315 251 241 240バイト

3,863バイトをプレーンイングリッシュのライブラリに移動することにより、プライマリティテストをプレーンイングリッシュのライブラリに(再)組み込みました。26バイトの空白を削除しました。ローカル変数を短縮して64バイトを節約しました。インターフェイスを短縮して10バイトを節約しました。パーRosLuPさんの提案、mを初期化し、インクリメントされる方法を変更することにより、1つのバイトを救いました。

To decide if a n number is g:
Put 1 in a m number.
Loop.
Multiply the m by 10.
If the m is greater than the n, say yes.
Divide the n by the m giving a q quotient and a r remainder.
Add the q to the r.
If the r is not prime, say no.
Repeat.

最終コードの非ゴルフバージョン:

To decide if a number is magnanimous:
  Put 1 in another number.
  Loop.
    Multiply the other number by 10.
    If the other number is greater than the number, say yes.
    Divide the number by the other number giving a quotient and a remainder.
    Add the quotient to the remainder.
    If the remainder is not prime, say no.
  Repeat.

注:Plain English IDEはgithub.com/Folds/englishで入手できます。IDEはWindows上で実行されます。32ビットx86コードにコンパイルします。

Osmosian注文平易な英語のの動的なフォークはすでにバージョン4700に素数判定を持っていたが、それは(2017年6月を通じて1月のような)非常に非効率的なアルゴリズムを使用していました。GitHubサイトの動的フォークのバージョン4001〜4011では、素数性テストが省略されています。GitHubサイトのダイナミックフォークのバージョン4013には、素数性テストが含まれています。素数性テストを実行するコードは、この回答の以前の改訂の一部として開発されました。


1

Perl 6、58バイト

{?(10,10* *...^*>$_).map({$_ div$^a+$_%$^a}).all.is-prime}

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

10, 10 * * ...^ * > $_入力パラメーターを超える要素の1つ前までの10の倍数の幾何学的シーケンスです$_。次に、10の累乗ごとに、入力パラメータのdivとmodの合計がその累乗であることを確認します。


1

ハスケル、 114 110バイト

p x=[x]==[i|i<-[2..x],x`mod`i<1]
i!x|i<1=0<1|0<1=p(uncurry(+)$divMod x$10^i)&&(i-1)!x
f x=(length(show x)-1)!x

説明のないゴルフ:

-- Check if x is a prime number
p x = [x] == [i | i<-[2..x], x`mod`i < 1]
-- Checks all pairs of numbers a '+' can be put in between
i ! x | i<1 = 0<1                                -- Single-digit numbers are always truthy
      | 0<1 = p (uncurry (+) $ divMod x $ 10^i)  -- Does x split at i digits from right sum up to a prime?
           && (i-1) ! x                          -- If so, check next pair
-- Start (!) with the number of digits in x minus one
f x = (length (show x)-1) ! x

p x=[x]==[i|i<-[2..x],x`mod`i<1]プライムチェックとして使用すると、2バイト節約できます。
小麦ウィザード

次のdivMod x$10^i代わりに使用することもできますx`divMod`(10^i)
ウィートウィザード

@WheatWizard:プライムテストはどういうわけか改善できることを知っていました。;)ありがとう!
シラクーサ

1

公理、88バイト

f(n:PI):Boolean==(i:=10;repeat(q:=n quo i;q=0 or ~prime?(q+n rem i)=>break;i:=i*10);q=0)

テストと結果

(10) -> [[i,f(i)]  for i in [1,2,4,10,98,101,109,819,4063,40427,2000221,999999999999999999999999999999999999999999999]]
   (10)
   [[1,true], [2,true], [4,true], [10,false], [98,true], [101,true],
    [109,false], [819,false], [4063,true], [40427,true], [2000221,true],
    [999999999999999999999999999999999999999999999 ,false]]



0

積み上げ、51バイト

[tostr:#'1-~>splitat tr['+',' '#`#~prime]map 1,all]

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

これは機能です。引数を文字列に変換し(tostr)、複製して長さを取得し(:#')、1を減算し(1-)、1からその数値までの範囲を作成します(~>)。スタックは、入力の場合、次のようになります40427

('40427' (1 2 3 4))

vectorizedを実行するsplitatと、次の配列がスタックの一番上になります。

(('4' '40' '404' '4042') ('0427' '427' '27' '7'))

これをtrで転置すると、次のようになります。

(('4' '0427') ('40' '427') ('404' '27') ('4042' '7'))

次に、関数['+',' '#(with〜prime ] map`)をマッピングします。この機能は次のことを行います。

['+',' '#`#~prime]
 '+',                concatenate a plus sign (string)    `('4' '0427' '+')
     ' '#`           join by spaces                      `'4 0427 +'`
          #~         evaluate                            `431`
            prime    check primality                     `1`

次に、マップの後に、連結し1ます。これは空のリストをall返すundefためです。


0

JavaScript(ES6)、70バイト

P=(n,x=2)=>n%x?P(n,x+1):n==x
f=(n,i=10)=>i>n||P((n/i|0)+n%i)&f(n,i*10)

計算中の「再帰が多すぎる」エラーのため、私のブラウザの最後のケースで失敗しますP(200023)。これが無効にならないことを願っています。


0

QBIC、38バイト

_L;|[a-1|q=q*µ!_sA,b|!+!_sA,b+1,a|!}?q

説明

_L |     Create a variable a and set it to the length of
  ;      the input string (A$)
[a-1|    FOR b = 1 to a-1
q=q*     multiply q by
 µ       -1 if prime, 0 if not, of
  !        a cast of 
   _s       a substring of
     A,       A$
     b        from index 1 to index b (only one index is given, so that is assumed to be the req. length from 1)
      |!   to number
 +         plus
 !         a cast of
  _s         a substring of
    A,         A$
    b+1        from index b+1
    ,a         for the length of a (does not error if it exceeds the end of the string)
      |!   to number
 }       NEXT 
 ?q      PRINT q, which is eitrher -1 or 1 for all-prime sums, or 0 otherwise

0

CJam(21バイト)

r:R,({RiA@)#md+mp!},!

オンラインデモオンラインテストスイート

解剖

r:R       e# Take a token of input and assign it to R
,(        e# Take the length of R minus one
{         e# Filter i = 0 to (length of R minus two)
  Ri      e#   Push R as an integer value
  A@)#    e#   Push 10 to the power of (i + 1)
  md      e#   divmod
  +mp!    e#   Add, primality test, negate result
},        e# The result of the filter is a list of splits which give a non-prime
!         e# Negate result, giving 0 for false and 1 for true


0

APL(NARS)、文字35、バイト70

{0≥k←¯1+≢⍕⍵:1⋄∧/0π(m∣⍵)+⌊⍵÷m←10*⍳k}

テスト:

  f←{0≥k←¯1+≢⍕⍵:1⋄∧/0π(m∣⍵)+⌊⍵÷m←10*⍳k}
  f¨1 2 4 10 98 101 109 819 4063 40427 2000221
1 1 1 0 1 1 0 0 1 1 1 

これはAxiomポストアルゴのAPLの翻訳です...

{0≥k←¯1+≢⍕⍵:1⋄∧/0π(m∣⍵)+⌊⍵÷m←10*⍳k}
 0≥k←¯1+≢⍕⍵:1⋄  assign to k the length as array of argument return 1 if that is <=0
 ∧/0π(m∣⍵)+⌊⍵÷m←10*⍳k
              m←10*⍳k  m is the array pow(10,1..k)
           ⌊⍵÷m       the array of quotient of argumet with m
          +           sum 
     (m∣⍵)            with array of remander
   0π                 build the binary array of "are prime each"
 ∧/                   and that array

0

PHP、100バイト

for(;++$k<strlen($a=$argn);$x+=$i==1)for($i=$n=substr($a,$k)+$b.=$a[$k-1];--$i&&$n%$i;);echo$x+2>$k;

プリント1されていない場合、入力が寛大な、空の出力である場合。でパイプとして実行する-nR、オンラインで試してください


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