Cách ngắn nhất để đảo ngược một số


31

Viết hàm (hoặc chương trình con tương đương) để chấp nhận một đối số có giá trị nguyên duy nhất và trả về giá trị (được gõ tương tự) được tìm thấy bằng cách đảo ngược thứ tự của 10 chữ số cơ sở của đối số.

Ví dụ: 76543 trả lại 34567


6
Quay trở lại thời điểm số là một chuỗi, sau đó đảo ngược chuỗi
pmg

2
Ý tưởng về "thuật toán ngắn nhất" có phần đặc biệt, đặc biệt nếu bạn cho phép "bất kỳ ngôn ngữ nào". Nghĩ ra một thuật toán và tôi sẽ cung cấp cho bạn một DSL với toán tử "~" thích hợp ...

3
Chỉ cần một thông báo: bất kỳ số nào kết thúc bằng 0 sẽ trở thành số chữ số ngắn hơn khi đảo ngược ...
powtac

44
Tôi biết một thuật toán hoàn toàn không mất thời gian , nhưng chỉ hoạt động trên các số palindromic;)
schnaader

Tìm thấy thời gian để làm lại bản thân mình. Tôi hy vọng đây vẫn là câu đố mà eltond muốn đặt ra.
dmckee

Câu trả lời:


85

HTML 21 7 ký tự (1 char nếu tôi táo tợn ...)

‮n

thay thế nbằng số của bạn


1
Đây chỉ là thiên tài đơn giản. Tôi sẽ đi cho một char. Hoặc 2, vì nó mã hóa thành hai byte trong UTF-16: P
tomsmeding

17
Hahaha Tôi đã thực hiện tìm kiếm Google trên thẻ đó và được thưởng Your search -‮ - không khớp với bất kỳ tài liệu nào.
JoeFish

Bạn có thể thử liên kết này trong trình duyệt:data:text/html,&%238238;egnahcxEkcatS olleH
F. Hauri

3
Hài hước trong google transate quá. @JoeFish: Tôi không thể sao chép, xin vui lòng gửi một liên kết!
F. Hauri

1
@JoeFish Khi tôi nhìn vào bình luận, tên người dùng của bạn được lật và có một số văn bản sau nó. txet emos si ereH
Stefnotch

32

Con trăn

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

CHỈNH SỬA:

Giải pháp ngắn hơn theo đề xuất của @gnibbler:

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

hoặc, nếu ở trên không rõ ràng:

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

4
s[::-1]nhanh hơn rất nhiều so với''.join(reversed(s))
riza

4
Bạn có thể sử dụng backticks (cho repr) thay vì sử dụng str
gnibbler

@gnibbler Cảm ơn bạn đã gợi ý. Tôi đã cập nhật câu trả lời của mình.
Vader

2
TBH, đó không phải là chức năng / thủ tục / bất cứ điều gì bạn muốn gọi nó và thông số kỹ thuật yêu cầu nó.
Thomas Eding

Ngoài ra, nó thậm chí không chấp nhận một giá trị ...
Exelian

28

Phổ cập (ngôn ngữ bất khả tri / độc lập )

Nếu bạn muốn chỉ sử dụng số (tránh chuyển đổi số thành chuỗi) và không muốn sử dụng một số thư viện cụ thể (để phổ biến cho bất kỳ ngôn ngữ nào):

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

Đây là python, nhưng nó có thể được thực hiện bằng bất kỳ ngôn ngữ nào, bởi vì nó chỉ là một phương pháp toán học.


Nếu bạn thay thế modbằng %, nó hợp lệ Python;)
phihag

Bạn nói đúng, thực sự :) 10

3
Không phải là ngắn nhất, nhưng phổ biến nhất và phổ quát.
Kiril Kirov

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

1
BrainFuck không, mặc dù nó có thể được tính toán. Bất kỳ ngôn ngữ nào không có nó đều có thể sử dụng a - (n * int(a/n))thay thế a mod n. Ngoài ra, nếu bạn nhìn vào đây , thao tác mô đun được triển khai khác nhau ở mọi ngôn ngữ. (Xem bảng bên phải.)
mbomb007

13

Perl 6

+$n.flip

hoặc là:

$n.flip

cho mã gõ động.

Số có phương thức chuỗi do thiết kế ngôn ngữ.


10

J - 6 ký tự + biến

".|.":y

Trong đó y là giá trị của bạn.


2
Là một chức năng: |.&.":"đảo ngược dưới làm" gần như là một bản dịch nghĩa đen của nhiệm vụ.
FireFly


8

PHP, 9 ký tự

(int)strrev(123);

Để làm điều đó ngắn, nơi Nlà một hằng số:

strrev(N)

8

Befunge (3 ký tự)

Hoàn thành chương trình runnable:

N.@

