196 algoritma kodu golf


35

196 algoritması için kısa bir program yaz . Algoritma bir tamsayıdan başlar, ardından bir palindrom elde edilinceye tersini ekler.

Örneğin

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

Giriş

lirikül sayı olmayan bir tam sayı (yani, sonunda sonsuz devam etmekten ziyade, bu algoritma altında bir palindrom oluşturur)

Çıktı

palindrom ulaştı.


6
Çünkü sorunuz muhtemelen 196 algoritmasını içeren tek soru. Tek kullanımlık etiketler yapmak kullanışlı değildir.
Chris Jester-Young,

2
Demek Sorunuzun tek olması muhtemeldir oldu şimdiye bile 2 yıl sonra, bu konuyu dahil etmek. :-)
Chris Jester-Young,

1
@Chris: Pekala, 196 algoritması oldukça popüler olanı, birçok farklı isimle gidiyor. Emin olmak gerekirse, 2 yıl geçmeden önce bu konuda başka bir soru daha gönderirim;)
Eelvex

1
@GigaWatt da, yumruk sorunuzu cevaplamamıştım :) A023108'lerin davasıyla uğraşma.
Eelvex

1
@Joel, A023108'de olduğu gibi, sadece onları yoksayın (onlar hakkında bilmediğiniz gibi davranın); Zaten var olup olmadığını bilmiyoruz.
Eelvex

Yanıtlar:


10

APL (22 karakter)

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

Bu Dyalog APL'de çalışır. İşte sağdan sola bir açıklama:

  • { ... }⍞: Kullanıcıdan karakter ( ) olarak girdi alın ve fonksiyonumuza ( { ... }) besleyin .
  • Direct işlevi içinde ( ifadeleri ayırır, bu yüzden onlara soldan sağa bakarız):
    • a≡⌽a←⍕(⍎⍵)+⍎⌽⍵ : a: Evaluate ( ) doğru argümanın's ( ) reverse ( ) ve bunu doğru argümanın kendi değerlendirilen sürümüne ekleyin. Daha sonra sonucu biçimlendirin ( ; yani karakter gösterimini verin), değişkene bunu ( ) atayın ave son olarak atersinin eşdeğer olup olmadığını test edin a(yani abir palindrom mu?). Doğruysa, geri dönün a; aksi takdirde...
    • ∇a: İşlevimize ageri dönün ( örtük kendi kendine referanstır).

Örnek:

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

2
Sayısal giriş kullanmak için birkaç karakter kaydeder. {⍵=A←⍎⌽⍕⍵:⍵⋄∇A+⍵}⎕. Bir parantez, bir ters ve bir değerlendirme kaydedin.
marinus

10

GolfScript, 29 karakter

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

Seçilmiş yorum

Programın eti doelbette ki döngüdür. Bu yüzden sadece onu koruyacağım.

  1. .` sayıyı kopyalar ve dizgiler.
  2. .-1% dize sürümünü kopyalar ve tersine çevirir.
  3. .@ ters çevrilmiş sürümü kopyalar ve ters çevrilmemiş orijinal sürümü öne getirir.

Yani, diyelim ki, sayı yığını, bu aşamada 5280. geçerli: 5280 "0825" "0825" "5280". Karşılaştırma için aşama belirlenir. (Karşılaştırmadan sonra, yığın 5280 "0825"--- ne olursa olsun karşılaştırılır - karşılaştırılacak öğeler çıkarıldı.)

  1. Eğer dize ve tam tersi aynı ise, tersine çevrilmiş dizgiyi önemsemeyiz, bu yüzden sadece açın ( ;) ve 0 dodöndürün ( döngüyü sonlandırmak için ).
  2. ~Eşleşmiyorlarsa, ters çevrilmiş dizgiyi (bir sayı yapmak için) değerlendirin ( ) +, orijinal sayıya ( ) ekleyin ve 1'e geri dönün ( dodöngüye devam etmek için ).

4
Klavyenizdeki rasgele tuşlara basmadığınızdan emin misiniz? Öyle görünüyor ...

1
@ M28: GolfScript, Perl'den çok çizgi gürültüsüne benziyor, değil mi? ;-)
Chris Jester-Young,

Senin için üzülüyorum, bunu kodlamak acı verici olmalı

@ M28: Bu Luhn algoritması için yazdığım çözüm kadar ağrılı değildi . Sadece bunu düşün. :-P
Chris Jester-Young,

Ailen senin için endişeleniyor

10

Python 2,55 bayt

JPvdMerwe önerisinin ardından:

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
nBir int olarak bakarak 6 karakter kısaltabilir, kodu kontrol edin: meta.codegolf.stackexchange.com/q/75/62
JPvdMerwe

Yanlışlıkla benim dosyama sonuna sinsice eklenen yeni satır vim sayımı ekledi gibi görünüyor. Gerçek sayı 55.
JPvdMerwe

7

Yakut - 56 karakter

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

7

Sadece Pyth yeteneklerimi kullanıyorum, ciddi bir rakip değil.

Pyth, 16 bayt

L?bqb_by`+vbi_bTyz

Python 3'e eşdeğer:

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

