Cara terpendek untuk membalikkan angka

31

Tulis fungsi (atau subprogram setara) untuk menerima argumen bernilai integer tunggal dan mengembalikan nilai (yang diketik serupa) yang ditemukan dengan membalikkan urutan angka dasar-10 argumen.

Misalnya diberikan 76543 pengembalian 34567

dmckee
sumber
6
Kembali ke waktu angkanya adalah string, lalu balikkan string
pmg
2
Gagasan "algoritma terpendek" agak membingungkan, terutama jika Anda mengizinkan "bahasa apa pun." Pikirkan algoritma, dan saya akan memberi Anda DSL dengan operator "~" yang tepat ...
3
Hanya pemberitahuan: angka apa pun yang diakhiri dengan 0 menjadi angka yang lebih pendek saat dibalik ...
powtac
44
Saya tahu sebuah algoritma yang tidak membutuhkan waktu sama sekali , tetapi hanya bekerja pada nomor palindrom;)
schnaader
Saya menemukan waktu untuk menulis ulang sendiri. Saya harap ini tetap menjadi teka-teki yang dimaksudkan oleh pose eltond.
dmckee

Jawaban:

85

HTML 21 7 karakter (1 karakter jika saya kurang ajar ...)

‮n

ganti ndengan nomor Anda

Grifon
sumber
1
Ini benar-benar jenius. Saya akan pergi untuk satu char. Atau 2, karena disandikan ke dua byte di UTF-16: P
tomsmeding
17
Hahaha saya melakukan pencarian Google pada tag itu dan dihargai dengan Your search -‮ - tidak cocok dengan dokumen apa pun.
JoeFish
Anda dapat mencoba tautan ini di browser:data:text/html,&%238238;egnahcxEkcatS olleH
F. Hauri
3
Lucu di google transate juga. @ Joefish: Saya tidak bisa mereproduksi, silakan kirim tautan!
F. Hauri
1
@ Joefish Ketika saya melihat komentar, nama pengguna Anda terbalik dan ada beberapa teks setelahnya. txet emos si ereH
Stefnotch
32

Python

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

EDIT:

Solusi yang lebih pendek seperti yang disarankan oleh @gnibbler:

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

atau, jika di atas tidak jelas:

x=76543
int(`x`[::-1])
Vader
sumber
4
s[::-1]jauh lebih cepat daripada''.join(reversed(s))
riza
4
Anda dapat menggunakan backticks (untuk repr) daripada menggunakan str
gnibbler
@gnibbler Terima kasih atas sarannya. Saya telah memperbarui jawaban saya.
Vader
2
TBH, itu bukan fungsi / proses / apa pun yang Anda ingin menyebutnya, dan spesifikasi memerlukannya.
Thomas Eding
Juga, ia bahkan tidak menerima nilai ...
Exelian
28

Universal (bahasa agnostik / mandiri )

Jika Anda hanya ingin menggunakan angka (hindari mengubah angka menjadi string) dan tidak ingin menggunakan perpustakaan tertentu (menjadi universal untuk bahasa apa pun):

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

Ini adalah python, tetapi bisa dilakukan dalam bahasa apa pun, karena itu hanya metode matematika.

Kiril Kirov
sumber
Jika Anda menggantinya moddengan %, itu valid Python;)
phihag
Anda benar, sebenarnya :) 10x
3
Bukan yang terpendek, tetapi yang paling umum dan universal.
Kiril Kirov
3
y=y*10+x%10....
st0le
1
BrainFuck tidak, meskipun bisa dihitung. Bahasa apa pun yang tidak memilikinya dapat digunakan a - (n * int(a/n))sebagai ganti a mod n. Juga, jika Anda melihat di sini , operasi modulus diimplementasikan secara berbeda di setiap bahasa. (Lihat tabel di sebelah kanan.)
mbomb007
13

Perl 6

+$n.flip

atau:

$n.flip

untuk kode yang diketik secara dinamis.

Bilangan mendapat metode string karena desain bahasa.

Ming-Tang
sumber
10

J - 6 karakter + variabel

".|.":y

Di mana y adalah nilai Anda.

MPelletier
sumber
2
Sebagai fungsi: |.&.":"reverse under do" yang merupakan terjemahan tugas yang cukup banyak.
FireFly
9

APL (3)

⍎⌽⍕

Pemakaian:

⍎⌽⍕12345 => 54321
marinus
sumber
8

PHP, 9 karakter

(int)strrev(123);

Untuk melakukannya singkat di mana Nkonstan:

strrev(N)
powtac
sumber
8

Befunge (3 karakter)

Program runnable lengkap:

N.@

Di mana Nnomor Anda. Aturan mengatakan "terima argumen bernilai integer tunggal "; Di Befunge Anda hanya dapat memasukkan bilangan bulat dari 0 hingga 9.