Trong trường hợp Nlà số của bạn. Các quy tắc nói "chấp nhận một đối số có giá trị nguyên "; Trong Befunge, bạn chỉ có thể nhập số nguyên từ 0 đến 9.


3
Đó là những chữ duy nhất , nhưng những con số khác chắc chắn có thể được đại diện. Nếu không, câu trả lời chiến thắng sẽ là Brainfuck với chương trình trống. ;-)
FireFly

8

Ngôn ngữ độc lập / toán học

Lấy cảm hứng từ câu trả lời của Kiril Kirov ở trên. Tôi tò mò về các tính chất toán học của việc đảo ngược một số, vì vậy tôi quyết định điều tra một chút.

Hóa ra nếu bạn vẽ sự khác biệt n - rev(n)cho các số tự nhiên ntrong một số cơ sở r, bạn sẽ có được các mẫu như thế này ( (n - rev(n)) / (r - 1), cho r=10, được bọc tại rcác cột, màu đỏ biểu thị số âm):

bảng khác biệt

Trình tự này có thể được tạo ra như vậy (mã giả):

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)

Nếu bạn lưu trữ các giá trị này trong một danh sách / mảng, thì n - arr[n]nó sẽ giúp bạn có dạng đảo ngược n. Bây giờ, để "đánh gôn về mặt toán học" này, lý tưởng nhất là chúng ta muốn một biểu thức dạng đóng mang lại cho chúng ta giá trị n: thứ tự để chúng ta có thể có biểu thức dạng đóng để giải toàn bộ tác vụ. Thật không may, tôi đã không thể tìm thấy một biểu hiện như vậy ... nhưng có vẻ như nó là có thể. :

Vì vậy, vâng, không phải là một môn đánh gôn mã như một sự tò mò toán học, nhưng nếu có một biểu thức dạng đóng của trình tự trên, nó thực sự có thể hữu ích trong việc đệ trình golf PL thích hợp.


7

Haskell, 28 24 ký tự

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

2
Thế còn f=read.reverse.show.(+0)?
FUZxxl

2
(+0): Người đàn ông hợp pháp! Mặc dù về mặt kỹ thuật, bạn hoàn toàn không cần .(+0), nhưng fsẽ đa hình hơn so với những gì vấn đề yêu cầu (nó được phép trả lại đầu ra 'được gõ tương tự'). Tôi sẽ cạo đi 5 ký tự đó.
Thomas Eding

7

Vim

17 ký tự

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

Tôi sẽ nói rằng đó là 10 ký tự (tổ hợp phím) nếu bạn nhập lệnh trực tiếp trong vim. Btw, tôi đã học được một cái gì đó mới trong vim ngày hôm nay, cảm ơn :)
daniero

6

Scala - 33 ký tự

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

1
+1 cho scala, rất vui khi thấy một cái gì đó khác ngoài python / ruby ​​/ perl
lhk

Điều này sẽ thất bại trên Int. -123 nên quay lại -321
samach

6

Hồng ngọc (14)

x = 13456
x.to_s.reverse

3
"Không" là không xác định. Tôi nghĩ bạn có nghĩa là đặt "x" ở đó.
David Rivers

3
123456.to_s.reverse thậm chí còn ngắn hơn.
Con lăn Steffen

@mmdemirbas - nhờ để sửa chữa các lỗi đánh máy
bodacious

3
Cần phải .to_s.reverse.to_ituân thủ thông số kỹ thuật.
lịch sử

Một số bắt đầu bằng 0 dường như không hoạt động. 0112.to_s.reverse.to_i => 47
Joel

5

Có thể chuyển đổi một số một chuỗi, sau đó đảo ngược chuỗi và sau đó chuyển đổi chuỗi đó thành số. Loại tính năng này có thể có sẵn trong tất cả các ngôn ngữ. Nếu bạn đang tìm kiếm một phương pháp toán học hơn thì điều này có thể giúp:

int n = 76543;
int r = 0;

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

5
Của tôi hoàn toàn giống nhau (:

Ya, chỉ khác là mã của bạn trông giống như Python.

Phương pháp này tràn trên các ngôn ngữ với độ chính xác hạn chế. thử1111111119
st0le

5

Python 3+

Dạng chức năng: 28 ký tự

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

(Sub) mẫu chương trình: 25 ký tự

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

Tôi coi một số ví dụ Python khác là gian lận, hoặc ít nhất là rẻ, do sử dụng đầu vào được mã hóa cứng và / hoặc không đáp ứng đầy đủ các yêu cầu.


5

Golf, 5 ký tự

`-1%~

Điều này nhận một đối số trên ngăn xếp và để lại kết quả trên ngăn xếp. Tôi đang khai thác tùy chọn "chương trình con" trong thông số kỹ thuật: nếu bạn nhấn mạnh vào một chức năng, đó là bốn ký tự nữa để lại trên ngăn xếp:

{`-1%~}:r

