196アルゴリズムコードゴルフ


35

以下のためのショートプログラム書く196-アルゴリズムを。アルゴリズムは整数から始まり、回文に達するまでその逆を追加します。

例えば

input = 5280
5280 + 0825 = 6105
6105 + 5016 = 11121
11121 + 12111 = 23232
output = 23232

入力

整数、これはLyrchrel番号ではありません(つまり、無限に継続するのではなく、最終的にこのアルゴリズムで回文を生成します)

出力

回文が届きました。


6
あなたの質問はおそらく196アルゴリズムに関する唯一の質問だからです。使い捨てタグの作成は役に立ちません。
クリスジェスターヤング

2
私がした何を意味するのか、あなたの質問は一つだけである可能性が高い、これまでにも2年後には、このトピックを関与させます。:-)
クリスジェスターヤング

1
@クリス:まあ、196アルゴリズムは非常に人気があり、さまざまな名前で呼ばれています。ただし、念のために、2年が経過する前に別の質問を投稿します;)
エルベックス

1
@GigaWattも、あなたの最初の質問を読み忘れていました:) A023108sのケースを気にしないでください。
エルベックス

1
@Joelは、A023108と同様に、それらを無視します(それらについて知らないように振る舞います)。とにかく存在するかどうかはわかりません。
エルベックス

回答:


10

APL(22文字)

{a≡⌽a←⍕(⍎⍵)+⍎⌽⍵:a⋄∇a}⍞

これはDyalog APLで機能します。以下に、右から左に説明を示します。

  • { ... }⍞:ユーザーから文字()として入力を取得し、関数({ ... })に入力します。
  • 直接関数内(ステートメントを分離するため、左から右に見ていきます):
    • a≡⌽a←⍕(⍎⍵)+⍎⌽⍵ : a右引数の()reverse()を評価()し、それを右引数自体の評価済みバージョンに追加します。次に、結果をフォーマットし(;つまり、その文字表現を与えます)、変数aにそれを割り当て()、最後にaの逆が等価であるかどうかをテストしますa(つまり、a回文ですか?)。trueの場合、戻りaます。さもないと...
    • ∇aa関数にフィードバックします(暗黙の自己参照です)。

例:

      {a≡⌽a←⍕(⍎⍵)+⍎⌽⍵:a⋄∇a}⍞
412371
585585

2
数文字を保存して、数値入力を使用します。{⍵=A←⍎⌽⍕⍵:⍵⋄∇A+⍵}⎕。中括弧、逆、および評価を保存します。
マリヌス

10

GolfScript、29文字

~]{{.`.-1%.@={;0}{~+1}if}do}%

選択された解説

doもちろん、プログラムの中核はループです。そのため、それについて説明します。

  1. .` 番号をコピーして文字列化します。
  2. .-1% その文字列バージョンをコピーし、逆にします。
  3. .@ 反転バージョンをコピーし、元の非反転バージョンを前面に表示します。

したがって、番号は5280です。この段階では、スタックは次のとおり5280 "0825" "0825" "5280"です。ステージは比較のために設定されます。(比較後、スタックは5280 "0825"何に関係なく残されます---比較するアイテムはポップオフされています。)

  1. 文字列と逆が同じである場合、逆の文字列は気にしないので、それをポップ(;)し、0を返します(doループを終了します)。
  2. 一致しない場合は~、逆の文字列を評価()して(数値にする)、+元の数値に追加()し、1を返しdoます(ループを続行します)。

4
キーボードのランダムなキーを押していないのですか?そのように見える

1
@ M28:GolfScriptはPerlよりもラインノイズのように見えますよね。;-)
クリスジェスターヤング

私はそれがそのコードに苦痛でなければならない、あなたに同情

@ M28:これは、Luhnアルゴリズム用に書いたソリューションほど苦痛ではありませんでした。考えてみてください。:-P
クリスジェスターヤング

あなたの家族はあなたを心配している

10

Python 2、55バイト

JPvdMerweの提案に従ってください:

n=input()
while`n`!=`n`[::-1]:n+=int(`n`[::-1])
print n

Python 2、62:

n=raw_input()
while n!=n[::-1]:n=`int(n)+int(n[::-1])`
print n

Hehe ..)))))))
ナキロン

