196 알고리즘 코드 골프


35

196-algorithm에 대한 간단한 프로그램을 작성하십시오 . 알고리즘은 정수에서 시작한 다음 회문에 도달 할 때까지 그 역을 추가합니다.

예 :

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

입력

이리 렐 숫자 가 아닌 정수 (즉, 무한대로 계속되는 것이 아니라이 알고리즘에서 결국 회문을 생성합니다)

산출

회문에 도달했습니다.


6
귀하의 질문은 아마도 196 알고리즘과 관련된 유일한 질문이기 때문입니다. 일회용 태그를 만드는 것은 유용하지 않습니다.
Chris Jester-Young

2
내가 의미하는 것은 귀하의 질문은 하나가 될 가능성이 있었다 이제까지 도 이년 '시간에이 항목을 포함합니다. :-)
Chris Jester-Young

1
@Chris : 음, 196 알고리즘은 많은 다른 이름으로가는 꽤 인기있는 알고리즘입니다. 그러나 2 년이 지나기 전에 그것에 대해 또 다른 질문을 게시 할 것입니다.)
Eelvex

1
@ GigaWatt, 나는 당신의 주먹 질문을 잘못 읽었습니다 :) 그냥 A023108s의 경우를 귀찮게하지 마십시오.
Eelvex

1
@Joel은 A023108과 마찬가지로 무시합니다 (알지 못하는 것처럼 행동). 우리는 어쨌든 존재하는지 모른다.
Eelvex

답변:


10

APL (22 자)

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

이것은 Dyalog APL에서 작동합니다. 다음은 오른쪽에서 왼쪽으로 설명입니다.

  • { ... }⍞: 사용자로부터 문자 ( ) 로 입력을 받아서 함수 ( { ... })에 입력합니다.
  • 직접 함수 내에서 ( 구문을 분리하므로 왼쪽에서 오른쪽으로 봅니다) :
    • a≡⌽a←⍕(⍎⍵)+⍎⌽⍵ : a: 올바른 인수의 ( ) 반전 ( )을 평가하고 ( ) 올바른 인수 자체의 평가 된 버전에 추가하십시오. 그런 다음 결과의 형식을 지정하고 ( 즉, 문자 표현 제공) 변수에 해당 값을 할당하고 ( ) a마지막에 a반전이 동일한 지 a(즉, a회문?) 테스트합니다 . 참이면 return a; 그렇지 않으면...
    • ∇a: a함수로 피드백 ( 암시 적 자체 참조)

예:

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

2
숫자 입력을 사용하기 위해 몇 문자를 저장합니다. {⍵=A←⍎⌽⍕⍵:⍵⋄∇A+⍵}⎕. 중괄호, 반전 및 평가를 저장합니다.
marinus

10

GolfScript, 29 자

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

선택된 논평

