Bir numarayı geri çevirmenin en kısa yolu


31

Tek bir tamsayı değerli argümanı kabul etmek için bir fonksiyon (veya eşdeğer bir alt program) yazın ve argümanın taban-10 basamağının sırasını tersine çevirerek bulunan (benzer şekilde yazılmış) bir değer döndürün.

Örneğin verilen 76543, 34567


6
Sayının bir dize olduğu zamana geri dönün, sonra dizgiyi ters
çevirin

2
“En kısa algoritma” fikri, özellikle “herhangi bir dile” izin verirseniz, biraz muğlaktır. Bir algoritma düşünün, size uygun bir "~" operatörü olan bir DSL vereceğim ...

3
Sadece bir uyarı: 0 ile biten herhangi bir sayı, ters çevrildiğinde daha kısa sayılara dönüşür ...
powtac

44
Hiç zaman almayan , ancak yalnızca palindromik sayılar üzerinde çalışan bir algoritma biliyorum ;)
schnaader

Kendimi yeniden yazmak için zaman buldum. Umarım bu, diğer poz vermek istediği bulmaca olarak kalır.
dmckee

Yanıtlar:


85

HTML 21 7 karakter (arsız olursam 1 karakter ...)

‮n

nnumaranızla değiştirin


1
Bu sadece düz bir dahi. Bir karaktere giderdim. Veya 2, UTF-16’da iki bayta kodladığı için: P
13

17
Hahaha Bu etikette bir Google araması yaptım ve ödüllendirildim Your search -‮ - hiçbir belgeyle eşleşmedi.
JoeFish

U bu bağlantıyı tarayıcıda deneyebilir:data:text/html,&%238238;egnahcxEkcatS olleH
F. Hauri

3
Çok google çeviri de komik . @JoeFish: Çoğaltılamıyorum, lütfen bir bağlantı gönderin!
F Hauri

1
@JoeFish Yoruma baktığımda, kullanıcı adınız çevrilmiş ve bundan sonra bir miktar metin var. txet emos si ereH
Stefnotch

32

piton

int(str(76543)[::-1])

DÜZENLE:

@Gnibbler tarafından önerilen daha kısa çözüm:

int(`76543`[::-1])

veya, yukarıda belirsiz ise:

x=76543
int(`x`[::-1])

4
s[::-1]daha hızlıdır''.join(reversed(s))
riza

4
Str
gnibbler

@gnibbler Öneri için teşekkürler. Cevabımı güncelledim.
Vader

2
TBH, bu bir işlev / yordam değil / ne adlandırmak istersen ve teknik özellikler gerektirmiyor.
Thomas Eding

Ayrıca, bir değeri bile kabul etmiyor ...
Exelian

28

Evrensel (dil bağımsız / bağımsız )

Kullanmak isterseniz sayıları yalnızca (önlemek dizeye numarası dönüştürme) ve yapamaz bazı kullanmak istediğiniz belirli (herhangi bir dil için evrensel olması) kütüphane:

x = 76543 # or whatever is your number
y = 0
while x > 0:
    y *= 10
    y += ( x %10 )
    x /= 10 # int division 

Bu python, ancak herhangi bir dilde yapılabilir, çünkü bu sadece bir matematik metodu.


Eğer değiştirirseniz modile %, geçerli Python var;)
phihag

Haklısın, aslında :) 10x

3
En kısa değil, en yaygın ve evrensel.
Kiril Kirov

3
y=y*10+x%10....
st0le

1
BrainFuck hesaplanabilir olsa da yapmaz. Yerinde olmayan herhangi bir dil a - (n * int(a/n))yerine kullanabilirsiniz a mod n. Ayrıca, buraya bakarsanız , modulus işlemi her dilde farklı şekilde uygulanır. (Sağdaki tabloya bakınız.)
mbomb007

13

Perl 6

+$n.flip

veya:

$n.flip

dinamik olarak yazılmış kod için.

Sayılar, dil tasarımı nedeniyle dize yöntemleri elde etti.


10

J - 6 karakter + değişken

".|.":y

Değerin nerede y?


2
Bir fonksiyon olarak: |.&.":hemen hemen görevin değişmez çevirisi olan "tersine çevir".
FireFly

9

APL (3)

⍎⌽⍕

Kullanımı:

⍎⌽⍕12345 => 54321

8

PHP, 9 karakter

(int)strrev(123);

Kısa yapmak için Nsabit nerede :

strrev(N)

8

Befunge (3 karakter)

Tam çalıştırılabilir program:

N.@

Numaran nerede N? Kurallar " tek bir tamsayı değerli argümanı kabul et " diyor; Befunge'de sadece 0 - 9 arasındaki tamsayıları girebilirsiniz.