2
見て、nintとして、あなたは、コードをチェックし、6つの文字で短縮することができますmeta.codegolf.stackexchange.com/q/75/62
JPvdMerwe

私は、ファイルの最後に追加された新しい行を誤ってカウントに追加したようです。実際のカウントは55です。
JPvdMerwe11年


7

真剣な候補者ではなく、私のPythスキルを行使するだけです。

Pyth、16バイト

L?bqb_by`+vbi_bTyz

Python 3と同等:

y=lambda b:b if b==b[::-1] else y(str(eval(b)+int(b[::-1],10)))
print y(input())

すでに答えられたいくつかの古い課題を試してみてください。
swstephe

1
一部のチャレンジ作成者は、より短いソリューションが登場した場合に受け入れられた回答を更新するため、技術的に有効な提出ではないことをOPに通知するのが妥当だと思います。(誤解しないでください、私も楽しみのためにCJamで古い課題に答えるのが好きです-そして、私は数分前にやったばかりです。挑戦。)
マーティンエンダー14

実際、「深刻な競争相手ではない」ということは、答えが削除の対象になりますが、これが深刻な競争相手と見なされるべきではないという理由はわかりません。
pppery


6

CJam、22 21バイト

CJamはこの質問が行われた後に作成されたため、技術的には無効な提出です。しかし、私はこの質問を興味深いと感じたので、ここに行きます:

r{__W%:X=0{~X~+s1}?}g

説明:

r{                 }g    "Read the input number as string and enter a while-do loop";
  __                     "Make 2 copies of the string number";
    W%:X                 "Reverse the second and store it in X";
        =                "Check if the number is already palindrome";
         0{      }?      "Put 0 on stack if it is palindrome, else, run the code block";
           ~             "Convert the string to int";
            X~           "Put the reverse string on stack and convert it to int too";
              +s         "Add the two numbers and covert back the result to string";

コアロジックは、while-doの各反復で、回文が達成されたかどうかを最初に確認することです。そうでない場合は、番号に逆を追加します。アルゴリズムはほとんど何ですか!

こちらからオンラインでお試しください


5

Jは数十年前から存在しているため、これは実際の候補です。

J(16バイト)

(+^:~:|.&.":)^:_

これは動詞なので、Jセッションで変数に割り当てて、次のように使用できます。

   f =. (+^:~:|.&.":)^:_
   f 5280
23232

使い方:

(+^:~:|.&.":)^:_
 +^:~:           add if unequal
      |.&.":     reverse under string format
 +^:~:|.&.":     add reverse unless a palindrome
(           )^:_ repeat until unchanged




4

JAGL Alpha 1.2-19、21、標準入力あり

競合せず、私の言語の経験を積むだけで
、標準入力からの数字が期待されます

T~d{DddgCi+dgdC=n}uSP

説明

T~                       Get a line of input, and eval to an integer
  d                      Duplicate (for first round)
   {Ddd                  Drop last and duplicate twice
       gCi               Convert to string, reverse, and convert back to integer
          +d             Add to original and duplicate
            gdC          Convert to string, duplicate, reverse
               =n}       If it isn't a palindrome, keep going
                  uSP    Run until palindrome reached, then print output number

編集済み。@オプティマイザー
Globby 14

マイナーな編集(バージョン番号など)のためにすべての提出物を一度に編集しないでください。これにより、フロントページが不必要に乱雑になります。一度に2つまたは3つ行う場合は問題ありませんが、より体系的な編集を行う前に数時間お待ちください。
マーティンエンダー14

それはフロントページにプッシュすることを忘れてしまった、私の悪い。@MartinBüttner
Globby 14

4

05AB1E、7バイト(非競合)

言語が課題をポストデートするため、非競合

コード:

[DÂQ#Â+

説明:

[        # Infinite loop.
 DÂ      # Duplicate and bifurcate (which duplicates it and reverses the duplicate).
   Q#    # If the number and the number reversed are equal, break.
     Â+  # Add the reversed number to the initial number.

CP-1252エンコードを使用します。オンラインでお試しください!


分岐のプロセスについてもう少し説明してもらえますか?
コナーオブライエン

1
@CᴏɴᴏʀO'Bʀɪᴇɴたとえば、スタックには文字列がありますhello。分岐は元の文字列を保持し、文字列を逆にプッシュします。duplicateとreverseの略です。
アドナン

ああなるほど。クール!ありがとう
コナーオブライエン

4

Brachylog、8バイト

↔?|↔;?+↰

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

Brachylog紹介ビデオから、私が見た、そして興味をそそられた最初のBrachylogプログラムの1つとやや似ています。

?↔?.|↔;?+↰.  (initial ? and the .s are implicit)

?↔?          % If the input and its reverse are the same,
   .         %   then the input is the output
    |↔;?+↰   % Or, add the input and its reverse, and call this predicate recursively
          .  % The result of that is the output

3

PHP- 54 48文字

<?for($s=`cat`;$s!=$r=strrev($s);$s+=$r);echo$s;

テスト:

$ php 196.php <<< 5280
23232

$str = 今後のゴルフのために猫のことを覚えておく必要があります。使用するよりもはるかに優れてSTDINおり、さらに優れてい$argv[0]ます。
ラマ氏

@GigaWatt:$ s = 'm4'も機能するはずです。
ninjalj

3

バッシュ(64)

X=`rev<<<$1|sed s/^0*//`;[ $1 = $X ]&&echo $1||. $0 $(($1+$X))