do물론 프로그램의 핵심 은 고리입니다. 그래서 나는 그것을 다룰 것입니다.

  1. .` 숫자를 복사하여 문자열 화합니다.
  2. .-1% 해당 문자열 버전을 복사하여 되돌립니다.
  3. .@ 반전 된 버전을 복사하고 반전되지 않은 원래 버전을 앞으로 가져옵니다.

따라서 숫자는 5280입니다.이 단계에서 스택은 다음과 같습니다 5280 "0825" "0825" "5280". 스테이지는 비교를 위해 설정됩니다. (비교 후 스택은 5280 "0825"무엇이든 상관없이 남게 됩니다. 비교할 항목이 튀어 나왔습니다.)

  1. 문자열과 그 반대가 동일하다면, 우리는 그 반대의 문자열을 신경 쓰지 않기 때문에, 그것을 빼내고 ( ;) 0을 돌려줍니다 ( do루프 를 끝내기 위해 ).
  2. 일치하지 않으면 ~역순으로 문자열 을 평가하고 ( 숫자로 만들기 +) 원래 숫자 에 ( )를 더한 다음 ( do루프 를 계속하기 위해 ) 1을 반환 합니다.

4
키보드에서 임의의 키를 누르지 않았습니까? 그것은 다음과 같습니다 ...

1
@ M28 : GolfScript는 Perl보다 라인 노이즈처럼 보입니다. ;-)
Chris Jester-Young

죄송합니다. 코드를 작성하는 것이 고통 스럽습니다.

@ M28 : Luhn 알고리즘에 대해 쓴 솔루션만큼 고통스럽지 않았습니다 . 그냥 생각 해봐 :-P
Chris Jester-Young

당신의 가족은 당신에 대해 걱정합니다

10

파이썬 2, 55 바이트

JPvdMerwe 제안에 따라 :

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

파이썬 2, 62 :

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

Hehe ..))))))))
Nakilon

2
살펴보면 nint로서 당신은 코드를 확인, 6 개 문자로 단축 할 수 있습니다 meta.codegolf.stackexchange.com/q/75/62
JPvdMerwe

실수로 파일 끝에 추가 된 새로운 줄 vim을 실수로 포함시킨 것 같습니다. 실제 카운트는 55입니다.
JPvdMerwe

7

루비 — 56 자

x,r=gets
x="#{x.to_i+r.to_i}"until x==r=x.reverse
puts x

7

진지한 경쟁자가 아닌 내 Pyth 기술을 사용하는 것뿐입니다.

Pyth, 16 바이트

L?bqb_by`+vbi_bTyz

파이썬 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과의 오래된 도전에 재미있게 대답하고 싶다. 그리고 나는 몇 분 전에 방금했다. 나는 당신이 그렇게하면 언어가 새로운 것보다 도전).
마틴 청산

실제로 "심각한 경쟁자가 아님"이라는 답변은 삭제 될 수 있습니다. 그러나 이것이 심각한 경쟁자로 간주되어서는 안되는 이유는 없습니다.
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";

핵심 논리는 각 반복 작업에서 회문이 달성되었는지 먼저 확인하는 것입니다. 그렇지 않은 경우 숫자에 역을 추가하십시오. 알고리즘이 거의 무엇입니까!

여기에서 온라인으로 사용해보십시오


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

파이썬 : 66

n=input()
while 1:
 r=int(`n`[::-1])
 if n==r:break
 n+=r
print n



4

stdin을 사용한 JAGL Alpha 1.2-19 , 21

논쟁하지 않고 내 언어에 대한 경험을 얻음
stdin에서 숫자를 기대합니다

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

편집했습니다. @Optimizer
globby

버전 번호와 같은 사소한 편집을 위해 모든 제출물을 한 번에 편집하지 마십시오. 한 번에 2 개 또는 3 개를 수행하는 것이 좋습니다. 그러나 좀 더 체계적인 편집을하기 전에 몇 시간 정도 기다려주십시오.
Martin Ender 2014

내 페이지를 앞 페이지로 밀어 넣는 것을 잊었습니다. @ MartinBüttner
globby

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 의 줄임말입니다 .
Adnan

아, 알겠습니다 시원한! 감사합니다
Conor O'Brien


3

PHP- 54 48 자

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

테스트:

$ php 196.php <<< 5280
23232

나는 $str = 미래의 골프를 위해 고양이 를 기억해야 할 것입니다. 사용하는 것보다 훨씬 좋고 STDIN여전히 낫습니다 $argv[0].
Mr. Llama

@GigaWatt : $ s = 'm4' 도 작동합니다.
ninjalj

3

배쉬 (64)

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

bash <filename> <number>로 전화하십시오.


<filename>은 무엇입니까?
Eelvex

2
@Eelvex 스크립트는 자신을 호출해야하므로 파일에 저장해야합니다.
marinus

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 대신 ""+를 사용하고 일부 공백을 제거하십시오.
Jacob

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

온라인으로 사용해보십시오!

이 답변이 어떤 수준에서 불분명하거나 틀리면 자유롭게 지적하십시오.

이 첫 번째 작은 코드를 도와 주신 Dennis에게 감사합니다.


와, 모든 사람이 첫 번째 게시물에서 젤리를 사용하는 것은 아닙니다.
니사