3
Bunlar sadece değişmezler , ancak diğer sayılar kesinlikle temsil edilebilir. Aksi halde, kazanan cevap boş programla Brainfuck olacaktır. ;-)
FireFly

8

Dil bağımsız / matematik

Kiril Kirov'un yukarıdaki cevabından ilham aldı. Bir sayıyı ters çevirmenin matematiksel özelliklerini merak ettim, bu yüzden biraz araştırmaya karar verdim.

n - rev(n)Doğal sayılar narasındaki farkı bir tabanda çizerseniz r, şöyle bir kalıp elde edersiniz (örneğin (n - rev(n)) / (r - 1), sütunlara r=10sarılmış r, kırmızı negatif sayıları belirtir):

farklılık tablosu

Bu dizi şöyle (pseudocode) oluşturulabilir:

for i=1 to r:
  output 0

for m=0, 1, …
  for k=1 to (r-1):
    for d=1 to r^m:
      for i=0 to (r-1):
        output (r-1) * (r+1)^m * (k - i)

Bu değerleri bir listede / dizide saklarsanız, n - arr[n]tersine çevrilmiş halini alırsınız n. Şimdi, bunu “matematiksel olarak golf” için ideal olarak, dizideki n: inci değerini veren kapalı formlu bir ifade isteriz, böylece tüm görevi çözmek için kapalı formlu bir ifade verebilirdik. Ne yazık ki, böyle bir ifade bulamadım ... ama mümkün olması gerektiği gibi görünüyor . :(

Öyleyse, evet, matematiksel bir merak kadar bir kod-golf değil, ancak yukarıdaki dizinin kapalı bir ifadesi varsa, gerçekten uygun PL golf gönderimlerinde faydalı olabilir.


7

Haskell, 28 24 karakter

f=read.reverse.show.(+0)

2
Ne dersiniz f=read.reverse.show.(+0)?
FUZxxl

2
(+0): Yasal adam! Gerçi teknik olarak gerekmez .(+0)olarak, hiç fsorun gerektirir olandan daha polimorfik olurdu (bir 'benzer daktilo' çıktı dönmesi için izin verilir). Bu 5 karakteri tıraş ederdim.
Thomas Eding

7

gayret

17 karakter

:se ri<CR>C<C-R>"

Komutu doğrudan vim olarak yazarsanız, bunun 10 karakter (tuş vuruşları) olduğunu söyleyebilirim. BTW, bugün
vim'de

6

Scala - 33 Karakter

def r(a:Int)=(a+"").reverse.toInt

1
Scala için +1, python / ruby ​​/
perl'den

Bu, negatif Int'de başarısız olur. -123, -321
samach’a

6

Yakut (14)

x = 13456
x.to_s.reverse

3
"hayır" tanımsız. Sanırım oraya "x" koymak istedin.
David Rivers,

3
123456.to_s.reverse daha da kısa.
Steffen Roller

@mmdemirbas - yazım hatası tamir için teşekkürler
bodacious

3
.to_s.reverse.to_iSpesifikasyona uymak gerekiyor .
histocrat

0 ile başlayan bir sayı çalışmıyor gibi görünüyor. 0112.to_s.reverse.to_i => 47
Joel

5

Bir sayıyı bir dizgeye dönüştürmek, daha sonra dizgiyi tersine çevirmek ve bu dizgiyi tekrar sayıya dönüştürmek mümkündür. Bu tür bir özellik muhtemelen tüm dillerde mevcuttur. Daha matematiksel bir yöntem arıyorsanız o zaman bu yardımcı olabilir:

int n = 76543;
int r = 0;

while (n > 0) {
    r *= 10;
    r += n % 10;
    n /= 10;
}

5
Maden kesinlikle aynı (:

Ya, tek fark kodunuz Python'a benziyor.

Bu yöntem taşması sınırlı hassasiyetle dillerde. deneyin1111111119
st0le

5

Python 3+

İşlev formu: 28 karakter

r=lambda i:int(str(i)[::-1])

(Alt) program formu: 25 karakter

print(input()[::-1])

Diğer Python örneklerinden bazılarının, kodlanmış girdi kullanımı ve / veya gereklilikleri tam olarak karşılamaması nedeniyle aldatma veya en azından ucuz olduğunu düşünüyorum.


5

Golfscript, 5 karakter

`-1%~

Bu, yığında argüman alır ve sonucu yığında bırakır. Spesifikasyondaki "subprogram" seçeneğini kullanıyorum: bir fonksiyon için ısrar ediyorsanız, yığında dört karakter daha kalıyor:

{`-1%~}:r

Ne demek olmalı düşünmek `-1%~yerine `-1$~(ve bunu söylemek cevabınızı düzenleme özgürlüğünü geçtiniz).
Ilmari Karonen

5

Kabuk komut dosyasında:

  echo "your number"|rev

Umarım bu yararlı oldu :)