呼び出し:bash <filename> <number>


<ファイル名>とは何ですか?
エルベックス

2
@Eelvexスクリプトはそれ自体を呼び出す必要があるため、ファイルに保存する必要があります。
マリヌス

3

C#-103 99文字

public int P(int i)
{
    var r = int.Parse(new string(i.ToString().Reverse().ToArray())));
    return r == i ? i : P(i + r);        
}

C#はゴルフではあまりうまくいきません。エレガントだが冗長。


1
もっと簡単にゴルフできます。.ToStringではなく "" +を使用し、いくつかのスペースを取り除きます。
ジェイコブ14

3

Q(39文字)

f:{while[x<>g:"I"$reverse -3!x;x+:g];x}

サンプル使用法:

q)f 5280
23232

編集:

現在34まで、同じ使用法:

{while[x<>g:"I"$(|) -3!x;x+:g];x} 5280


3

ゼリー、9バイト(非競合)

非常に単純な答えです。難解な言語でのコーディングの課題に対するものです。

ṚḌ+µŒḂ¬$¿

ṚḌ        : take the argument, reverse (and vectorize) it
  +µ      : add both
    ŒḂ¬$¿ : while the result isn't a palindrome

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

この回答がどのレベルでも不明確または間違っている場合は、遠慮なく指摘してください。

この最初の小さなコードを手伝ってくれたデニスに感謝します。


うわー、最初の投稿で全員がゼリーを使用しているわけではありません。
ニッサ

難解な言語を使用してPPCGに回答を投稿することは、私の予定リストにありました。ゼリーは、私が最初に考えたものでした:)
z3r0

2

Python。85文字:

s,i=str,int;rs=lambda q:s(q)[::-1];n=i(input());
while rs(n)!=s(n):n+=i(rs(n));print n

各反復で出力が必要ない場合:

s,i=str,int;rs=lambda q:s(q)[::-1];n=i(input());
while rs(n)!=s(n):n+=i(rs(n))
print n

(1文字少ない)


タスクの説明には、最終回文のみを印刷する必要があると記載されています。
ジョーイ

2

Windows PowerShell(63)

for($a=+"$input";-join"$a"[99..0]-ne$a){$a+=-join"$a"[99..0]}$a

