Najkrótszy sposób na odwrócenie liczby

31

Napisz funkcję (lub równoważny podprogram), aby zaakceptować pojedynczy argument o wartości całkowitej i zwrócić (o podobnym typie) wartość znalezioną przez odwrócenie kolejności 10-cyfrowych cyfr argumentu.

Na przykład podany 76543 zwraca 34567

dmckee
źródło
6
Wróć do czasu, gdy liczba była ciągiem, a następnie odwróć ciąg
pmg
2
Pomysł „najkrótszego algorytmu” jest dość podstępny, zwłaszcza jeśli dopuścisz „dowolny język”. Wymyśl algorytm, a dam ci DSL z odpowiednim operatorem „~” ...
3
Uwaga: każda liczba kończąca się na 0 staje się krótszą liczbą cyfr po odwróceniu ...
powtac
44
Znam algorytm, który w ogóle nie zajmuje czasu , ale działa tylko na liczbach palindromowych;)
schnaader
Znalazłem czas, aby samemu napisać od nowa. Mam nadzieję, że pozostanie to układanka, którą Eltond chciał postawić.
dmckee

Odpowiedzi:

85

HTML 21 7 znaków (1 znak, jeśli jestem bezczelny ...)

‮n

zamień na nswój numer

Nowicjusz
źródło
1
To jest po prostu genialny. Wybrałbym jednego char. Lub 2, ponieważ koduje do dwóch bajtów w UTF-16: P
tomsmeding
17
Hahaha Poszukałem tego tagu w Google i zostałem nagrodzony Your search -‮ - nie pasuje do żadnych dokumentów.
JoeFish,
data:text/html,&%238238;egnahcxEkcatS olleH
Możesz
3
Zabawne także w Google Transate . @JoeFish: Nie mogę się rozmnażać, proszę zamieścić link!
F. Hauri
1
@JoeFish Kiedy patrzę na komentarz, twoja nazwa użytkownika jest odwrócona i jest po niej trochę tekstu. txet emos si ereH
Stefnotch
32

Pyton

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

EDYTOWAĆ:

Krótsze rozwiązanie sugerowane przez @gnibbler:

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

lub, jeśli powyższe nie jest jasne:

x=76543
int(`x`[::-1])
Vader
źródło
4
s[::-1]jest znacznie szybszy niż''.join(reversed(s))
riza
4
Możesz użyć backticks (do repr) zamiast używać str
gnibbler
@gnibbler Dzięki za sugestię. Zaktualizowałem swoją odpowiedź.
Vader
2
TBH, to nie jest funkcja / procedura / cokolwiek chcesz to nazwać, a specyfikacje tego wymagają.
Thomas Eding,
Ponadto nie przyjmuje nawet wartości ...
Exelian
28

Uniwersalny (język agnostyczny / niezależny )

Jeśli chcesz używać tylko liczb (unikaj konwersji liczby na ciąg) i nie chcesz używać określonej biblioteki (uniwersalnej dla dowolnego języka):

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

To jest python, ale można to zrobić w dowolnym języku, ponieważ jest to tylko metoda matematyczna.

Kiril Kirow
źródło
Jeśli zastąpi modsię %, że to ważne Python;)
phihag
Właściwie masz rację :) 10x
3
Nie najkrótszy, ale najbardziej powszechny i ​​uniwersalny.
Kiril Kirov,
3
y=y*10+x%10....
st0le,
1
BrainFuck nie, choć można to obliczyć. a - (n * int(a/n))Zamiast tego można użyć dowolnego języka, który go nie ma a mod n. Ponadto, jeśli spojrzysz tutaj , operacja modułu jest realizowana inaczej w każdym języku. (Patrz tabela po prawej stronie).
mbomb007
13

Perl 6

+$n.flip

lub:

$n.flip

dla dynamicznie wpisywanego kodu.

Liczby mają metody ciągów ze względu na projekt języka.

Ming-Tang
źródło
10

J - 6 znaków + zmienna

".|.":y

Gdzie y jest twoją wartością.

MPelletier
źródło
2
Jako funkcja: |.&.":„reverse under do”, co jest dosłownie tłumaczeniem zadania.
FireFly,
9

APL (3)

⍎⌽⍕

Stosowanie:

⍎⌽⍕12345 => 54321
marinus
źródło
8

PHP, 9 znaków

(int)strrev(123);

Aby to zrobić krótko, gdzie Njest stała:

strrev(N)
powtac
źródło
8

Befunge (3 znaki)

Kompletny program do uruchomienia:

N.@

Gdzie Njest twój numer Reguły mówią: „zaakceptuj argument o wartości całkowitej ”; W Befunge możesz wprowadzać tylko liczby całkowite od 0 do 9.

