よ少年、それを合計する必要があります


67

すべての正の整数は、任意ベースで最大で3つの回文正の整数の和として表すことができるBの ≥5。   Cilleruelo et al。、2017

正の整数は、先行ゼロなしでそのベースでの表現が同じ逆方向を読み取る場合、特定のベースでパリンドロームです。以下では、ベースb = 10 のみが考慮されます。

回文数の合計としての分解は一意ではありません。たとえば、55、またはの合計として直接表現できます2, 3。同様に、またはとして132分解できます。44, 44, 44121, 11

挑戦

正の整数を指定すると、10を基数とするパリンドロームの3つ以下の正の整数にその合計分解を生成します。

追加のルール

  • 使用されるアルゴリズムは、任意の大きな入力に対して機能するはずです。ただし、プログラムがメモリ、時間、またはデータ型の制限によって制限されている場合は許容されます。

  • どんな合理的な手段でも入出力を取ることができます。入出力形式は通常どおり柔軟です。

  • 出力形式が明確である限り、各入力に対して1つ以上の有効な分解を生成することを選択できます。

  • すべてのプログラミング言語でプログラムまたは機能が許可されます。標準的な抜け穴は禁止されています。

  • バイト単位の最短コードが優先されます。

入力には多くの分解があるため、これらはテストケースではなく例です。各分解は異なる行に表示されます。

Input  ->  Output

5     ->   5
           2, 3

15    ->   1, 3, 11
           9, 6

21    ->   11, 9, 1
           7, 7, 7

42    ->   22, 11, 9
           2, 7, 33

132   ->   44, 44, 44
           121, 11

345   ->   202, 44, 99
           2, 343

1022  ->   989, 33
           999, 22, 1

9265  ->   9229, 33, 3
           8338, 828, 99

32
うーん、タイトルを
しゃべる

私は疑問に思う:2つの回文に構成されなければならない整数はありますか?これは(ない場合は、ちょっと、ゴルファーはこの事実を使用してのみ確認することができます素敵なテストケースになるだろうk=1k=3。)
リン・

@Lynnは「ありそうもない」と思われますが、これは各入力に対してかなりの数の分解があることが判明したためです。しかし、我々は知っているように、数学で直感がそう誤解を招くことができます...
ルイスMendo

1
@Lynn k=1(元の番号がすでに回文であるように)許可している場合、それは他の2つの番号が両方とも0であると想定していることを意味します。k=2ために働くだろうk=33つの数字の1が0の場合
ダレル・ホフマン

私はあなただけ2 3 1ケースをカバーして無視することができ、ONLYしたがって2の和として表現することができる任意の数字がないと思う
マジックタコ壺

回答:


19

Brachylog、7バイト

~+ℕᵐ.↔ᵐ

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

驚くほど遅くありません。

説明

(?)~+  .          Output is equal to the Input when summed
     ℕᵐ.          Each element of the Output is a positive integer
       .↔ᵐ(.)     When reversing each element of the Output, we get the Output

2
.説明のランダムなのは(.)何ですか?Brachylogを本当に知らない。
魔法のタコUr

3
@MagicOctopusUrn .は出力変数です。~+ℕᵐ、および↔ᵐ左右の変数を持つ述語です。これらの重複は.、出力がこれら3つの述語呼び出しのそれぞれに直接関係していることを単に示しています。最後(.)は、出力変数が暗黙的にプログラムの最後の変数であることを表示するためです。したがって、最後に述べた関係は、実際.↔ᵐ.には「出力の出力結果に逆マッピングすることを意味します
致命的

最終的に非常に良い入力は> 10000
RosLuP


8

ゼリー12 10 9 8バイト

ŒṗDfU$ṪḌ

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

使い方

ŒṗDfU$ṪḌ  Main link. Argument: n (integer)

Œṗ        Find all integer partitions of n.
  D       Convert each integer in each partition to base 10.
     $    Combine the two links to the left into a chain.
    U     Upend; reverse all arrays of decimal digits.
   f      Filter the original array by the upended one.
      Ṫ   Take the last element of the filtered array.
          This selects  the lexicographically smallest decomposition of those with
          the minimal amount of palindromes.
       Ḍ  Undecimal; convert all arrays of decimal digits to integers.