난해한 언어를 사용하여 PPCG에 대한 답변을 게시하는 것이 할 일 목록에있었습니다. 젤리는 내가 생각한 첫 번째 사람이되었습니다 :)
z3r0

2

파이썬. 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

(하나의 적은 문자)


작업 설명에는 최종 회문 만 인쇄해야한다고 명시되어 있습니다.
Joey

2

Windows PowerShell (63)

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

나는 여전히 문자열을 되돌릴 수있는 쉬운 방법이 없다는 것을 싫어합니다.


10 자리 숫자 만 입력 된 경우 두 문자로 단축 할 수 있습니다. 이런 식으로 longPowerShell이 ​​지원하는 가장 큰 통합 유형 인 안전 하지만 여전히 두 문자를 낭비합니다.
Joey

2

하스켈 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에서 사용되지 않는 함수 를 활용 하고 x및에 이항 연산자를 적용하는 패턴을 추출 하여이 작업을 상당히 단축 할 수 있습니다 r x. 또한 및 readLn대신 사용하십시오 . 결과는 20자를 저장합니다 :getLinereadf%x=f x$read.reverse.show$x;main=readLn>>=print.until((==)%)((+)%)
hammar

@hammar : 함수 monad를 사용하고 더 많은 것을 저장할 수 있습니다 : 정의 r=(=<<read.reverse.show)하고 사용하십시오 r(==)`until`r(+). 이러한 저축 외에도 전체 프로그램 일 필요는 없으며 유효한 제출은 이전의 이름없는 기능 일 수 있습니다. 41 바이트로 줄입니다. 온라인으로 사용해보십시오!
ბიმო

2

펀칭, 57 바이트

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

코드는 4x19 그리드에 배치되지만 76이라고 부를 수 있습니다.

  • 첫 번째 줄이 초기화되고 입력 번호를 읽습니다.
  • 두 번째 줄은 스택의 첫 번째 숫자를 뒤집고 두 번째 스택 위치에 놓습니다.
  • 세 번째 줄은 숫자가 회문인지 확인합니다.

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

파이크, 13 바이트 (비경쟁)

D`_b]D$XIsr)h

여기 사용해보십시오!

 `_b          -     int(reversed(str(num))
D   ]         -    [num, ^]
     D        -   _ = ^
      $       -  delta(^)
       XI     - if ^:
         s    -  num = sum(_)
          r   -  goto_start()
            h - _[0]

2

추가 ++ , 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

파워 쉘, 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 바이트

최소 R명령 1.4의 GNU dc가 필요합니다 .

[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


새로운 R명령을 사용하기 때문에 GNU dc 1.4 이상에서만 작동하도록 지정할 수 있습니다. 그래도 좋은 해결책입니다!
소피아 레크 너

나는 완전히 다른 접근법을 연구하고 있지만 더 작아 질지는 확실하지 않습니다.
Sophia Lechner

고마워 소피아-나는 그것이 R새로운 것을 깨달았다 . 당신의 방법을 기대하겠습니다!
Toby Speight

아, 아니요 ... 외부 루프를 배열하는 다른 접근법을 시도했지만 약 5 바이트가 커지고 더 예쁘지 않았습니다. 네가 이겼다. =)
소피아 레크 너

2

R , 193 (109) 105 바이트

주세페 덕분에 -84 바이트! JayCe 덕분에 -4 안녕!

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=제출의 일부로 넣어야 합니다.
Giuseppe

@ 주세페 팁 주셔서 감사합니다. 계속해서 노력하겠습니다. 작동하는 것을 얻은 다음 돌아가서 최적화하는 것이 더 쉽습니다.
Robert S.

1
Hehehe, 걱정마 문자열을 사용하는 데 어려움을 겪고 있거나 문제가 발생 utf8ToInt하면 숫자 intToUtf8로 변환하고 다시 변환하는 것을 고려하십시오 . 그것은 큰 바이트 절약이 될 것입니다!
Giuseppe


1
-대신을 사용하여 4 바이트더 절약하십시오U . 또한 교체 rev와 함께 !...하지만 어떤 바이트를 저장하지 않습니다
JayCe
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.