Mã thuật toán golf 196


35

Viết một chương trình ngắn cho thuật toán 196 . Thuật toán bắt đầu từ một số nguyên, sau đó thêm ngược lại cho đến khi đạt được một bảng màu.

ví dụ

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

Đầu vào

một số nguyên, không phải là số lyrchrel (nghĩa là cuối cùng nó cũng mang lại một bảng màu theo thuật toán này, thay vì tiếp tục vô tận)

Đầu ra

các palindrom đạt.


6
Bởi vì câu hỏi của bạn có lẽ là câu hỏi duy nhất liên quan đến thuật toán 196. Làm thẻ sử dụng một lần là không hữu ích.
Chris Jester-Young

2
Ý tôi là, câu hỏi của bạn có thể là câu hỏi duy nhất liên quan đến chủ đề này, ngay cả trong 2 năm nữa. :-)
Chris Jester-Young

1
@Chris: Chà, thuật toán 196 là một thuật toán khá phổ biến, có nhiều tên khác nhau. Tuy nhiên, để chắc chắn, tôi sẽ đăng một câu hỏi khác về nó trước khi hết thời gian 2 năm;)
Mười hai

1
@GigaWatt cũng vậy, tôi đã đọc sai câu hỏi nắm tay của bạn :) Chỉ cần đừng bận tâm đến trường hợp của A023108s.
Eelvex

1
@Joel, như với A023108, chỉ cần bỏ qua chúng (hành động như bạn không biết về chúng); Chúng tôi không biết nếu có tồn tại nào.
Eelvex

Câu trả lời:


10

APL (22 ký tự)

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

Điều này hoạt động trong Dyalog APL. Đây là một lời giải thích, từ phải sang trái:

  • { ... }⍞: Nhận đầu vào từ người dùng dưới dạng ký tự ( ) và cung cấp cho hàm của chúng tôi ( { ... }).
  • Trong hàm trực tiếp ( phân tách các câu lệnh, vì vậy chúng tôi xem xét chúng từ trái sang phải):
    • a≡⌽a←⍕(⍎⍵)+⍎⌽⍵ : a: Đánh giá ( ) đối số đúng ( ) đảo ngược ( ) và thêm đối số đó vào phiên bản được đánh giá của chính đối số đó. Sau đó, định dạng kết quả ( ; nghĩa là đưa biểu diễn ký tự của nó), gán ( ) cho biến đó avà cuối cùng kiểm tra xem angược lại có tương đương với a(tức là, có phải là amột bảng màu không?). Nếu đúng, trở về a; nếu không thì...
    • ∇a: Phản ahồi lại chức năng của chúng tôi ( là tự tham chiếu ngầm).

Thí dụ:

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

2
Nó lưu một vài ký tự để sử dụng đầu vào số. {⍵=A←⍎⌽⍕⍵:⍵⋄∇A+⍵}⎕. Bạn lưu niềng răng, đảo ngược và eval.
bến

10

GolfScript, 29 ký tự

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

Bình luận được chọn

Thịt của chương trình là dovòng lặp, tất nhiên. Vì vậy, tôi sẽ chỉ bao gồm điều đó.

  1. .` sao chép số lượng và xâu chuỗi nó.
  2. .-1% sao chép phiên bản chuỗi đó và đảo ngược nó.
  3. .@ sao chép phiên bản đảo ngược và đưa phiên bản gốc không đảo ngược ra phía trước.

Vì vậy, giả sử, số là 5280. Ở giai đoạn này, ngăn xếp là : 5280 "0825" "0825" "5280". Các giai đoạn được thiết lập để so sánh. (Sau khi so sánh, ngăn xếp sẽ được để lại tại5280 "0825" bất kể là gì --- các mục để so sánh đã được bật ra.)

  1. Nếu chuỗi và đảo ngược là như nhau, chúng tôi không quan tâm đến chuỗi đảo ngược, vì vậy chỉ cần bật nó ra ( ;) và trả về 0 (để kết thúcdo vòng lặp).
  2. Nếu chúng không khớp, thì hãy đánh giá ( ~) chuỗi đảo ngược (để biến nó thành số), thêm ( +) vào số ban đầu và trả về 1 (để tiếp tục dovòng lặp).

4
Bạn có chắc chắn rằng bạn đã không nhấn các phím ngẫu nhiên trên bàn phím của bạn? Có vẻ như thế ...

1
@ M28: GolfScript trông thậm chí giống tiếng ồn đường truyền hơn Perl, phải không? ;-)
Chris Jester-Young

Tôi cảm thấy tiếc cho bạn, thật khó để viết mã đó

@ M28: Điều đó gần như không đau đớn như giải pháp tôi đã viết cho thuật toán Luhn . Chỉ cần nghĩ về điều đó. :-P
Chris Jester-Young

Gia đình bạn lo lắng về bạn

10

Python 2, 55 byte

Theo đề xuất của JPvdMerwe:

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

Con trăn 2, 62:

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

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

2
Bằng cách xem nnhư một int bạn có thể rút ngắn 6 ký tự, kiểm tra mã: meta.codegolf.stackexchange.com/q/75/62
JPvdMerwe

Có vẻ như tôi vô tình đưa dòng vim mới được thêm vào một cách lén lút vào cuối tập tin của tôi. Số thực tế là 55.
JPvdMerwe

7

Ruby - 56 ký tự

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

7

Chỉ cần thực hiện các kỹ năng Pyth của tôi, không phải là một ứng cử viên nghiêm túc.

Bình thường, 16 byte

L?bqb_by`+vbi_bTyz