5
ソリューションを〜140バイトで送信したかったのですが、8バイトが表示され、「私は投稿しないでください」と思います。
YU NO WORK

15
言語間でスコアを比較することはほとんど意味がありません。Pythonの回答を自分で投稿しました。この回答に勝つチャンスがあるからではなく、考えられる最短のPythonの回答だからです。
デニス

8

Python 2、117バイト

def f(n):p=[x for x in range(n+1)if`x`==`x`[::-1]];print[filter(None,[a,b,n-a-b])for a in p for b in p if n-a-b in p]

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

リストのリストを出力します。各リストは解決策です。ロッドは9バイトを節約しました。


-9バイト、関数への切り替え交換c減算とし、使用filter
ロッド

1
@ロッドあり​​がとう!filter(None私が夕食を作っている間にも私を襲った、ハハ。c → n-a-bかっこいいです:)
リン

7

JavaScript(ES6)、115 ... 84 83バイト

未使用のエントリにゼロが埋め込まれた3要素の配列を常に返します。

f=(n,b=a=0)=>(r=[b,a%=n,n-a-b]).some(a=>a-[...a+''].reverse().join``)?f(n,b+!a++):r

テストケース


6

R、126バイト145バイト

19バイトのゴルフをしてくれたGiuseppeに感謝

function(n){a=paste(y<-0:n)
x=combn(c(0,y[a==Map(paste,Map(rev,strsplit(a,"")),collapse="")]),3)
unique(x[,colSums(x)==n],,2)}

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

説明

Rには文字列を逆にするネイティブな方法がなく、多くのデフォルトの文字列操作は数値に対して機能しません。そのため、最初に一連の正の整数(プラス0)を文字に変換します。

次に、0のベクトルとすべての回文を作成します。文字列の反転では、各数値を文字で分割し、ベクトルの順序を逆にして、隙間なくそれらを貼り付ける必要があります。

次に、3つのすべてのグループ(ここでは0が重要です)を確認します。幸いなことに、Rには、各列の組み合わせのマトリックスを返す組み込み関数が組み込まれています。

colSums関数をマトリックスに適用し、提供されたターゲットに等しい要素のみを保持します。

最後に、2つの0があるため、2つの正の整数のセットが重複するため、列で一意の関数を使用します。

出力は、各列が合計してターゲット値になる正の回文整数のセットである行列です。怠zyであり、使用される要素が3つ未満の場合は0を返します。


1
128バイト。+1、しかし、Map回文を生成するための素晴らしい使用!
ジュゼッペ


4

ゼリー、14バイト

L<4aŒḂ€Ạ
ŒṗÇÐf

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

非常非効率的です。


ターゲットは、コードの長さが私のためにそれが唯一の長さではない、場合でも、あまりにも遅いようだ
RosLuP

@RosLuPここでは、コードの効率を維持することを目指していません。ここでは、可能な限りコードを短くすることを目指しています。これは、必ずしも実際に動作する必要はなく、理論的に動作する必要があります。これは、コードゴルフの 制限された複雑さコードゴルフの 制限時間のチャレンジではなく、コードゴルフのチャレンジだからです。
エリックアウトゴルファー

4

ゼリー、17バイト

RŒḂÐfṗ3R¤YS⁼³$$Ðf

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

HyperNeutrinoのおかげで-6バイト。

すべての方法を出力します。ただし、出力にはいくつかの重複が含まれます。


1
is palindrome組み込みの笑があります
-HyperNeutrino

また、通常の(上げられた)範囲を使用する場合、最後の4バイトを削除できます
-HyperNeutrino


@cairdcoinheringaahingそれでもデニスもエリックも負けません。とにかく、切り捨てられた Deflateで圧縮されたBase64でエンコードされたURL を解読しますか?
user202729

@ user202729ええと、リンクを正しくコピーしていないはずです。コードはRŒḂÐfṗ3R¤YS⁼¥Ðf
次のとおり