Tôi nghĩ bạn phải có ý `-1%~chứ không phải `-1$~(và tôi đã tự do chỉnh sửa câu trả lời của bạn để nói như vậy).
Ilmari Karonen

5

Trong kịch bản shell:

  echo "your number"|rev

Hy vọng điều này hữu ích :)


tốt một không biết bash cũng có khả năng đó!
Pranit Bauva

1
Tôi đoán về mặt kỹ thuật, nó sẽ trả về một "số" được gõ tương tự ... có thể được rút ngắn hơn nữa với rev<<<yournumber, ví dụ rev<<<132(đối với bash / zsh, không phải trên mỗi POSIX)
FireFly

1
Chỉ cần revlà đủ, câu hỏi không nói nó được một hàm. Bạn có thể so sánh revvới một hàm tích hợp, mặc dù nó không phải là một hàm.
nyuszika7h

Điều này không hợp lệ: 'rev' không phải là nội dung, mà là một cuộc gọi chương trình bên ngoài.
Bastian Bittorf

67 Vỏ byte POSIX nguyên chất: X = $ 1; trong khi [$ X! = 0]; do Y = $ ((Y * 10 + X% 10)); X = $ ((X / 10)); xong; echo $ Y
Bastian Bittorf

3

Hơi muộn nhưng

APL, 3

⍎⌽⍞

Nếu bạn nhấn mạnh vào một chức năng

⍎∘⌽∘⍕

Có vẻ như tôi không thể phát hiện một bản sao ở trên ... (do nó nằm trên trang thứ 2)
TwiNight

Tôi buồn, rằng không ai đưa ra giải pháp trí tuệ * k hoặc khoảng trắng :( (thêm một phiếu và bạn đang ở trang đầu tiên)
Kiril Kirov

@KirilKirov Tôi có một giải pháp Brainfu * k: codegolf.stackexchange.com/a/32826/24829
rpax

3

Toán học, 14 byte

IntegerReverse

Điều này không cạnh tranh, bởi vì chức năng này chỉ được thêm vào trong phiên bản 10.3 tuần trước, nhưng để hoàn thiện tôi nghĩ tôi đã thêm tính năng duy nhất (tôi nghĩ?) Được tích hợp cho nhiệm vụ này.


2

Bạn có thể làm như sau trong Java. Lưu ý rằng điều này chuyển đổi thành Chuỗi và trở lại và không phải là một giải pháp toán học.

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
Nó là một giải pháp toán học. Toán học không phải là con số không phải là mỹ phẩm. Toán học cũng liên quan đến các chuỗi ký hiệu. Và trong trường hợp đặc biệt này, việc chuyển đổi sang và từ chuỗi chỉ là chuyển đổi sang và từ cơ sở 10.
R. Martinho Fernandes

Điều tôi muốn nói là "không phải là một giải pháp toán học" là chúng ta không tự mình làm bất kỳ phép toán nào. Các phương pháp đang làm tất cả các phân tích cú pháp và toán học cho chúng tôi. Trái ngược với câu trả lời của Kiril Kirov.
Victor

Sẽ tràn ...
st0le

2

Lua

Số và chuỗi có thể hoán đổi cho nhau, vì vậy đây là chuyện nhỏ

string.reverse(12345)

2

Điều này THỰC SỰ có một đầu vào, không giống như một số phần còn lại:

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

Python btw.


2

Bản thảo

43 ký tự. num là tham số cho hàm:

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

2

Groovy

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

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

2

Perl, 11 ký tự

Các p lá cờ là cần thiết cho việc này đến công việc, nằm trong số lượng.

Sử dụng:

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

Tôi đếm 10 ký tự
F. Hauri

Các pcờ được bao gồm trong đếm
Zaid

2

Clojure (42 ký tự)

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

Ví dụ sử dụng:

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

trả lại 12389


2

Lisp thường gặp - 60 ký tự

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

sẽ giúp bạn 9724.


Tại sao (first(list? parse-integerđã trả về số.
Florian Margaine

2

K, 3 byte:

.|$

Đánh giá ( .) sự đảo ngược ( |) của việc đúc thành chuỗi ( $).

Ví dụ sử dụng:

  .|$76543
34567

2

rs , 20 byte

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

Về mặt kỹ thuật, điều này không được tính (rs đã được tạo ra vào đầu năm nay), nhưng tôi không thấy bất kỳ câu trả lời dựa trên regex nào khác và tôi nghĩ rằng điều này là gọn gàng.

Bản thử trực tiếp.

Giải trình:

#

Chèn một ký tự pound ở đầu chuỗi. Điều này được sử dụng như một điểm đánh dấu.

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

Liên tục thêm ký tự cuối cùng của chuỗi chính vào khu vực trước điểm đánh dấu cho đến khi không còn ký tự nào.

#/

Xóa điểm đánh dấu.


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.