Tương đương với Python 3:

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

Chỉ cần thử một số thử thách cũ, đã trả lời, vì vậy không phải là đối thủ nghiêm trọng.
swstephe

1
Một số tác giả thách thức sẽ cập nhật câu trả lời được chấp nhận nếu có giải pháp ngắn hơn, vì vậy tôi nghĩ thật công bằng khi thông báo cho OP, rằng đây không phải là một bài nộp hợp lệ. (Đừng hiểu sai ý tôi, tôi cũng thích trả lời những thách thức cũ với CJam - và tôi mới làm vài phút trước. Tôi chỉ nói, nếu bạn làm thế, hãy để lại một lưu ý, rằng ngôn ngữ mới hơn thách thức.)
Martin Ender

Trên thực tế, việc "không phải là một ứng cử viên nghiêm trọng" khiến câu trả lời bị xóa - nhưng tôi không thấy bất kỳ lý do nào điều này không nên được coi là một ứng cử viên nghiêm trọng.
pppery


6

CJam, 22 21 byte

CJam đã được tạo ra sau khi câu hỏi này được hỏi, vì vậy về mặt kỹ thuật, đây là một bài nộp không hợp lệ. Nhưng tôi thấy câu hỏi thú vị, vì vậy ở đây đi:

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

Giải trình:

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";

Logic cốt lõi là trong mỗi lần lặp trong khi thực hiện, trước tiên bạn kiểm tra xem palindrom có ​​đạt được hay không. Nếu không, thêm ngược lại cho số. Khá nhiều thuật toán là gì!

Dùng thử trực tuyến tại đây


5

Đây là một ứng cử viên thực sự, vì J đã tồn tại trong nhiều thập kỷ.

J (16 byte)

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

Đây là một động từ, vì vậy nó có thể được gán cho một biến trong phiên J và được sử dụng như vậy:

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

Làm thế nào nó hoạt động:

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

4

Con trăn: 66

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



4

JAGL Alpha 1.2 - 19, 21 với stdin

Không tranh cãi , chỉ cần có một số kinh nghiệm với ngôn ngữ của tôi
Mong đợi một số từ stdin

T~d{DddgCi+dgdC=n}uSP

Giải trình

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

Đã chỉnh sửa. @Optimizer
globby

Vui lòng không chỉnh sửa tất cả các nội dung gửi của bạn cùng một lúc cho các chỉnh sửa nhỏ (như số phiên bản), vì điều này không cần thiết làm lộn xộn trang trước. Sẽ tốt thôi nếu bạn thực hiện 2 hoặc có thể 3 lần một lần, nhưng vui lòng đợi vài giờ trước khi thực hiện các chỉnh sửa có hệ thống hơn.
Martin Ender

Quên rằng nó sẽ đẩy lên trang nhất, xấu của tôi. @ MartinBüttner
globby

4

05AB1E , 7 byte (không cạnh tranh)

Không cạnh tranh , vì ngôn ngữ hoãn thách thức.

Mã số:

[DÂQ#Â+

Giải trình:

[        # 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.

Sử dụng mã hóa CP-1252 . Hãy thử trực tuyến! .


Bạn có thể giải thích thêm một chút về quá trình phân chia?
Conor O'Brien

1
@ CᴏɴᴏʀO'Bʀɪᴇɴ Ví dụ: trên ngăn xếp là chuỗi hello. Phân nhánh sẽ giữ chuỗi gốc và đẩy chuỗi đảo ngược. Đó là viết tắt của trùng lặp và đảo ngược .
Ad Nam

Ồ, tôi hiểu rồi. Mát mẻ! Cảm ơn
Conor O'Brien

4

Brachylog , 8 byte

↔?|↔;?+↰

Hãy thử trực tuyến!

Khá giống với một trong những chương trình Brachylog đầu tiên tôi đã xem và bị thu hút bởi, từ video giới thiệu Brachylog .

?↔?.|↔;?+↰.  (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 ký tự

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

Kiểm tra:

$ php 196.php <<< 5280
23232

Tôi sẽ phải nhớ $str = điều mèo để chơi golf trong tương lai. Heck của tốt hơn rất nhiều so với sử dụng STDINvà vẫn còn tốt hơn $argv[0].
Ông Llama

@GigaWatt: $ s = 'm4' cũng sẽ hoạt động.
ninjalj

3

Bash (64)

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

Gọi bằng: bash <tên tệp> <số>


<Tên tệp> để làm gì?
Eelvex

2
@Eelvex đoạn script cần gọi chính nó vì vậy bạn cần lưu trữ nó trong một tập tin.
bến tàu

3

C # - 103 99 ký tự

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

C # không bao giờ làm rất tốt trong golf. Thanh lịch, nhưng dài dòng.


1
Bạn có thể dễ dàng chơi golf hơn. Sử dụng "" + thay vì .ToString và loại bỏ một số khoảng trắng.
Jacob

3

Trong Q (39 ký tự)

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

Sử dụng mẫu:

q)f 5280
23232

Chỉnh sửa:

Đến 34 giờ, sử dụng tương tự:

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


3

Jelly , 9 byte (không cạnh tranh)

Một câu trả lời rất đơn giản, chỉ dành cho thử thách mã hóa bằng ngôn ngữ bí truyền.

ṚḌ+µŒḂ¬$¿

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

Hãy thử trực tuyến!

Nếu câu trả lời này không rõ ràng hoặc sai ở bất kỳ cấp độ nào, vui lòng chỉ ra nó.

Cảm ơn Dennis đã giúp tôi với đoạn mã nhỏ đầu tiên này.


Wow, không phải ai cũng sử dụng Jelly trong bài đăng đầu tiên của họ.
Nissa

Đó là trong danh sách việc cần làm của tôi để đăng câu trả lời trên PPCG bằng ngôn ngữ bí truyền. Jelly tình cờ là người đầu tiên tôi nghĩ đến :)
z3r0

2

Con trăn. 85 ký tự:

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

Nếu bạn không muốn đầu ra trên mỗi lần lặp:

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

(một ký tự ít hơn)


Mô tả nhiệm vụ chỉ ra rằng chỉ nên in bảng màu cuối cùng.
Joey

2

Windows PowerShell (63)

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

Tôi vẫn ghét rằng không có cách nào dễ dàng để đảo ngược một chuỗi.


Có thể rút ngắn hai ký tự nếu chỉ có mười chữ số đầu vào. Cách này cũng an toàn long, đây là loại tích hợp lớn nhất mà PowerShell hỗ trợ dù sao, tôi vẫn lãng phí hai ký tự.
Joey

2

Haskell 89 87 ký tự

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

Phiên bản có thể đọc được:

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

Phiên bản chơi gôn được tạo bằng cách đặt nội tuyến thủ công và đổi tên các chức năng còn lại thành tên nhân vật duy nhất.


1
Bạn có thể rút ngắn điều này khá nhiều bằng cách tận dụng chức năng được sử dụng untiltừ Prelude, cũng như trích xuất mô hình áp dụng toán tử nhị phân cho xr x. Ngoài ra, sử dụng readLnthay vì getLineread. Kết quả lưu được 20 ký tự:f%x=f x$read.reverse.show$x;main=readLn>>=print.until((==)%)((+)%)
hammar

@hammar: Bạn có thể sử dụng chức năng đơn nguyên và tiết kiệm hơn nữa: Xác định r=(=<<read.reverse.show)và chỉ sử dụng r(==)`until`r(+). Ngoài việc tiết kiệm đó, nó không cần phải là một chương trình đầy đủ, một bài nộp hợp lệ có thể chỉ là chức năng chưa được đặt tên từ trước đó. Điều này đưa bạn xuống tới 41 byte: Hãy thử trực tuyến!
18 giờ 31

2

befunge, 57 byte

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

mặc dù mã nằm trong lưới 4x19, vì vậy có thể gọi nó là 76.

  • dòng đầu tiên là khởi tạo và đọc số đầu vào
  • dòng thứ hai đảo ngược số thứ nhất trong ngăn xếp và đặt nó ở vị trí ngăn xếp thứ hai.
  • và dòng thứ ba kiểm tra nếu một số là palindrom.

2

C ++ TMP (256 ký tự)

#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);}

Phiên bản này có thể được rút ngắn một chút, nhưng câu trả lời 256 ký tự khó có thể bỏ qua. Đây là một phiên bản không chơi gôn:

#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

Thêm ++ , 57 byte

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

Hãy thử trực tuyến!

Làm thế nào nó hoạt động

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 byte

-1 byte nhờ @AdmBorkBork

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

Kịch bản thử nghiệm:

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

&$f 5280

1
Bạn không cần ;giữa param($m)for.
admBorkBork

2

GNU dc, 46 byte

Yêu cầu GNU dc, phiên bản tối thiểu 1.4 (cho Rlệnh).

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

Đầu vào và đầu ra là hàng đầu, như thường lệ. Phải mất một lượng mã đáng ngạc nhiên để đảo ngược các chữ số trong dc (trừ khi tôi thiếu một cái gì đó, điều này là không thể). Nó có phạm vi số để hành xử độc đáo với các đầu vào như thế này (chẳng hạn sẽ tràn số học không dấu 32 bit chẳng hạn):

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

Giải trình

# 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


Có thể muốn xác định rằng điều này chỉ hoạt động trên GNU dc 1.4 trở lên, vì nó sử dụng Rlệnh mới . Giải pháp tốt, mặc dù!
Sophia Lechner

Tôi đang làm việc theo một cách tiếp cận hoàn toàn khác nhưng không chắc nó sẽ nhỏ hơn.
Sophia Lechner

Cảm ơn Sophia - tôi đã không nhận ra rằng đó Rlà mới. Mong được nhìn thấy phương pháp của bạn!
Toby Speight

À, không ... Tôi đã thử một cách tiếp cận khác để sắp xếp vòng lặp bên ngoài nhưng cuối cùng nó lớn hơn khoảng năm byte và không đẹp hơn. Bạn thắng. =)
Sophia Lechner

