縮退を逆にして追加する


22

イントロ

リバースと追加は、見た目と同じくらい簡単nで、逆の順序で数字に追加します。(例:234 + 432 = 666)。

このプロセスを繰り返し適用すると、いくつかの数字は最終的に素数にヒットし、一部は素数に到達しません。

私は現在持っています

11431担当者

11431 is not prime
11431 + 13411 = 24842 which is not prime
24842 + 24842 = 49684 which is not prime
49684 + 48694 = 98378 which is not prime
98378 + 87389 = 185767 which is prime!

この数は素数に当たります

対照的に、3の倍数は決して素数にヒットしません。これは、3のすべての倍数の桁の合計が3の倍数であるためです。したがって、3の倍数を反転して加算すると、常に3の新しい倍数になり、素数になることはありません。

仕事

正の整数nを取り、繰り返し反転と加算が素数になるかどうかを判断します。真実または偽の値を出力します。の真理は素数に到達し、偽の値はそうではないか、またはその両方が許容されます。

素数はゼロ反復で素数に到達すると見なされます。

これはので、コードをできるだけ短くしてください。

テストケース

プライムに到達する場合はtrueプライムに到達しない場合はfalse

11 -> True
11431 -> True
13201 -> True
13360 -> True
13450 -> True
1019410 -> True
1019510 -> True
22 -> False
1431 -> False
15621 -> False
14641 -> False

ヒント

このチャレンジを書いている間に、この問題をかなり簡単にするクールなトリックを発見しました。このトリックなしでは不可能ではなく、それでも簡単ではありませんが、助けになります。これを発見するのはとても楽しかったので、以下のネタバレのままにしておきます。

逆方向と追加を繰り返すと、6回以下の繰り返しで常に11の倍数になります。11の倍数に達する前に素数にヒットしない場合、素数にヒットすることはありません。


コーディングよりも数学的な問題だと思います。コードの問題には、回答者がコードに実装する特定のルールがあります。私は、この挑戦​​には当てはまらないと思います。
アルジュン

@ DobbyTheFree-Elfこの問題と典型的な「コーディング」問題の違いは、後者の場合、実装されるアルゴリズムが明らかであり、できるだけ少ないコードでそれを行うだけの問題だと思います。この課題により、最初からアルゴリズムを思い付く必要があります。どちらも独自のユニークなパズルを引き起こしますが、どちらも最終的にはまだコーディングの問題です。
小麦ウィザード

私はあなたのコメントに同意しますが、私の意見では、この課題に存在するそのようなアルゴリズムを考え出すことは、プログラマーというよりも数学者の仕事です。他の人がどう思うかわかりませんが、少なくとも私はそう思っています。だから、これには私の下票があります。
アルジュン

1
@ DobbyTheFree-Elf私はあなたにそれを破るのは嫌いですが、優れたプログラマーであるという重要な部分の問題を解決するための効率的なアルゴリズムを見つけます。
小麦ウィザード

私もそれに同意します。しかし、このチャレンジのアルゴリズムには、より数学的な価値があります。数学者が何をするのか、私の意見では、あらゆる可能な入力で正しい出力を保証するために、実証済みの数学定理を見つけたり作成する必要があります。この場合、ブルートフォースなどの一般的なアプローチは機能しません。
アルジュン

回答:



3

Haskell、65バイト

fを取り、Integerを返しますBoolTrueそれは素数に到達することを意味します。

f n=gcd(product[2..n-1])n<2||gcd 33n<2&&f(n+read(reverse$show n))

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

残念ながら、短いが非効率的なプライムテストは、OPのTrueテストケースが11大きくなりすぎて終了できないことを意味します。しかし、たとえば11432はTrue終了するケースです。

TIOがすべてのTrueテストケースを完了できるように、この3バイト長いものを試すこともできます。

f n=and[mod n i>0|i<-[2..n-1]]||gcd 33n<2&&f(n+read(reverse$show n))

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

両方のバージョンの素数テストは1で中断しますが、とにかく素数(2)に到達することが起こります。

それ以外の場合、Ruby提出のネタバレでGBと同じことに気付きました。

数値が偶数長になると、次の反復は11で割り切れます。数値が11で割り切れると、後続のすべての反復も割り切れます。


@WheatWizardまあ、それは反復回数が制限されていることを意味し、(申し訳ありませんが、コメントにスポイラータグはありません)最大6ステップをチェックします(たとえば100が最大です)。簡単に試してみると、これは短い解決策にはならないようです。それより強力なものを意味しますか?
Ørjanヨハンセン

いいえ、それは6が最大でした
ウィートウィザード


2

パイソン278の 70 69バイト

f=lambda x:all(x%a for a in range(2,x))or x%11and f(x+int(`x`[::-1]))

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

説明

このプログラムは、

永久に失われる数字はすべて、6回以内に11の倍数になります

このプログラムは、論理比較回路を備えた再帰ラムダです。最初にnが素数かどうかをチェックします。

all(x%a for a in range(2,x))

これが真の場合、真を返します。

falseの場合、11の倍数かどうかを確認します。

x%11

falseの場合はfalseを返し、そうでない場合はf次の反復の結果を返します

f(x+int(`x`[::-1]))

2

ゼリー、11バイト

ṚḌ$+$6СÆPS

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


この答えを読んでいる人の利益のために、最後STものも同様です。RD$+$することもできる+RD$$、またはRD+<newline>Ç(すべての些細な変更)
HyperNeutrino

@HyperNeutrino私が選んだのSは、1を超えるものが表示される可能性が低いためです。そこにはありませんRDただ、ṚḌと私は選んだṚḌ$+$、私はそれをよりよく整理することができるように。
エリックアウトゴルファー