文字列を逆にする簡単な方法がないことは今でも嫌いです。


入力が10桁しかない場合は、2文字短縮できます。この方法でlongも安全です。PowerShellがサポートする最大の整数型ですが、それでも2つの文字を無駄にしています。
ジョーイ

2

Haskell 89 87文字

r=read.reverse.show
main=getLine>>=print.head.filter(\x->x==r x).iterate(\x->x+r x).read

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

myFind p = head . filter p
rev = read . reverse . show
isPalindrome x = x == rev x
next x = x + rev x
sequence196 = iterate next
palindrome196 = myFind isPalindrome . sequence196

main = getLine >>= print . palindrome196 . read

ゴルフバージョンは、手動でインライン化し、残りの関数の名前を単一の文字名に変更して作成されました。


1
untilPreludeの十分に活用されていない関数を利用し、2項演算子をxand に適用するパターンを抽出することで、これをかなり短くすることができr xます。また、使用readLnの代わりにgetLineread。結果は、20個の文字を保存しますf%x=f x$read.reverse.show$x;main=readLn>>=print.until((==)%)((+)%)
HAMMAR

@hammar:モナド関数を使用して、さらに保存することができます:定義してr=(=<<read.reverse.show)、単に使用しますr(==)`until`r(+)。その保存とは別に、完全なプログラムである必要はなく、有効な送信は以前の名前のない関数である可能性があります。これにより、41バイトになります。オンラインで試してください!
ბიმო

2

befunge、57バイト

