196 kode algoritma golf


35

Tulis program singkat untuk 196-algoritma . Algoritme dimulai dari integer, lalu menambahkan kebalikannya hingga palindrome tercapai.

misalnya

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

Memasukkan

bilangan bulat, yang bukan bilangan lyrchrel (artinya, akhirnya menghasilkan palindrome di bawah algoritma ini, daripada melanjutkan tanpa batas)

Keluaran

palindrom tercapai.


6
Karena pertanyaan Anda mungkin satu-satunya yang melibatkan algoritma 196. Membuat tag sekali pakai tidak berguna.
Chris Jester-Young

2
Yang saya maksudkan adalah, pertanyaan Anda cenderung menjadi satu-satunya yang melibatkan topik ini, bahkan dalam waktu 2 tahun. :-)
Chris Jester-Young

1
@ Chris: Ya, 196-algoritme adalah algoritma yang cukup populer, menggunakan banyak nama berbeda. Hanya untuk memastikan, saya akan memposting pertanyaan lain tentang hal itu sebelum selang waktu 2 tahun;)
Eelvex

1
@ GigaWatt juga, saya salah membaca pertanyaan pertama Anda :) Jangan repot-repot dengan kasus A023108s.
Eelvex

1
@ Joel, seperti A023108, abaikan saja (bertingkah seolah Anda tidak tahu tentang mereka); kita tidak tahu apakah ada.
Eelvex

Jawaban:


10

APL (22 karakter)

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

Ini bekerja di Dyalog APL. Berikut penjelasannya, dari kanan ke kiri:

  • { ... }⍞: Dapatkan input dari pengguna sebagai karakter ( ) dan masukkan ke fungsi kami ( { ... }).
  • Dalam fungsi langsung ( memisahkan pernyataan, jadi kami melihatnya dari kiri ke kanan):
    • a≡⌽a←⍕(⍎⍵)+⍎⌽⍵ : a: Evaluate ( ) argumen kanan ( ) membalikkan ( ), dan menambahkannya ke versi yang dievaluasi dari argumen kanan itu sendiri. Kemudian, format hasilnya ( ; yaitu, berikan representasi karakternya), tetapkan ( ) ke variabel a, dan akhirnya uji apakah akebalikannya setara dengan a(yaitu, apakah apalindrom?). Jika benar, kembalilah a; jika tidak...
    • ∇a: Umpan abalik ke fungsi kami ( referensi diri implisit).

Contoh:

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

2
Menghemat beberapa karakter untuk menggunakan input numerik. {⍵=A←⍎⌽⍕⍵:⍵⋄∇A+⍵}⎕. Anda menyimpan kawat gigi, mundur dan eval.
marinus

10

GolfScript, 29 karakter

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

Komentar yang dipilih

Daging program adalah doloop, tentu saja. Jadi saya akan membahasnya.

  1. .` menyalin nomor itu dan menggantinya.
  2. .-1% menyalin versi string itu dan membalikkannya.
  3. .@ menyalin versi terbalik, dan membawa versi non-terbalik asli ke depan.

Jadi, katakanlah, jumlah ini 5280. Pada tahap ini, stack adalah: 5280 "0825" "0825" "5280". Panggung diatur untuk perbandingan. (Setelah perbandingan, tumpukan akan dibiarkan 5280 "0825"tidak peduli apa yang --- barang-barang untuk dibandingkan telah muncul.)

  1. Jika string dan kebalikannya sama, kami tidak peduli dengan string yang terbalik, jadi lepas saja ( ;) dan kembalikan 0 (untuk mengakhiri doloop).
  2. Jika mereka tidak cocok, maka evaluasi ( ~) string terbalik (untuk membuatnya menjadi angka), tambahkan ( +) ke nomor asli, dan kembalikan 1 (untuk melanjutkan doloop).

4
Apakah Anda yakin tidak menekan tombol acak di keyboard Anda? Sepertinya itu ...

1
@ M28: GolfScript bahkan lebih mirip derau baris daripada Perl, bukan? ;-)
Chris Jester-Young

Saya merasa kasihan pada Anda, pasti menyakitkan untuk kode itu

@ M28: Itu hampir tidak menyakitkan seperti solusi yang saya tulis untuk algoritma Luhn . Pikirkan saja itu. :-P
Chris Jester-Young

Keluarga Anda khawatir tentang Anda

10

Python 2, 55 byte

Berikut saran 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 ..))))))))
Nakilon

2
Dengan melihat nsebagai int Anda dapat mempersingkat 6 karakter, periksa kode: meta.codegolf.stackexchange.com/q/75/62
JPvdMerwe

Sepertinya saya tidak sengaja memasukkan baris vim baru diam-diam ditambahkan ke akhir file saya ke hitungan saya. Hitungan sebenarnya adalah 55.
JPvdMerwe

7

Ruby - 56 karakter

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

7

Hanya melatih keterampilan Pyth saya, bukan lawan yang serius.

Pyth, 16 byte

L?bqb_by`+vbi_bTyz