daniero
źródło
3
To jedyne literały , ale z pewnością można przedstawić inne liczby. W przeciwnym razie zwycięską odpowiedzią byłoby Brainfuck z pustym programem. ;-)
FireFly
8

Niezależna od języka / matematyka

Zainspirowany powyższą odpowiedzią Kirila Kirowa. Zainteresowałem się matematycznymi właściwościami odwracania liczby, więc postanowiłem trochę zbadać.

Okazuje się, że jeśli wykreślisz różnicę n - rev(n)dla liczb naturalnych nw jakiejś podstawie r, otrzymasz takie wzory ( (n - rev(n)) / (r - 1)dla r=10, zawinięte w rkolumny, czerwony oznacza liczbę ujemną):

tabela różnic

Ta sekwencja może być wygenerowana jako taka (pseudokod):

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)

Jeśli przechowujesz te wartości w liście / tablicy, n - arr[n]otrzymasz odwróconą formę n. Teraz, aby „matematycznie golfa” to, chcielibyśmy mieć wyrażenie w formie zamkniętej, które daje nam n-tą wartość w sekwencji, abyśmy mogli mieć wyrażenie w kształcie zamkniętym do rozwiązania całego zadania. Niestety nie udało mi się znaleźć takiego wyrażenia ... ale wygląda na to, że powinno być możliwe. :(

Więc tak, nie tyle golfowy kod, co matematyczna ciekawość, ale jeśli istnieje wyrażenie o zamkniętej formie powyższej sekwencji, może być faktycznie przydatne w prawidłowym składaniu PL golfa.

Robaczek świętojański
źródło
7

Haskell, 28 24 znaki

f=read.reverse.show.(+0)
hammar
źródło
2
Jak o f=read.reverse.show.(+0)?
FUZxxl,
2
(+0): Legit man! Chociaż technicznie wcale nie jest to potrzebne .(+0), ponieważ fbyłby bardziej polimorficzny niż wymaga tego problem (dozwolone jest zwracanie wyjścia „podobnie typowanego”). Ogoliłbym te 5 postaci.
Thomas Eding,
7

Wigor

17 znaków

:se ri<CR>C<C-R>"
Eric Fortis
źródło
Powiedziałbym, że to 10 znaków (naciśnięcia klawiszy), jeśli wpiszesz polecenie bezpośrednio w vimie. Przy okazji, nauczyłem się dzisiaj czegoś nowego w vimie, dzięki :)
daniero
6

Scala - 33 znaki

def r(a:Int)=(a+"").reverse.toInt
Lalith
źródło
1
+1 za Scalę, miło widzieć coś innego niż python / ruby ​​/ perl
lhk 12.12.12
To się nie powiedzie przy ujemnej Int. -123 powinien zwrócić -321
samach
6

Rubin (14)

x = 13456
x.to_s.reverse
cielesny
źródło
3
„nie” jest niezdefiniowane. Myślę, że chciałeś tam wstawić „x”.
David Rivers
3
123456.to_s.reverse jest jeszcze krótszy.
Steffen Roller
@mmdemirbas - dzięki za naprawienie literówki
cielesny
3
Musi być .to_s.reverse.to_izgodny ze specyfikacją.
histocrat
Liczba zaczynająca się od 0 wydaje się nie działać. 0112.to_s.reverse.to_i => 47
Joel
5

Można przekonwertować liczbę na ciąg, a następnie odwrócić ciąg, a następnie przekonwertować ten ciąg z powrotem na liczbę. Ten rodzaj funkcji jest prawdopodobnie dostępny we wszystkich językach. Jeśli szukasz bardziej matematycznej metody, może to pomóc:

int n = 76543;
int r = 0;

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

źródło
5
Mój jest absolutnie taki sam (:
Tak, jedyną różnicą jest to, że Twój kod wygląda jak Python.
Ta metoda przepełnia języki z ograniczoną precyzją. try1111111119
st0le
5

Python 3+

Forma funkcji: 28 znaków

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

Forma (pod) programu: 25 znaków

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

Uważam, że niektóre inne przykłady Pythona są oszustwem, a przynajmniej tanim, ze względu na użycie zakodowanego wejścia i / lub niezupełne spełnienie wymagań.

UKŁUCIE
źródło
5

Golfscript, 5 znaków

`-1%~

To bierze argument na stosie i pozostawia wynik na stosie. Korzystam z opcji „podprogramu” w specyfikacji: jeśli nalegasz na funkcję, to o cztery znaki więcej pozostawiając ją na stosie:

{`-1%~}:r
Peter Taylor
źródło
Myślę, że musiałeś `-1%~raczej chcieć niż `-1$~(i pozwoliłem sobie na edytowanie twojej odpowiedzi, żeby tak powiedzieć).
Ilmari Karonen,
5

W skryptach powłoki:

  echo "your number"|rev

Mam nadzieję, że to się przydało :)