Sadece bazı eski zorlukları denemek, zaten cevaplanmış, bu yüzden ciddi bir rakip değil.
28’de

1
Bazı zorluk yazarları, eğer daha kısa bir çözüm gelirse kabul edilen cevabı güncelleyecektir, bu nedenle OP'ye teknik olarak geçerli bir sunum olmadığını bildirmenin adil olduğunu düşünüyorum. (Beni yanlış anlama, CJam'la olan eski meydan okumalara da eğlence için cevap vermeyi seviyorum - ve birkaç dakika önce de yaptım. Sorun.)
Martin Ender

Aslında "ciddi bir rakip değil" olmak silinmeye tabi bir cevap veriyor - ama bunun ciddi bir rakip olarak görülmemesi için herhangi bir neden görmüyorum.
pppery

6

J 25 27 31

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

6

CJam, 22 21 bayt

CJam bu soru sorulduktan sonra oluşturuldu, bu yüzden teknik olarak geçersiz bir başvuru. Ama soruyu ilginç buldum, işte burada:

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

Açıklama:

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

Temel mantık, her bir yineleme işleminde, ilk önce palindromun elde edilip edilmediğini kontrol etmenizdir. Değilse, numaraya tersini ekleyin. Algoritmanın ne olduğu hemen hemen!

Burada çevrimiçi deneyin


5

Bu gerçek bir yarışmacı, çünkü J on yıllardır burada.

J (16 bayt)

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

Bu bir fiildir, bu nedenle bir J oturumundaki bir değişkene atanabilir ve böyle kullanılır:

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

Nasıl çalışır:

(+^:~:|.&.":)^:_
 +^:~:           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

JAGL Alfa 1.2 - 19, 21, stdin ile

Rekabet etmemek , sadece dilimle ilgili biraz tecrübe edinmek
Stdin'den bir rakam bekliyor

T~d{DddgCi+dgdC=n}uSP

açıklama

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üzenlenen. @Optimizer
globby

Lütfen önemsiz düzenlemeler (sürüm numarası gibi) için tüm gönderilerinizi bir kerede düzenlemeyin, çünkü bu gereksiz yere ön sayfa tutar. Bir seferde 2 veya belki 3 yaparsanız sorun olmaz, ancak daha sistematik düzenlemeler yapmadan önce lütfen birkaç saat bekleyin.
Martin Ender

Ön sayfaya gideceğini unuttum, benim hatam. @ MartinBüttner
globi

4

05AB1E , 7 bayt (rekabet etmeyen)

Rekabetçi değil , çünkü dil mücadeleyi sürdürüyor.

Kod:

[DÂQ#Â+

Açıklama:

[        # 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 kodlamasını kullanır . Çevrimiçi deneyin! .


Çatallanma sürecini biraz daha açıklayabilir misiniz?
Conor O'Brien,

1
@ CᴏɴᴏʀO'Bʀɪᴇɴ Örneğin, yığında dizedir hello. Çatallanma orijinal ipi tutacak ve ipi ters çevirecek. Yinelenen ve geriye doğru kısa .
Adnan

Ah anlıyorum. Güzel! Teşekkürler
Conor O'Brien


3

PHP - 54 48 karakter

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

Ölçek:

$ php 196.php <<< 5280
23232

$str = Gelecekteki golf için kedinin olayını hatırlamak zorunda kalacağım. Heck kullanmaktan STDINdaha iyi ve hala daha iyi $argv[0].
Bay Llama,

@GigaWatt: $ s = 'm4' de çalışmalı.
ninjalj

3

Bash (64)

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

Şunu ara: bash <dosyaadı> <sayı>


<Dosyaadı> ne için?
Eelvex

2
@Eelvex betiğinin kendisini çağırması gerekir, böylece bir dosyada saklamanız gerekir.
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 #, golfde asla iyi iş çıkarmaz. Zarif, ama ayrıntılı.


1
Kolayca daha çok golf yapabilirsiniz. .ToString yerine "" + kullanın ve bazı alanlardan kurtulun.
Jacob

3

S (39 karakter)

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

Örnek Kullanım:

q)f 5280
23232

Düzenle:

Şimdi 34'e kadar, aynı kullanım:

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


3

Jöle , 9 bayt (rakipsiz)

Çok basit bir cevap, sadece kodlama ve ezoterik bir dilde kodlama için.

ṚḌ+µŒḂ¬$¿

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

Çevrimiçi deneyin!

Bu cevap herhangi bir düzeyde net değilse veya yanlışsa, belirtmekten çekinmeyin.

Bu küçük kod parçasında bana yardım ettiği için Dennis'e teşekkür ederim.


Vay canına, herkes ilk yazılarında Jelly kullanmıyor.
Nissa,

Ezoterik bir dil kullanarak PPCG'ye bir cevap göndermek için yapılacaklar listemdeydi. Jelly düşündüğüm ilk kişi oldu :)
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

Her yinelemede çıktı almak istemiyorsanız:

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

(bir az karakter)


Görev tanımı, yalnızca son palindromun yazdırılması gerektiğini belirtir.
Joey

2

Windows PowerShell (63)

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

Hala bir dizgiyi ters çevirmenin kolay bir yolunun olmamasından nefret ediyorum.


Sadece on basamaklı giriş varsa, iki karakterle kısaltılabilir. Bu şekilde long, yine de PowerShell'in desteklediği en büyük integral tipi olan için de güvenlidir, ancak yine de iki karakter harcıyorum.
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

Biraz okunabilir versiyonu:

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

Golf versiyonu manuel olarak girilerek ve kalan fonksiyonları tek karakter isimlerine göre değiştirerek oluşturuldu.


1
Kullanılmayan işlevden untilPrelude'den faydalanarak xve bir ikili işleci uygulama modelini ayıklayarak, bunu biraz kısaltabilirsiniz r x. Ayrıca ve readLnyerine kullanın . Sonuç 20 karakter kaydeder:getLinereadf%x=f x$read.reverse.show$x;main=readLn>>=print.until((==)%)((+)%)
Hammar,

@hammar: Monad işlevini kullanabilir ve daha da fazla tasarruf edebilirsiniz: Tanımlayın r=(=<<read.reverse.show)ve kullanın r(==)`until`r(+). Bu tasarruf dışında, tam bir program olması gerekmiyor, geçerli bir başvuru önceden adlandırılmamış fonksiyon olabilir. Bu sizi 41 bayta indirir: Çevrimiçi deneyin!
18'de

2

befunge, 57 bayt

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

Kod 4x19'lük bir ızgarada yer alsa da 76 olarak adlandırılabilir.

  • ilk satır başlatılıyor ve giriş numarası okunuyor
  • İkinci satır ilk sayıyı yığına geri koyun ve ikinci yığın konumuna getirin.
  • ve üçüncü satır bir sayının palindrom olup olmadığını kontrol eder.

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

Bu sürüm biraz kısaltılabilir, ancak 256 karakterden oluşan bir cevabı geçmek zordur. İşte bir golf versiyonu var:

#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 bayt (rekabetçi olmayan)

D`_b]D$XIsr)h

Burada dene!

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

2

++ , 57 bayt ekle

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

Çevrimiçi deneyin!

Nasıl çalışır

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 bayt

@AdmBorkBork sayesinde -1 bayt

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

Test komut dosyası:

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

&$f 5280

1
Buna gerek yok ;arası param($m)ve for.
AdmBorkBork,

2

GNU dc, 46 bayt

GNU dc, minimum sürüm 1.4 ( Rkomut için) gerektirir.

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

Giriş ve çıkış her zamanki gibi üst üste gelir. DC'deki rakamları tersine çevirmek şaşırtıcı miktarda kod alır (imkansız olan bir şeyi kaçırmazsam). Bunlar (örneğin 32-bit işaretsiz aritmetik taşacak) gibi girdilerle iyi davranmak için sayısal aralığa sahiptir:

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

açıklama

# 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


Bunun yeni Rkomutu kullanması nedeniyle sadece GNU dc 1.4 ve sonrasında çalıştığını belirtmek isteyebilir . Yine de iyi bir çözüm!
Sophia Lechner

Tamamen farklı bir yaklaşım üzerinde çalışıyorum, ancak daha küçük kurulacağından emin değilim.
Sophia Lechner

Teşekkürler Sophia - Bunun Ryeni olduğunu bilmiyordum . Yöntemi görmek için bekliyorum!
Toby Speight

Ah, hayır ... Dış döngüyü düzenlemek için farklı bir yaklaşım denedim, ancak beş bayt daha büyük ve daha güzel olmadı. Sen kazandın. =)
Sophia Lechner

2

R , 193 109 105 bayt

Giuseppe sayesinde -84 bayt! JayCe sayesinde -4 byes!

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

Çevrimiçi deneyin!


1
Bunu yapmak için dize işleminden farklı bir yol seçebilirsiniz (ve gerekir), ancak burada seçtiğiniz yöntem için bazı golf ipuçlarını bulabilirsiniz: strsplit(x,"")daha kısa strsplit(x,NULL)ve el(L)daha kısa L[[1]]. as.doubledaha kısa as.numericve strtoiher ikisinden de kısadır; ayarlamak yerine tdoğrudan ifadenizde kullanın if. Ayrıca yanılmıyorsam bu özyinelemeli bir işlevdir, bu yüzden f=gönderiminizin bir parçası olarak koymanız gerekir .
Giuseppe

@Giuseppe Anladım. İpuçları için teşekkürler. Bunun üzerinde çalışmaya devam edeceğim. İşe yarayan bir şey almak benim için daha kolay, sonra geri dönün ve optimizasyon yapın.
Robert S.,

1
Hehehe, endişelenme. Dizeleri kullanmaya zorlandıysanız (veya soruna zorladıysanız), utf8ToIntrakamlara intToUtf8dönüştürmeyi ve geri dönüştürmeyi düşünün . Bu büyük bir bayt tasarrufu olacak!
Giuseppe


1
Kaydet daha 4 bayt kullanarak -yerine U. Ben de yerini revile !... ama herhangi bir bayt kaydetmez
Jayce
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.