3

Java(OpenJDK 8)、185バイト

n->{for(int i=0,j=n,k;++i<=--j;)if(p(i))for(k=0;k<=j-k;k++)if(p(k)&p(j-k))return new int[]{j-k,k,i};return n;}
boolean p(int n){return(""+n).equals(""+new StringBuffer(""+n).reverse());}

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

提出には;ラムダの後が含まれていないため、正しい量を取得するにはTIOから1バイトを削除します。


これは私の意見では、それは今まで投稿されたすべて一つの他のソリューションよりも優れている
RosLuP

@RosLuPなぜ私が尋ねるかもしれないのですか?
オリビエグレゴワール

で、最後の入力のための答えを与えるので> 500000(私はよく覚えている場合)
RosLuP

提案するi++<--j代わりに++i<=--j
ceilingcat

2

プロトン、117バイト

a=>filter(l=>all(p==p[by-1]for p:map(str,l)),(k=[[i,a-i]for i:1..a-1])+sum([[[i,q,j-q]for q:1..j-1]for i,j:k],[]))[0]

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

ソリューションを出力します


920入力がョで1分で出力を返さないよう...私は364757698688の話だけで920はない
RosLuP

1
@RosLuPそれは問題ではありません。コードゴルフでは効率は重要ではありません。理論的には、あらゆるサイズの入力に対して機能するため、それは重要ではありません。十分な時間が与えられ、それは920の正しい出力与えるだろう
HyperNeutrino

2

Pyth 16 12  10バイト

ef_I#`MT./

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

使い方