tusharmakkar08
źródło
dobry! nie wiedziałem, że bash też to potrafi!
Pranit Bauva
1
Chyba technicznie to nie zwracają podobnie wpisany „numer” ... mógłby zostać skrócony dalej z rev<<<yournumbernp rev<<<132(dla bash / zsh, choć nie za POSIX)
FireFly
1
Wystarczy rev, pytanie nie mówi, że to musi być funkcja. Możesz porównać revdo wbudowanej funkcji, nawet jeśli nie jest to jedna.
nyuszika7h
jest to nieprawidłowe: „rev” nie jest wbudowanym, ale zewnętrznym wywołaniem programu.
Bastian Bittorf,
67-bajtowa powłoka POSIX: X = 1 $; podczas gdy [$ X! = 0]; do Y = $ ((Y * 10 + X% 10)); X = $ ((X / 10)); gotowe; echo $ Y
Bastian Bittorf,
3

Trochę późno, ale

APL, 3

⍎⌽⍞

Jeśli nalegasz na funkcję

⍎∘⌽∘⍕
TwiNight
źródło
Wygląda na to, że nie mogłem zauważyć duplikatu powyżej ... (ponieważ znajduje się na 2. stronie)
TwiNight,
Przykro mi, że nikt nie dał rozwiązaniafufu * k lub białych znaków :( (jeszcze jeden głos i jesteś na pierwszej stronie)
Kiril Kirov
@KirilKirov Mam rozwiązanie brainfu * k: codegolf.stackexchange.com/a/32826/24829
rpax
3

Mathematica, 14 bajtów

IntegerReverse

To nie jest konkurencja, ponieważ ta funkcja została dodana tylko w wydaniu 10.3 z zeszłego tygodnia, ale dla kompletności pomyślałem, że dodam jedyne (jak sądzę?) Wbudowane do tego zadania.

Martin Ender
źródło
2

Możesz wykonać następujące czynności w Javie. Zauważ, że konwertuje to na String i wstecz i nie jest matematycznym rozwiązaniem.

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));
    }
}
Zwycięzca
źródło
2
To matematyczne rozwiązanie. Matematyka to nie liczby nie jest arytmetyką. Matematyka zajmuje się również ciągami symboli. A w tym szczególnym przypadku konwersja do i z łańcucha znaków jest po prostu konwersją do i z bazy-10.
R. Martinho Fernandes,
Przez „nie matematyczne rozwiązanie” mam na myśli to, że sami nie zajmujemy się matematyką. Metody wykonują dla nas całą analizę i matematykę. W przeciwieństwie do np. Odpowiedzi Kirila Kirowa.
Victor
Przepełni się ...
st0le
2

Lua

Liczby i ciągi znaków są wymienne, więc jest to banalne

string.reverse(12345)
Alex
źródło
2

Ten RZECZYWISTO pobiera dane wejściowe, w przeciwieństwie do niektórych pozostałych:

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

Python btw.

Exelian
źródło
2

ActionScript

43 znaki. num jako parametr funkcji:

num.toString().split('').reverse().join('')
Kumsal Obuz
źródło
2

Groovy

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

assert r(1234) == 4321
assert r(345678987654567898765) == 567898765456789876543
assert r(345346457.24654654) == 45645642.754643543
Armand
źródło
2

Perl, 11 znaków

The pFlaga jest potrzebne do tego, aby pracy, zawarte w sumie.

Stosowanie:

$ echo 76543 | perl -pE '$_=reverse'
Zaid
źródło
Naliczyłem 10 znaków
F. Hauri,
pFlaga jest zawarte w sumie
Zaid
2

Clojure (42 znaki)

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

Przykładowe użycie:

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

zwraca 12389

Omar
źródło
2

Common Lisp - 60 znaków

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

dostaniesz 9724.

Chris Zimmerman
źródło
Dlaczego (first(list? parse-integerjuż zwraca numer.
Florian Margaine,
2

K, 3 bajty:

.|$

Oceń (. ) odwrotność (| ) rzutowania na string ( $).

Przykład użycia:

  .|$76543
34567
JohnE
źródło
2

rs , 20 bajtów

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

Technicznie to się nie liczy (rs został utworzony wcześniej w tym roku), ale nie widziałem żadnych innych odpowiedzi opartych na wyrażeniach regularnych i pomyślałem, że to było fajne.

Demo na żywo.

Wyjaśnienie:

#

Wstaw znak funta na początku ciągu. Jest to używane jako marker.

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

Ciągle dodawaj ostatni znak głównego ciągu do obszaru przed znacznikiem, dopóki nie pozostaną żadne znaki.

#/

Usuń znacznik.

kirbyfan64sos
źródło
2

mIRC 4,45 (35 bajtów)

$regsubex(12,/(.)/g,$mid(\A,-\n,1))
onkarjit
źródło