2

R , 193 109 105 byte

-84 byte nhờ Giuseppe! -4 tạm biệt nhờ JayCe!

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

Hãy thử trực tuyến!


1
Bạn có thể (và nên) chọn một cách khác để thực hiện việc này ngoài thao tác chuỗi, nhưng đây là một số mẹo chơi gôn cho phương pháp bạn đã chọn: strsplit(x,"")ngắn hơn strsplit(x,NULL)el(L)ngắn hơn L[[1]]. as.doublengắn hơn as.numericstrtoingắn hơn cả hai; thay vì tchỉ sử dụng nó trực tiếp trong iftuyên bố của bạn . Ngoài ra, đây là một hàm đệ quy nếu tôi không nhầm, vì vậy bạn cần đặt f=như một phần của bài nộp của mình.
Giuseppe

@Giuseppe Có rồi. Cảm ơn vì những lời khuyên. Tôi sẽ tiếp tục làm việc này. Nó dễ dàng hơn cho tôi khi chỉ cần lấy một cái gì đó hoạt động sau đó quay lại và tối ưu hóa.
Robert S.

1
Hehehe, không phải lo lắng. Nếu bạn không thích sử dụng các chuỗi (hoặc bị buộc bởi vấn đề), hãy xem xét utf8ToIntchuyển đổi thành chữ số và intToUtf8chuyển đổi trở lại. Đó sẽ là một tiết kiệm byte lớn!
Giuseppe


1
Tiết kiệm thêm 4 byte bằng cách sử dụng -thay thế U. Tôi cũng đã thay thế revbằng !nhưng nó không lưu bất kỳ byte nào ...
JayCe
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.