Setara dengan Python 3:

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

Hanya mencoba beberapa tantangan lama, sudah dijawab, jadi bukan pesaing serius.
swstephe

1
Beberapa penulis tantangan akan memperbarui jawaban yang diterima jika solusi yang lebih pendek masuk, jadi saya pikir adil untuk memberi tahu OP, bahwa ini secara teknis bukan pengajuan yang valid. (Jangan salah paham, saya juga suka menjawab tantangan lama dengan CJam - dan saya baru saja melakukannya beberapa menit yang lalu. Saya hanya mengatakan, jika Anda melakukannya, tinggalkan catatan, bahwa bahasanya lebih baru daripada tantangan.)
Martin Ender

Sebenarnya menjadi "bukan pesaing serius" membuat jawaban bisa dihapus - tapi saya tidak melihat alasan mengapa ini tidak dianggap sebagai pesaing serius.
pppery

6

J 25 27 31

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

6

CJam, 22 21 byte

CJam dibuat setelah pertanyaan ini diajukan, jadi secara teknis itu adalah pengiriman yang tidak valid. Tapi saya menemukan pertanyaan yang menarik, jadi begini:

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

Penjelasan:

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

Logika intinya adalah bahwa dalam setiap iterasi sementara, Anda pertama-tama memeriksa apakah palindrom tercapai atau tidak. Jika tidak, tambahkan kebalikannya ke nomor tersebut. Cukup banyak apa algoritma itu!

Cobalah online di sini


5

Ini adalah lawan yang sebenarnya, karena J telah ada selama beberapa dekade.

J (16 byte)

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

Ini adalah kata kerja, sehingga dapat ditugaskan ke variabel dalam sesi J dan digunakan seperti:

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

Bagaimana itu bekerja:

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

4

Python: 66

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

4

Perl, 40 karakter

$_=<>;$_+=$r while$_!=($r=reverse);print

Saya tahu ini adalah posting yang sangat lama tetapi beberapa perubahan dapat mengurangi ini menjadi 26 byte: Coba online!
Dom Hastings


4

JAGL Alpha 1.2 - 19, 21 dengan stdin

Tidak bersaing , hanya mendapatkan beberapa pengalaman dengan bahasa saya
Mengharapkan nomor dari stdin

T~d{DddgCi+dgdC=n}uSP

Penjelasan

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

Diedit. @Optimizer
globby

Harap jangan mengedit semua kiriman Anda sekaligus untuk pengeditan kecil (seperti nomor versi), karena ini tidak perlu mengacaukan halaman depan. Tidak masalah jika Anda melakukan 2 atau mungkin 3 sekaligus, tetapi harap tunggu beberapa jam sebelum melakukan pengeditan yang lebih sistematis.
Martin Ender

Lupa itu akan mendorong ke halaman depan, salahku. @ MartinBüttner
globby

4

05AB1E , 7 byte (tidak bersaing)

Non-bersaing , karena bahasa tersebut mengungguli tantangan.

Kode:

[DÂQ#Â+

Penjelasan:

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

Menggunakan pengkodean CP-1252 . Cobalah online! .


Bisakah Anda menjelaskan sedikit tentang proses bifurkasi?
Conor O'Brien

1
@ CᴏɴᴏʀO'Bʀɪᴇɴ Misalnya, pada tumpukan adalah string hello. Bifurkasi akan menjaga string asli, dan mendorong string terbalik. Ini kependekan dari duplikat dan mundur .
Adnan

Oh begitu. Keren! Terima kasih
Conor O'Brien

4

Brachylog , 8 byte

↔?|↔;?+↰

Cobalah online!

Agak mirip dengan salah satu program Brachylog pertama yang saya lihat dan tertarik oleh, dari video pengantar 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 karakter

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

Uji:

$ php 196.php <<< 5280
23232

Saya harus mengingat $str = hal kucing untuk bermain golf di masa depan. Heck of jauh lebih baik daripada menggunakan STDINdan masih lebih baik dari $argv[0].
Tn. Llama

@GigaWatt: $ s = 'm4' juga bisa digunakan.
ninjalj

3

Bash (64)

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

Panggil dengan: bash <filename> <number>


Untuk apa <filename>?
Eelvex

2
@Eelvex skrip perlu memanggil dirinya sendiri sehingga Anda perlu menyimpannya dalam file.
marinus

3

C # - 103 99 karakter

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

C # tidak pernah bermain golf dengan sangat baik. Elegan, tapi bertele-tele.


1
Anda dapat dengan mudah golf lebih banyak. Gunakan "" + daripada .ToString dan singkirkan beberapa spasi.
Yakub

3

Dalam Q (39 karakter)

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

Penggunaan sampel:

q)f 5280
23232

Edit:

Sekarang menjadi 34, penggunaan yang sama:

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


3

Jelly , 9 byte (tidak bersaing)

Jawaban yang sangat sederhana, hanya untuk tantangan pengkodean dalam dan bahasa esoterik.

ṚḌ+µŒḂ¬$¿

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

Cobalah online!

Jika jawaban ini tidak jelas atau salah pada level apa pun, silakan tunjukkan.

Terima kasih kepada Dennis karena telah membantu saya dengan potongan kecil kode pertama ini.


Wow, tidak semua orang menggunakan Jelly di posting pertama mereka.
Nissa

Itu ada dalam daftar tugas saya untuk mengirim jawaban di PPCG menggunakan bahasa esoterik. Jelly adalah yang pertama saya pikirkan :)
z3r0

2

Python. 85 karakter:

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

Jika Anda tidak ingin output pada setiap iterasi:

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

(satu karakter lebih sedikit)


Deskripsi tugas menyatakan bahwa hanya palindrom akhir yang harus dicetak.
Joey

2

Windows PowerShell (63)

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

Saya masih membencinya karena tidak ada cara mudah untuk membalik string.


Dapat disingkat dua karakter jika hanya ada sepuluh digit input. Dengan cara ini aman longjuga yang merupakan tipe integral terbesar yang didukung PowerShell, tapi tetap saja, saya buang dua karakter.
Joey

2

Haskell 89 87 karakter

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

Versi yang bisa dibaca:

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

Versi golf dibuat dengan menguraikan dan mengganti nama fungsi yang tersisa menjadi nama karakter tunggal.


1
Anda dapat mempersingkat ini dengan memanfaatkan fungsi yang kurang digunakan untildari Prelude, serta mengekstraksi pola penerapan operator biner ke xdan r x. Juga, gunakan readLnbukan getLinedan read. Hasilnya menyimpan 20 karakter:f%x=f x$read.reverse.show$x;main=readLn>>=print.until((==)%)((+)%)
hammar

@hammar: Anda bisa menggunakan fungsi monad dan menyimpan lebih banyak lagi: Tentukan r=(=<<read.reverse.show)dan gunakan saja r(==)`until`r(+). Selain dari tabungan itu, itu tidak perlu menjadi program lengkap, pengiriman yang valid bisa saja merupakan fungsi yang tidak disebutkan namanya dari sebelumnya. Ini membawa Anda ke 41 byte: Cobalah online!
ბიმო