daniero
sumber
3
Itu adalah satu-satunya literal , tetapi angka-angka lain pasti bisa diwakili. Kalau tidak, jawaban yang menang adalah Brainfuck dengan program kosong. ;-)
FireFly
8

Bahasa-independen / matematika

Terinspirasi oleh jawaban Kiril Kirov di atas. Saya ingin tahu tentang sifat-sifat matematika membalik angka, jadi saya memutuskan untuk menyelidiki sedikit.

Ternyata jika Anda merencanakan perbedaan n - rev(n)untuk bilangan asli ndi beberapa basis r, Anda mendapatkan pola seperti ini ( (n - rev(n)) / (r - 1), untuk r=10, dibungkus rkolom, merah menunjukkan angka negatif):

tabel perbedaan

Urutan ini dapat dihasilkan seperti itu (pseudocode):

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)

Jika Anda menyimpan nilai-nilai ini dalam daftar / array, maka Anda n - arr[n]akan mendapatkan bentuk terbalik dari n. Sekarang, untuk "golf matematis" ini, kita idealnya menginginkan ekspresi bentuk tertutup yang memberi kita nilai n: urutannya, sehingga kita bisa memiliki ekspresi bentuk tertutup untuk menyelesaikan seluruh tugas. Sayangnya, saya belum dapat menemukan ekspresi seperti itu ... tetapi kelihatannya itu mungkin. :(

Jadi ya, bukan kode-golf sebagai keingintahuan matematis, tetapi jika ada ekspresi bentuk tertutup dari urutan di atas mungkin sebenarnya berguna dalam pengiriman golf PL yang tepat.

FireFly
sumber
7

Haskell, 28 24 karakter

f=read.reverse.show.(+0)
hammar
sumber
2
Bagaimana dengan f=read.reverse.show.(+0)?
FUZxxl
2
(+0): Manusia yang sah! Meskipun secara teknis Anda tidak memerlukannya .(+0)sama sekali, karena fakan lebih polimorfik daripada yang dibutuhkan oleh masalah (diizinkan untuk mengembalikan output yang 'diketik dengan cara yang sama'). Saya akan mencukur 5 karakter tersebut.
Thomas Eding
7

Vim

17 karakter

:se ri<CR>C<C-R>"
Eric Fortis
sumber
Saya akan mengatakan itu 10 karakter (penekanan tombol) jika Anda mengetik perintah langsung di vim. Btw, saya belajar sesuatu yang baru di vim hari ini, terima kasih :)
daniero
6

Scala - 33 Chars

def r(a:Int)=(a+"").reverse.toInt
Lalith
sumber
1
+1 untuk scala, senang melihat sesuatu selain python / ruby ​​/ perl
lhk
Ini akan gagal pada Int negatif. -123 harus mengembalikan -321
samach
6

Ruby (14)

x = 13456
x.to_s.reverse
berbadan teguh
sumber
3
"Tidak" tidak ditentukan. Saya pikir Anda bermaksud meletakkan "x" di sana.
David Rivers
3
123456.to_s.reverse bahkan lebih pendek.
Steffen Roller
@mmdemirbas - terima kasih telah memperbaiki kesalahan ketik
Tubuh
3
Perlu .to_s.reverse.to_imematuhi spesifikasi.
histokrat
Angka yang dimulai dengan 0 sepertinya tidak berfungsi. 0112.to_s.reverse.to_i => 47
Joel
5

Dimungkinkan untuk mengubah angka menjadi string, kemudian membalikkan string dan kemudian mengubah string itu kembali ke angka. Fitur semacam ini mungkin tersedia dalam semua bahasa. Jika Anda mencari metode yang lebih matematis maka ini mungkin membantu:

int n = 76543;
int r = 0;

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

sumber
5
Milik saya benar-benar sama (:
Ya, satu-satunya perbedaan adalah kode Anda terlihat seperti Python.
Metode ini meluap pada bahasa dengan presisi terbatas. coba1111111119
st0le
5

Python 3+

Bentuk fungsi: 28 karakter

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

(Sub) formulir program: 25 karakter

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

Saya menganggap beberapa contoh Python lain sebagai curang, atau setidaknya murah, karena menggunakan input hardcoded dan / atau tidak sepenuhnya memenuhi persyaratan.

TUSUKAN
sumber
5

Golfscript, 5 karakter

`-1%~

Ini mengambil argumen pada stack dan meninggalkan hasilnya di stack. Saya mengeksploitasi opsi "subprogram" di spec: jika Anda bersikeras pada suatu fungsi, itu empat karakter lebih meninggalkannya di stack:

{`-1%~}:r
Peter Taylor
sumber
Saya pikir Anda pasti memaksudkan `-1%~daripada `-1$~(dan saya telah mengambil kebebasan mengedit jawaban Anda untuk mengatakan demikian).
Ilmari Karonen
5

