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


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


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])

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.


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.


10

J - 6 znaków + zmienna

".|.":y

Gdzie y jest twoją wartością.


2
Jako funkcja: |.&.":„reverse under do”, co jest dosłownie tłumaczeniem zadania.
FireFly,


8

PHP, 9 znaków

(int)strrev(123);

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

strrev(N)

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.


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.


7

Haskell, 28 24 znaki

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

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

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

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

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

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ń.


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

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 :)


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ę

⍎∘⌽∘⍕

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.


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

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)

2

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

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

Python btw.


2

ActionScript

43 znaki. num jako parametr funkcji:

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 znaków

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

Stosowanie:

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

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



2

K, 3 bajty:

.|$

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

Przykład użycia:

  .|$76543
34567

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.


Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.