İyi bir! Bash'in de buna yetenekli olduğunu bilmiyordum!
Pranit Bauva

1
Ben teknik olarak tahmin yok olan ... daha kısaltılmış olabilir benzer yazılan "numarası" verir rev<<<yournumberörneğin rev<<<132(gerçi bash / zsh için, POSIX başına)
FireFly

1
Sadece revsoru demiyor, yeter sahip bir fonksiyon olmak. Yerleşik revbir işlevle karşılaştırabilirsiniz, olmasa bile.
nyuszika7h

bu geçersiz: 'rev' bir yerleşik değil, harici bir program çağrısıdır.
Bastian Bittorf

67 Bayt'lık saf POSIX kabuğu: X = $ 1; [$ X! = 0]; Y = $ ((Y * 10 + X% 10)); X = $ ((X / 10)); Y
Bastian Bittorf

3

Biraz geç ama

APL, 3

⍎⌽⍞

Eğer bir fonksiyon için ısrar ediyorsanız

⍎∘⌽∘⍕

Görünüşe göre yukarıdaki
kopyayı tekrar edemedim

Üzgünüm, hiç kimse brainfu * k veya boşluk çözümü vermedi :( (bir oy daha ve ilk sayfadasınız)
Kiril Kirov

@KirilKirov Brainfu * k çözümü yaptım
rpax

3

Mathematica, 14 bayt

IntegerReverse

Bu rekabet etmiyor, çünkü bu fonksiyon sadece geçen haftaki 10.3 sürümünde eklenmiş, ancak tam olması için bu görev için yerleşik olan sadece (sanırım?) Ekleyeceğimi düşündüm.


2

Java ile aşağıdakileri yapabilirsiniz. Bunun String'e ve back'e dönüştüğünü ve matematiksel bir çözüm olmadığını unutmayın.

public class test {
    public static int reverseInt(int i) {
        return Integer.valueOf((new StringBuffer(String.valueOf(i))).reverse().toString());
    }

    public static void main(String[] args) {
        int i = 1234;
        System.out.println("reverse("+i+") -> " + reverseInt(i));
    }
}

2
Bu matematiksel bir çözümdür. Matematik sayılar değildir, aritmetik değildir. Matematik ayrıca sembol dizeleriyle de ilgilenir. Ve bu özel durumda, dizgeye ve dizgeden dönüşüm yalnızca 10 tabanına ve dizinden dönüşümdür.
R. Martinho Fernandes,

"Matematiksel bir çözüm değil" ile kastettiğim, kendimiz bir matematik yapmadığımızdır. Yöntemler bizim için bütün ayrıştırma ve matematiği yapıyor. Örneğin, Kiril Kirov'un cevabına karşı.
Victor,

Taşması Will ...
st0le

2

Lua

Sayılar ve dizeler birbirleriyle değiştirilebilir, bu yüzden önemsiz

string.reverse(12345)

2

Bu , gerçekte bazılarının aksine GERÇEKTEN bir girdi alır:

print`input()`[::-1]

Python btw.


2

actionscript

43 karakter işleve parametre olarak num:

num.toString().split('').reverse().join('')

2

harika

r={"$it".reverse() as BigDecimal}

assert r(1234) == 4321
assert r(345678987654567898765) == 567898765456789876543
assert r(345346457.24654654) == 45645642.754643543

2

Perl, 11 karakter

Bu psayının çalışması için bayrak çalışması gerekmektedir.

Kullanımı:

$ echo 76543 | perl -pE '$_=reverse'

10 karakter
sayarım

pBayrak sayısına dahil edilir
Zaid

2

Clojure (42 karakter)

#(->> % str reverse(apply str)read-string)

Örnek kullanım:

(#(->> % str reverse(apply str)read-string) 98321)

12389 döndürür


2

Ortak Lisp - 60 karakter

(first(list(parse-integer(reverse(write-to-string '4279)))))

seni 9724 alacak.


Neden (first(list? parse-integerZaten sayıyı döndürür.
Florian Margaine,

2

K, 3 bayt:

.|$

Değerlendirin ( .) |bir dizgiye ( $) çevirmenin tersini ( ).

Kullanım örneği:

  .|$76543
34567

2

rs , 20 bayt

#
+#(.*)(.)/\2#\1
#/

Teknik olarak, bu sayılmaz (rs bu yılın başlarında oluşturuldu), ancak regex tabanlı başka bir cevap görmedim ve bunun düzgün olduğunu düşündüm.

Canlı demo.

Açıklama:

#

Dizenin başına bir pound karakteri ekleyin. Bu bir işaretleyici olarak kullanılır.

+#(.*)(.)/\2#\1

Ana dizginin son karakterini, işaretten önceki alana, karakter kalana kadar sürekli olarak hazırlayın.

#/

İşaretçiyi çıkartın.


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.