Dalam skrip shell:

  echo "your number"|rev

Semoga ini bermanfaat :)

tusharmakkar08
sumber
bagus tidak tahu bash mampu melakukan itu juga!
Pranit Bauva
1
Saya kira secara teknis tidak mengembalikan sama-mengetik "jumlah" ... bisa dipersingkat lebih lanjut dengan rev<<<yournumber, misalnya rev<<<132(untuk bash / zsh, bukan per POSIX meskipun)
FireFly
1
Hanya revcukup, pertanyaan tidak mengatakan itu memiliki menjadi fungsi. Anda dapat membandingkan revdengan fungsi bawaan, meskipun bukan satu.
nyuszika7h
ini tidak valid: 'rev' bukan builtin, tetapi panggilan program eksternal.
Bastian Bittorf
67 Bytes shell POSIX murni: X = $ 1; sementara [$ X! = 0]; lakukan Y = $ ((Y * 10 + X% 10)); X = $ ((X / 10)); selesai; echo $ Y
Bastian Bittorf
3

Agak terlambat tapi

APL, 3

⍎⌽⍞

Jika Anda bersikeras pada fungsi

⍎∘⌽∘⍕
TwiNight
sumber
Yah sepertinya saya tidak bisa menemukan duplikat di atas ... (karena itu berada di halaman ke-2)
TwiNight
Saya sedih, bahwa tidak ada yang memberikan solusi brainfu * k atau whitespace :( (satu suara lagi dan Anda ada di halaman pertama)
Kiril Kirov
@ KirilKirov Saya punya solusi brainfu * k: codegolf.stackexchange.com/a/32826/24829
rpax
3

Mathematica, 14 byte

IntegerReverse

Ini tidak bersaing, karena fungsi ini hanya ditambahkan pada rilis 10.3 minggu lalu, tetapi untuk kelengkapan saya pikir saya akan menambahkan satu-satunya (saya pikir?) Built-in untuk tugas ini.

Martin Ender
sumber
2

Anda dapat melakukan hal berikut di Jawa. Perhatikan bahwa ini dikonversi ke String dan kembali dan bukan solusi matematika.

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));
    }
}
Pemenang
sumber
2
Ini adalah solusi matematika. Matematika bukan angka bukan aritmatika. Matematika juga berurusan dengan rangkaian simbol. Dan dalam kasus khusus ini, konversi ke dan dari string hanya konversi ke dan dari basis-10.
R. Martinho Fernandes
Yang saya maksudkan dengan "bukan solusi matematis" adalah kita tidak mengerjakan matematika sendiri. Metode melakukan semua parsing dan matematika untuk kita. Berbeda dengan misalnya jawaban Kiril Kirov.
Victor
Will Overflow ...
st0le
2

Lua

Angka dan string dapat dipertukarkan, jadi ini sepele

string.reverse(12345)
Alex
sumber
2

Yang ini SEBENARNYA mengambil input, tidak seperti yang lain:

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

Python btw.

Exelian
sumber
2

Actionscript

43 karakter. num sebagai parameter ke fungsi:

num.toString().split('').reverse().join('')
Kumsal Obuz
sumber
2

Asyik

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

assert r(1234) == 4321
assert r(345678987654567898765) == 567898765456789876543
assert r(345346457.24654654) == 45645642.754643543
Armand
sumber
2

Perl, 11 karakter

The pflag diperlukan untuk ini untuk bekerja, masuk dalam hitungan.

Pemakaian:

$ echo 76543 | perl -pE '$_=reverse'
Zaid
sumber
Saya menghitung 10 karakter
F. Hauri
The pbendera masuk dalam hitungan
Zaid
2

Clojure (42 karakter)

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

Contoh penggunaan:

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

mengembalikan 12389

Omar
sumber
2

Lisp umum - 60 karakter

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

akan membuat Anda 9724.

Chris Zimmerman
sumber
Mengapa (first(list? parse-integersudah mengembalikan nomornya.
Florian Margaine
2

K, 3 byte:

.|$

Evaluate ( .) kebalikan ( |) dari casting ke string ( $).

Contoh penggunaan:

  .|$76543
34567
JohnE
sumber
2

rs , 20 byte

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

Secara teknis, ini tidak masuk hitungan (rs dibuat awal tahun ini), tapi saya tidak melihat jawaban berbasis regex lain, dan saya pikir ini rapi.

Demo langsung.

Penjelasan:

#

Masukkan karakter pon di awal string. Ini digunakan sebagai penanda.

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

Terus tambahkan karakter terakhir dari string utama ke area sebelum marker hingga tidak ada karakter yang tersisa.

#/

Hapus penanda.

kirbyfan64sos
sumber
2

mIRC 4,45 (35 Bytes)

$regsubex(12,/(.)/g,$mid(\A,-\n,1))
onkarjit
sumber