ef_I# `MT。/〜完全なプログラム。

        ./〜整数パーティション。
 f〜変数Tでフィルターします。
     `MT〜Tの各要素を文字列表現にマッピングします。
    #〜フィルター。
  _I〜回文はありますか?(すなわち、逆不変ですか?)
e〜最後の要素を取得します。


2

公理、900バイト

R(x)==>return x;p(r,a)==(n:=#(a::String);if r<0 then(a=0=>R a;n=1 or a=10^(n-1)=>R(a-1);a=10^(n-1)+1=>R(a-2));if r>0 then(n=1 and a<9=>R(a+1);a=10^n-1=>R(a+2));r=0 and n=1=>1;v:=a quo 10^(n quo 2);repeat(c:=v;w:=(n rem 2>0=>v quo 10;v);repeat(c:=10*c+w rem 10;w:=w quo 10;w=0=>break);r<0=>(c<a=>R c;v:=v-1);r>0=>(c>a=>R c;v:=v+1);R(c=a=>1;0));c)
b:List INT:=[];o:INT:=0
f(a:NNI):List INT==(free b,o;o:=p(-1,o);w:=0;c:=#b;if c>0 then w:=b.1;e:=a-o;e>10000000=>R[];if w<e then repeat(w:=p(1,w);w>e=>break;b:=cons(w,b));g:List INT:=[];for i in #b..1 by-1 repeat(b.i>e=>break;g:=cons(b.i,g));if o>e then g:=cons(o,g);n:=#g;for i in 1..n repeat(x:=g.i;x=a=>R[x];3*x<a=>break;for j in i..n repeat(y:=g.j;t:=x+y;t>a=>iterate;t=a=>R[x,y];t+y<a=>break;for k in j..n repeat(z:=t+g.k;z=a=>R[x,y,g.k];z<a=>break)));[])
D(a:NNI):List INT==(free o;p(0,a)=1=>[a];o:=a;for j in 1..10 repeat(t:=f(a);#t>0=>R t);[])

テストコード

--Lista random di n elmenti, casuali compresi tra "a" e "b"
randList(n:PI,a:INT,b:INT):List INT==
    r:List INT:=[]
    a>b =>r
    d:=1+b-a
    for i in 1..n repeat
          r:=concat(r,a+random(d)$INT)
    r

test()==
   a:=randList(20,1,12345678901234)
   [[i,D(i)] for i in a]

このコードが1,2,3パリンドロームの数Xを分解する必要がある場合、このコードはパリンドロームN <Xの近くで試行し、XNを2パリンドロームに分解します。このXNの分解が成功した場合、3回の回文が見つかりました。失敗した場合は、前のパリンドロームG <N <Xを試行し、2つのパリンドロームなどでXGを分解します。Ungolfコード(ただし、いくつかのバグは可能です)

 R(x)==>return x

-- se 'r'=0 ritorna 1 se 'a' e' palindrome altrimenti ritorna 0
-- se 'r'>0 ritorna la prossima palindrome >'a'
-- se 'r'<0 ritorna la prossima palindrome <'a'
p(r,a)==(n:=#(a::String);if r<0 then(a=0=>R a;n=1 or a=10^(n-1)=>R(a-1);a=10^(n-1)+1=>R(a-2));if r>0 then(n=1 and a<9=>R(a+1);a=10^n-1=>R(a+2));r=0 and n=1=>1;v:=a quo 10^(n quo 2);repeat(c:=v;w:=(n rem 2>0=>v quo 10;v);repeat(c:=10*c+w rem 10;w:=w quo 10;w=0=>break);r<0=>(c<a=>R c;v:=v-1);r>0=>(c>a=>R c;v:=v+1);R(c=a=>1;0));c)

b:List INT:=[]   -- the list of palindrome
o:INT:=0         -- the start value for search the first is a

--Decompose 'a' in 1 or 2 or 3 palindrome beginning with prev palindrome of o
--if error or fail return []
f(a:NNI):List INT==
    free b,o
    -- aggiustamento di o, come palindrome piu' piccola di o
    o:=p(-1,o)
    -- aggiustamento di b come l'insieme delle palindromi tra 1..a-o compresa
    w:=0;c:=#b
    if c>0 then w:=b.1 --in w la massima palindrome presente in b
    e:=a-o
    output["e=",e,"w=",w,"o=",o,"#b=",#b]
    e>10000000=>R[]   --impongo che la palindrome massima e' 10000000-1
    if w<e then       --se w<a-o aggiungere a b tutte le palindromi tra w+1..a-o
          repeat(w:=p(1,w);w>e=>break;b:=cons(w,b))
                      -- g e' l'insieme dei b palindromi tra 1..a-o,o
    g:List INT:=[];for i in #b..1 by-1 repeat(b.i>e=>break;g:=cons(b.i,g))
    if o>e then g:=cons(o,g)
    --output["g=",g,b]
    n:=#g
    for i in 1..n repeat
        x:=g.i
        x=a  =>R[x]
        3*x<a=>break
        for j in i..n repeat
           y:=g.j;t:=x+y
           t>a   =>iterate
           t=a   =>R[x,y]
           t+y<a =>break
           for k in j..n repeat
                z:=t+g.k
                z=a =>R[x,y,g.k]
                z<a =>break
    []

--Decompose 'a' in 1 or 2 or 3 palindrome
--if error or fail return []
dPal(a:NNI):List INT==
   free o
   p(0,a)=1=>[a]
   o:=a                  -- at start it is o=a
   for j in 1..10 repeat -- try 10 start values only
        t:=f(a)
        #t>0=>R t
   []

結果:

(7) -> [[i,D(i)] for i in [5,15,21,42,132,345,1022,9265] ]
   (7)
   [[5,[5]], [15,[11,4]], [21,[11,9,1]], [42,[33,9]], [132,[131,1]],
    [345,[343,2]], [1022,[999,22,1]], [9265,[9229,33,3]]]
                                                      Type: List List Any
                                   Time: 0.02 (IN) + 0.02 (OT) = 0.03 sec
(8) -> test()
   (8)
   [[7497277417019,[7497276727947,624426,64646]],
    [11535896626131,[11535888853511,7738377,34243]],
    [2001104243257,[2001104011002,184481,47774]],
    [3218562606454,[3218561658123,927729,20602]],
    [6849377785598,[6849377739486,45254,858]],
    [375391595873,[375391193573,324423,77877]],
    [5358975936064,[5358975798535,136631,898]],
    [7167932760123,[7167932397617,324423,38083]],
    [11779002607051,[11779000097711,2420242,89098]],
    [320101573620,[320101101023,472274,323]],
    [5022244189542,[5022242422205,1766671,666]],
    [5182865851215,[5182864682815,1158511,9889]],
    [346627181013,[346626626643,485584,68786]],
    [9697093443342,[9697092907969,443344,92029]],
    [1885502599457,[1885502055881,542245,1331]], [10995589034484,[]],
    [1089930852241,[1089930399801,375573,76867]],
    [7614518487477,[7614518154167,246642,86668]],
    [11859876865045,[11859866895811,9968699,535]],
    [2309879870924,[2309879789032,81418,474]]]
                                                      Type: List List Any
      Time: 0.25 (IN) + 115.17 (EV) + 0.13 (OT) + 28.83 (GC) = 144.38 sec

1

Java(OpenJDK 8)、605バイト

デュープを印刷しますが、禁止されていません

a->{int i=0,j,k,r[]=new int[a-1];for(;i<a-1;r[i]=++i);for(i=0;i<a-1;i++){if(r[i]==a&(""+r[i]).equals(""+new StringBuffer(""+r[i]).reverse()))System.out.println(r[i]);for(j=0;j<a-1;j++){if(r[i]+r[j]==a&(""+r[i]).equals(""+new StringBuffer(""+r[i]).reverse())&(""+r[j]).equals(""+new StringBuffer(""+r[j]).reverse()))System.out.println(r[i]+" "+r[j]);for(k=0;k<a-1;k++)if(r[i]+r[j]+r[k]==a&(""+r[i]).equals(""+new StringBuffer(""+r[i]).reverse())&(""+r[j]).equals(""+new StringBuffer(""+r[j]).reverse())&(""+r[k]).equals(""+new StringBuffer(""+r[k]).reverse()))System.out.println(r[i]+" "+r[j]+" "+r[k]);}}}

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




1

Perl 6、51バイト

{first *.sum==$_,[X] 3 Rxx grep {$_ eq.flip},1..$_}

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

  • grep { $_ eq .flip }, 1 .. $_ 1から入力数までのすべての回文数のリストを作成します。
  • 3 Rxx そのリストを3回複製します。
  • [X]クロス積演算子を使用してリストのリストを縮小しX、1から入力番号までのすべての3組のパリンドロミン番号のリストを作成します。
  • first *.sum == $_ 入力数に合計する最初のそのような3タプルを見つけます。

を逆にしないことでバイト保存できますxx 3
ジョーキング

1

Python 3、106バイト

lambda n:[(a,b,n-a-b)for a in range(n)for b in range(n)if all(f'{x}'==f'{x}'[::-1]for x in(a,b,n-a-b))][0]

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

TIOリンクでは、可能な組み合わせのリスト全体を作成して最初のものを取得するのではなく、最初の有効な結果をジェネレーターとして取得するより高速な(ただし1バイト長いバージョン)を使用しました。



0

Add ++、62バイト

D,g,@,BDdbR=
D,l,@@,$b+=
D,k,@@*,
L,RÞgdVBcB]Gd‽kdG‽k€bF++A$Þl

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

説明を書きながら、50バイトまでゴルフをしました。ソリューションを含むリストのリストを返すラムダ関数を定義します。

使い方

1,231nn

1,2,...,ngRÞggA

次のセクションは、さらに3つの部分に分割できます。

BcB]
Gd‽k
dG‽k€bF

A[1 2 3 4 ...][[1] [2] [3] [4] ... ]Ak

D,k,@@*,

この関数は基本的に何もしません。2つの引数を受け取り、それらを配列にラップします。ただし、ここでのテーブルの素早い操作は魔法のトリックです。2つのリストを取り、それらの2つのリストの間に要素のすべてのペアを生成します。だから、[1 2 3]および[4 5 6]生成[[1 4] [1 5] [1 6] [2 4] [2 5] [2 6] [3 4] [3 5] [3 6]]。次に、関数引数(この場合k)を受け取り、その関数を各ペアに対して実行します。この場合、ペアをそのまま返します。

A€bF

1,23nln

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