"KCTS"4(&:0\v
\T\a*+\:0`jv>:a%\a/
0:+_v#-TD2$<^\
  @.<

ただし、コードは4x19グリッドに配置されるため、76と呼ぶ場合があります。

  • 最初の行は初期化中で、入力番号を読み取ります
  • 2行目はスタック内の最初の番号を反転させ、2番目のスタック位置に置きます。
  • 3行目では、数字が回文であるかどうかを確認します。

2

C ++ TMP(256文字)

#include<cstdio>
#define Y(A,B,C,D)template<int N>struct A<C,D>{enum{v=B};};
#define Z(A)template<int N,int M>struct A{enum{v=
#define n 5194
Z(R)R<N/10,M*10+N%10>::v};};Y(R,N,0,N)Z(S)S<N+M,R<N+M,0>::v>::v};};Y(S,N,N,N)main(){printf("%d",S<n+R<n,0>::v,0>::v);}

このバージョンは少し短くなる可能性がありますが、256文字の答えを渡すのは困難です。これはゴルフのないバージョンです:

#include <iostream>

template<size_t N>
class Reverse
{
    template<size_t M, size_t R>
    struct Inner
    {
        enum { value = Inner<M/10, R*10 + M%10>::value };
    };

    template<size_t R>
    struct Inner<0, R>
    {
        enum { value = R };
    };

public:
    enum { value = Inner<N, 0>::value };
};

template<size_t N>
class OneNineSix
{
    template<size_t M, size_t R=Reverse<M>::value>
    struct Inner
    {
        enum { value = OneNineSix<M + R>::value };
    };

    template<size_t M>
    struct Inner<M, M>
    {
        enum { value = M };
    };

public:
    enum { value = Inner<N + Reverse<N>::value>::value };
};

int main()
{
    const size_t N = 4123;

    std::cout << OneNineSix<N>::value << std::endl;
}


2

Add ++、57バイト

L,BDbRBv
D,f,@,1]A+
D,g,@,1]A=
D,h,@,{f}A{g}Q{h}
L,{h}2/i

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

使い方

L,	; Create a function 'lambda 1'
	; Example argument:   [5280]
    BD	; Digits;     STACK = [[5 2 8 0]]
    bR	; Reverse;    STACK = [[0 8 2 5]]
    Bv	; Undigits;   STACK = [825]

D,f,@,	; Define a monadic function 'f'
	; Example argument:         [5280]
    1]	; Call 'lambda 1';  STACK = [825]
    A+	; Add the argument; STACK = [6105]

D,g,@,	; Define a monadic function 'g'
	; Example argument:          [5280]
    1]	; Call 'lambda 1';   STACK = [825]
    A=	; Equal to argument; STACK = [0]

D,h,@,	; Define a monadic function 'h'
	; Example argument:  [5280]
   {f}	; Call 'f';  STACK = [6105]
   A{g}	; If 'g'...
   Q	;   Return
   {h}	; Else call 'h'

L,	; Define a function, 'lambda 2'
	; Example argument: [5280]
   {h}	; Call 'h'; STACK = [46464]
   2/i	; Halve;    STACK = [23232]

2

Powershell、63 62バイト

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

param($m)for(;$m-$s;$m=-join"$s"[-1..-"$s".Length]){$s+=$m};$s

テストスクリプト:

$f = {
param($m)for(;$m-$s;$m=-join"$s"[-1..-"$s".Length]){$s+=$m};$s
}

&$f 5280

1
との;間は必要ありません。param($m)for
AdmBorkBork

2

GNU dc、46バイト

GNU dc、minバージョン1.4(Rコマンド用)が必要です。

[O~3RO*+rd0<R]sR[+lfx]sg[ddO~rd0<R+d3R!=g]dsfx

入力と出力は、通常どおりスタックの最上位にあります。dcの数字を逆にするには驚くほどの量のコードが必要です(何かが足りない限り、不可能ではありません)。次のような入力で適切に動作する数値範囲があります(たとえば、32ビットの符号なし演算がオーバーフローします)。

  • 89⇒8,813,200,023,188
  • 8997⇒16,668,488,486,661
  • 10677⇒4,668,731,596,684,224,866,951,378,664

説明

# Reverse digits, starting after first digit extracted
[O~3RO*+r d0<R]sR

# Recursion helper - add and recurse
[+ lfx]sg

# Main recursive function
[dd O~r d0<R+ d3R !=g]dsfx


これはGNU dc 1.4以降でのみ機能することを指定したい場合があります。 Rコマンドを。ただし、良い解決策です!
ソフィア・レヒナー

私は完全に異なるアプローチに取り組んでいますが、それがより小さくなるかどうかはわかりません。
ソフィア・レヒナー

ありがとうソフィア-私はそれを実現していなかった Rが新しいに。あなたの方法を見るのを楽しみにしています!
トビー・スペイト

ああ、いいえ...私は外側のループを配置する別のアプローチを試しましたが、約5バイト大きくなり、きれいではありませんでした。あなたが勝ちます。=)
ソフィア・レヒナー

2

R193の 109 105バイト

-ジュゼッペのおかげで-84バイト!JayCeに感謝します!

function(x){"-"=utf8ToInt
S=strtoi
"!"=rev
while({z=paste(S(x)+S(intToUtf8(!-x),10));any(-z!=!-z)})x=z
z}

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


1
あなたは(とすべきである)文字列操作よりもこれを行うための別の方法を選択するが、ここであなたが選択した方法のためのいくつかのゴルフのヒントがありますすることができますstrsplit(x,"")よりも短くなってstrsplit(x,NULL)、そしてel(L)よりも短くなっていますL[[1]]as.double短く、as.numericかつstrtoi両方よりも短くなっています。設定する代わりtに、ifステートメントで直接使用します。また、私が間違っていない場合、これは再帰関数なのでf=、提出の一部として置く必要があります。
ジュゼッペ

@ジュゼッペわかった。ヒントをありがとう。私はこれに取り組み続けます。動作するものを取得してから戻って最適化する方が簡単です。
ロバートS.

1
へへへ、心配なし。文字列を使用するのに苦労している(または問題によって強制されている)場合は、utf8ToInt数字に変換してintToUtf8から元に戻すことを検討してください。それは大きなバイト節約になります!
ジュゼッペ


1
-代わりにを使用して、さらに4バイト節約しますU。私も交換revしました!が、バイトを保存しません
...-JayCe
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.