以下のためのショートプログラム書く196-アルゴリズムを。アルゴリズムは整数から始まり、回文に達するまでその逆を追加します。
例えば
input = 5280
5280 + 0825 = 6105
6105 + 5016 = 11121
11121 + 12111 = 23232
output = 23232
入力
整数、これはLyrchrel番号ではありません(つまり、無限に継続するのではなく、最終的にこのアルゴリズムで回文を生成します)
出力
回文が届きました。
以下のためのショートプログラム書く196-アルゴリズムを。アルゴリズムは整数から始まり、回文に達するまでその逆を追加します。
例えば
input = 5280
5280 + 0825 = 6105
6105 + 5016 = 11121
11121 + 12111 = 23232
output = 23232
入力
整数、これはLyrchrel番号ではありません(つまり、無限に継続するのではなく、最終的にこのアルゴリズムで回文を生成します)
出力
回文が届きました。
回答:
{a≡⌽a←⍕(⍎⍵)+⍎⌽⍵:a⋄∇a}⍞
これはDyalog APLで機能します。以下に、右から左に説明を示します。
{ ... }⍞
:ユーザーから文字(⍞
)として入力を取得し、関数({ ... }
)に入力します。⋄
ステートメントを分離するため、左から右に見ていきます):
a≡⌽a←⍕(⍎⍵)+⍎⌽⍵ : a
:⍎
右引数の(⍵
)reverse(⌽
)を評価()し、それを右引数自体の評価済みバージョンに追加します。次に、結果をフォーマットし(⍕
;つまり、その文字表現を与えます)、←
変数a
にそれを割り当て()、最後にa
の逆が等価であるかどうかをテストしますa
(つまり、a
回文ですか?)。trueの場合、戻りa
ます。さもないと...∇a
:a
関数にフィードバックします(∇
暗黙の自己参照です)。例:
{a≡⌽a←⍕(⍎⍵)+⍎⌽⍵:a⋄∇a}⍞
412371
585585
{⍵=A←⍎⌽⍕⍵:⍵⋄∇A+⍵}⎕
。中括弧、逆、および評価を保存します。
~]{{.`.-1%.@={;0}{~+1}if}do}%
選択された解説
do
もちろん、プログラムの中核はループです。そのため、それについて説明します。
.`
番号をコピーして文字列化します。.-1%
その文字列バージョンをコピーし、逆にします。.@
反転バージョンをコピーし、元の非反転バージョンを前面に表示します。したがって、番号は5280です。この段階では、スタックは次のとおり5280 "0825" "0825" "5280"
です。ステージは比較のために設定されます。(比較後、スタックは5280 "0825"
何に関係なく残されます---比較するアイテムはポップオフされています。)
;
)し、0を返します(do
ループを終了します)。~
、逆の文字列を評価()して(数値にする)、+
元の数値に追加()し、1を返しdo
ます(ループを続行します)。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
n
intとして、あなたは、コードをチェックし、6つの文字で短縮することができますmeta.codegolf.stackexchange.com/q/75/62
真剣な候補者ではなく、私のPythスキルを行使するだけです。
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())
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の各反復で、回文が達成されたかどうかを最初に確認することです。そうでない場合は、番号に逆を追加します。アルゴリズムはほとんど何ですか!
Perl、40文字
$_=<>;$_+=$r while$_!=($r=reverse);print
競合せず、私の言語の経験を積むだけで
、標準入力からの数字が期待されます
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
言語が課題をポストデートするため、非競合。
コード:
[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エンコードを使用します。オンラインでお試しください!。
hello
。分岐は元の文字列を保持し、文字列を逆にプッシュします。duplicateとreverseの略です。
↔?|↔;?+↰
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
r=input()
while 1:
r=`r`
if r==r[::-1]:
break
else:
r=int(r)+int(r[::-1])
print r
非常に単純な答えです。難解な言語でのコーディングの課題に対するものです。
ṚḌ+µŒḂ¬$¿
ṚḌ : take the argument, reverse (and vectorize) it
+µ : add both
ŒḂ¬$¿ : while the result isn't a palindrome
この回答がどのレベルでも不明確または間違っている場合は、遠慮なく指摘してください。
この最初の小さなコードを手伝ってくれたデニスに感謝します。
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
ゴルフバージョンは、手動でインライン化し、残りの関数の名前を単一の文字名に変更して作成されました。
until
Preludeの十分に活用されていない関数を利用し、2項演算子をx
and に適用するパターンを抽出することで、これをかなり短くすることができr x
ます。また、使用readLn
の代わりにgetLine
とread
。結果は、20個の文字を保存しますf%x=f x$read.reverse.show$x;main=readLn>>=print.until((==)%)((+)%)
r=(=<<read.reverse.show)
、単に使用しますr(==)`until`r(+)
。その保存とは別に、完全なプログラムである必要はなく、有効な送信は以前の名前のない関数である可能性があります。これにより、41バイトになります。オンラインで試してください!
#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;
}
D`_b]D$XIsr)h
`_b - int(reversed(str(num))
D ] - [num, ^]
D - _ = ^
$ - delta(^)
XI - if ^:
s - num = sum(_)
r - goto_start()
h - _[0]
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]
@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
;
間は必要ありません。param($m)
for
GNU dc、minバージョン1.4(R
コマンド用)が必要です。
[O~3RO*+rd0<R]sR[+lfx]sg[ddO~rd0<R+d3R!=g]dsfx
入力と出力は、通常どおりスタックの最上位にあります。dcの数字を逆にするには驚くほどの量のコードが必要です(何かが足りない限り、不可能ではありません)。次のような入力で適切に動作する数値範囲があります(たとえば、32ビットの符号なし演算がオーバーフローします)。
# 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
R
コマンドを。ただし、良い解決策です!
R
が新しいに。あなたの方法を見るのを楽しみにしています!
-ジュゼッペのおかげで-84バイト!JayCeに感謝します!
function(x){"-"=utf8ToInt
S=strtoi
"!"=rev
while({z=paste(S(x)+S(intToUtf8(!-x),10));any(-z!=!-z)})x=z
z}
strsplit(x,"")
よりも短くなってstrsplit(x,NULL)
、そしてel(L)
よりも短くなっていますL[[1]]
。as.double
短く、as.numeric
かつstrtoi
両方よりも短くなっています。設定する代わりt
に、if
ステートメントで直接使用します。また、私が間違っていない場合、これは再帰関数なのでf=
、提出の一部として置く必要があります。
utf8ToInt
数字に変換してintToUtf8
から元に戻すことを検討してください。それは大きなバイト節約になります!