私はドットを入れるのが面倒でした。私はあなたが置く理由を知っていますS。私はそれを選びましたがT、それは主に他の皆の興味のためです。
-HyperNeutrino

1

05AB1E14 13バイト

編集:スタックに十分な要素がない場合、入力が再利用されるため、1バイトを保存しました

[Dp#D11Ö#R+]p

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

質問のヒントを使用します

使い方

[              # begin infinite loop
               # implicit input
 D             # duplicate input
  p            # push primality of input
   #           # if prime, break
    D          # duplicate input
     11        # push 11
       Ö       # push input % 11 == 0
        #      # if multiple of 11, break
               # implicit push input
          R    # reverse input
           +   # add both numbers
            ]  # end infinite loop
             p # push primality of result; 1 if prime, 0 if multiple of 11
               # implicit print


0

JavaScript(ES6)、73バイト

0またはを返しますtrue

f=n=>{for(d=n;n%--d;);return d<2||n%11&&f(+[...n+''].reverse().join``+n)}

コメント済み

これは、Wheat Wizardで説明されている魔法のネタバレ式に基づいています。

f = n => {              // given n:
  for(d = n; n % --d;); // find the highest divisor d of n
  return                //
    d < 2 ||            // if this divisor is 1, return true (n is prime)
    n % 11 &&           // else: if 11 is a divisor of n, return 0
    f(                  // else: do a recursive call with
      +[...n + '']      // the digits of n
      .reverse().join`` // reversed, joined,
      + n               // coerced to a number and added to n
    )                   //
}                       //

テストケース

完了までに数秒かかるため、スニペットから最大の2つの入力を削除しました。(しかし、彼らは同様に働きます。)



0

Microsoft SQL Server、826 786 *バイト

* Microsoft Sql Server 2012で導入されたIIF機能について思い出した

set nocount on
use rextester
go
if object_id('dbo.n','IF')is not null drop function dbo.n
go
create function dbo.n(@ bigint,@f bigint)returns table as return
with a as(select 0 c union all select 0),b as(select 0 c from a,a t),c as(select 0 c from b,b t),
d as(select 0 c from c,c t),e as(select 0 c from d,d t),f as(select 0 c from e,e t),
v as(select top(@f-@+1)0 c from f)select row_number()over(order by(select 0))+@-1 n from v
go
with u as(select cast(a as bigint)a from(values(11),(11431),(13201),(13360),(13450),(1019410),(1019510),(22),(1431),
(15621),(14641))u(a)),v as(select a,a c from u union all select a,c+reverse(str(c,38))from v
where 0=any(select c%n from dbo.n(2,c/2))and c%11>0)select a,iif(0=any(select max(c)%n from dbo.n(2,max(c)/2)),0,1)
from v group by a option(maxrecursion 0)

オンラインで確認する

よりきちんとしたフォーマット

SET NOCOUNT ON;
USE rextester;
GO
IF OBJECT_ID('dbo.n', 'IF') IS NOT NULL DROP FUNCTION dbo.n;
GO
CREATE FUNCTION dbo.n(@ BIGINT,@f BIGINT)RETURNS TABLE AS RETURN
  WITH
    a AS(SELECT 0 c UNION ALL SELECT 0),
    b AS(SELECT 0 c FROM a,a t),
    c AS(SELECT 0 c FROM b,b t),
    d AS(SELECT 0 c FROM c,c t),
    e AS(SELECT 0 c FROM d,d t),
    f AS(SELECT 0 c FROM e,e t),
    v AS(SELECT TOP(@f-@+1)0 c FROM f)
    SELECT ROW_NUMBER()OVER(ORDER BY(SELECT 0))+@-1 n FROM v;
GO
WITH u AS(
  SELECT CAST(a AS BIGINT) a
  FROM(VALUES (11), (11431), (13201), (13360), (13450), (1019410), (1019510),
              (22), (1431), (15621), (14641)) u(a)
),
v AS(
  SELECT a, a c FROM u
    UNION ALL
  SELECT a, c + reverse(str(c, 38))
  FROM v
  WHERE 0 = ANY(SELECT c % n FROM dbo.n(2, c / 2)) AND c % 11 > 0
)
SELECT a, IIF(0 = ANY(SELECT MAX(c) % n FROM dbo.n(2, MAX(c) / 2)), 0, 1)
FROM v
GROUP BY a
OPTION (MAXRECURSION 0);

/*true*//*false*/コメントが必要ですか?
エソランジングフルーツ

いいえ。予想される結果に従って入力データを分離するために使用されたコメントです。
アンドレイオデゴフ

それらを削除できますか?
エソランジングフルーツ

はい、もちろん、コメントは削除できます。
アンドレイオデゴフ

入力がハードコーディングされているようです。よくわかりませんが、代わりにテーブルから選択するのが許容できる入力形式だと思います
ジョーキング


0

PHP 114バイト

<?php function f($n){$n1=strrev((string)$n);$r=$n+(int)$n1;for($i=2;$i<$r;$i++){if($r%$i==0){die('0');}}die('1');}

より読みやすいバージョン:

<?php function f($n)
{
    $n1 = strrev((string)$n);
    $r = $n + (int)$n1;
    for ($i = 2; $i < $r; $i++) {
        if ($r % $i == 0) {
            die('0');
        }
    }
    die('1');
}

f(11431 );

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

バイトを数えるためにこのことを使用しました。


ああ、それは終了するはずです。その時、私は質問を誤解しました。false-yの場合に終了するように質問を編集しました。
アンドリュー

現在、最初のリバースが素数でない限り、常にfalseを返します。また、最初のケースをチェックしていません。n素数です。そして、TIOは、それもあなたが使用できることを提出テンプレートの自動フォーマッタを持っている...あなたのためのバイトカウンタを持っている
ジョー・キング
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.