2

befunge, 57 byte

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

meskipun kode tersebut ditempatkan di kisi 4x19, jadi mungkin menyebutnya 76.

  • baris pertama adalah inisialisasi, dan membaca nomor input
  • baris kedua membalikkan angka pertama dalam tumpukan dan meletakkannya di posisi tumpukan kedua.
  • dan baris ketiga memeriksa apakah suatu angka adalah palindrome.

2

C ++ TMP (256 karakter)

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

Versi ini bisa dipersingkat sedikit, tetapi jawaban 256 karakter sulit dilewatkan. Ini versi yang tidak golf:

#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

Pyke, 13 byte (tidak bersaing)

D`_b]D$XIsr)h

Coba di sini!

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

2

Tambahkan ++ , 57 byte

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

Cobalah online!

Bagaimana itu bekerja

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 terima kasih kepada @AdmBorkBork

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

Skrip uji:

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

&$f 5280

1
Anda tidak perlu ;antara param($m)dan for.
AdmBorkBork

2

GNU dc, 46 byte

Membutuhkan GNU dc, min versi 1.4 (untuk Rperintah).

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

Input dan output adalah top-of-stack, seperti biasa. Dibutuhkan jumlah kode yang mengejutkan untuk membalikkan angka dalam dc (kecuali jika saya melewatkan sesuatu, yang jauh dari mustahil). Itu memang memiliki rentang numerik untuk berperilaku baik dengan input seperti ini (yang akan meluap aritmatika unsigned 32-bit, misalnya):

  • 89 ⇒ 8.813.200.023.188
  • 8997 ⇒ 16.668.488.486.661
  • 10677 ⇒ 4.668.731.596.684.224.866.951.378.664

Penjelasan

# 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


Mungkin ingin menentukan bahwa ini hanya berfungsi pada GNU dc 1.4 dan yang lebih baru, karena ia menggunakan Rperintah baru . Solusi yang bagus!
Sophia Lechner

Saya bekerja pada pendekatan yang sama sekali berbeda tetapi tidak yakin itu akan berakhir lebih kecil.
Sophia Lechner

Terima kasih Sophia - Saya tidak menyadari Ritu baru. Menantikan melihat metode Anda!
Toby Speight

Ah, tidak ... Saya mencoba pendekatan yang berbeda untuk mengatur loop luar tetapi berakhir sekitar lima byte lebih besar dan tidak lebih cantik. Kamu menang. =)
Sophia Lechner

2

R , 193 109 105 byte

-84 bytes terima kasih kepada Giuseppe! -4 Byes terima kasih kepada JayCe!

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

Cobalah online!


1
Anda dapat (dan harus) memilih cara yang berbeda untuk melakukan ini daripada manipulasi string, tetapi di sini ada beberapa tips bermain golf untuk metode yang Anda pilih: strsplit(x,"")lebih pendek dari strsplit(x,NULL), dan el(L)lebih pendek dari L[[1]]. as.doublelebih pendek dari as.numericdan strtoilebih pendek dari keduanya; alih-alih pengaturan tgunakan langsung dalam ifpernyataan Anda . juga ini adalah fungsi rekursif jika saya tidak salah, jadi Anda perlu menempatkan f=sebagai bagian dari kiriman Anda.
Giuseppe

@Giuseppe Mengerti. Terima kasih atas tipsnya. Saya akan terus mengerjakan ini. Lebih mudah bagi saya untuk mendapatkan sesuatu yang berfungsi kemudian kembali dan mengoptimalkan.
Robert S.

1
Hehehe, jangan khawatir. Jika Anda sangat ingin menggunakan string (atau dipaksa oleh masalah), pertimbangkan utf8ToIntuntuk mengkonversi ke digit dan intToUtf8untuk mengkonversi kembali. Itu akan menjadi penghematan byte besar!
Giuseppe


1
Hemat 4 byte lebih banyak dengan menggunakan -menggantikan U. Saya juga diganti revdengan !tetapi tidak menyimpan byte ...
JayCe
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.