Kürzester Weg, um eine Zahl umzukehren

31

Schreiben Sie eine Funktion (oder ein gleichwertiges Unterprogramm), um ein einzelnes Argument mit ganzzahligem Wert zu akzeptieren und einen (ähnlich typisierten) Wert zurückzugeben, der durch Umkehren der Reihenfolge der 10-stelligen Basis des Arguments ermittelt wurde.

Beispiel: 76543 gibt 34567 zurück

dmckee
quelle
6
Gehen Sie zurück zu der Zeit, als die Zahl eine Zeichenfolge war, und kehren Sie die Zeichenfolge um
pmg
2
Die Idee eines "kürzesten Algorithmus" ist etwas ungewöhnlich, insbesondere wenn Sie "jede Sprache" zulassen. Überlegen Sie sich einen Algorithmus und ich gebe Ihnen eine DSL mit einem geeigneten "~" Operator ...
3
Nur eine Bemerkung: Jede Zahl, die mit 0 endet, wird kürzer, wenn sie umgekehrt wird ...
powtac
44
Ich kenne einen Algorithmus, der keine Zeit benötigt , sondern nur mit palindromischen Zahlen arbeitet;)
schnaader
Ich habe Zeit gefunden, mich umzuschreiben. Ich hoffe, das bleibt das Rätsel, das eltond aufwerfen wollte.
dmckee

Antworten:

85

HTML 21 7 Zeichen (1 Zeichen, wenn ich frech bin ...)

‮n

Ersetzen Sie nmit Ihrer Nummer

Greif
quelle
1
Das ist einfach genial. Ich würde für einen Char gehen. Oder 2, da es in UTF-16 in zwei Bytes codiert: P
Tomsmeding
17
Hahaha, ich habe eine Google-Suche für dieses Tag durchgeführt und wurde mit belohnt. Es wurden Your search -‮ keine Dokumente gefunden.
JoeFish
Du könntest diesen Link im Browser ausprobieren:data:text/html,&%238238;egnahcxEkcatS olleH
F. Hauri
3
Witzig auch in Google Transate . @JoeFish: Ich kann nicht reproduzieren, bitte poste einen Link!
F. Hauri
1
@JoeFish Wenn ich mir den Kommentar ansehe, wird Ihr Benutzername umgedreht und es folgt ein Text. txet emos si ereH
Stefnotch
32

Python

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

BEARBEITEN:

Kürzere Lösung wie von @gnibbler vorgeschlagen:

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

oder, wenn oben nicht klar ist:

x=76543
int(`x`[::-1])
Vader
quelle
4
s[::-1]ist viel schneller als''.join(reversed(s))
riza
4
Sie können Backticks (für repr) anstelle von str verwenden
gnibbler
@ Gnibbler Danke für den Vorschlag. Ich habe meine Antwort aktualisiert.
Vader
2
TBH, das ist keine Funktion / Prozedur / was auch immer Sie es nennen möchten, und die Spezifikationen erfordern es.
Thomas Eding
Außerdem akzeptiert es nicht einmal einen Wert ...
Exelian
28

Universell (sprachenunabhängig / unabhängig) )

Wenn Sie nur Zahlen verwenden möchten (Konvertieren der Zahl in einen String vermeiden) und keine bestimmte Bibliothek verwenden möchten (um für jede Sprache universell zu sein):

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

Das ist Python, aber es kann in jeder Sprache gemacht werden, weil es nur eine mathematische Methode ist.

Kiril Kirov
quelle
Wenn Sie ersetzen modmit %, es ist gültig Python;)
phihag
Du hast recht :) 10x
3
Nicht die kürzeste, aber die allgemeinste und universellste.
Kiril Kirov
3
y=y*10+x%10....
st0le
1
BrainFuck nicht, obwohl es berechnet werden kann. Jede Sprache, die es nicht hat, kann a - (n * int(a/n))anstelle von verwenden a mod n. Wenn Sie hier nachsehen , ist die Modul-Operation in jeder Sprache anders implementiert. (Siehe Tabelle rechts.)
mbomb007
13

Perl 6

+$n.flip

oder:

$n.flip

für dynamisch getippten Code.

Zahlen erhielten Zeichenkettenmethoden aufgrund des Sprachdesigns.

Ming-Tang
quelle
10

J - 6 Zeichen + Variable

".|.":y

Wo y ist dein Wert.

MPelletier
quelle
2
Als Funktion: |.&.":"reverse under do", was so ziemlich eine wörtliche Übersetzung der Aufgabe ist.
FireFly
9

APL (3)

⍎⌽⍕

Verwendung:

⍎⌽⍕12345 => 54321
Marinus
quelle
8

PHP, 9 Zeichen

(int)strrev(123);

Um es kurz zu machen, wo Nist eine Konstante:

strrev(N)
powtac
quelle
8

Befunge (3 Zeichen)

Komplettes lauffähiges Programm:

N.@

Wo Nist deine Nummer? Regeln sagen "akzeptiere ein einzelnes Argument mit ganzzahligem Wert"; In Befunge können Sie nur ganze Zahlen von 0 bis 9 eingeben.

daniero
quelle
3
Dies sind die einzigen Literale , aber andere Zahlen könnten durchaus vertreten sein. Andernfalls wäre die gewinnende Antwort Brainfuck mit dem leeren Programm. ;-)
FireFly
8

Sprachunabhängig / Mathematik

Inspiriert von Kiril Kirovs Antwort oben. Ich wurde neugierig auf die mathematischen Eigenschaften der Umkehrung einer Zahl und beschloss, ein wenig nachzuforschen.

Wenn Sie den Unterschied n - rev(n)für natürliche Zahlen nin einer Basis zeichnen r, erhalten Sie Muster wie das folgende ( (n - rev(n)) / (r - 1)für r=10, in rSpalten eingeschlossen, bedeutet rot eine negative Zahl):

table of differences

Diese Sequenz könnte als solche erzeugt werden (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)

Wenn Sie diese Werte in einer Liste / einem Array speichern, n - arr[n]erhalten Sie die umgekehrte Form von n. Um dies "mathematisch zu golfen", möchten wir im Idealfall einen Ausdruck in geschlossener Form, der uns den n-ten Wert in der Sequenz gibt, damit wir einen Ausdruck in geschlossener Form zur Lösung der gesamten Aufgabe haben können. Leider konnte ich einen solchen Ausdruck nicht finden ... aber es sieht so aus ob es möglich wäre. :(

Also ja, nicht so sehr ein Code-Golf als eine mathematische Kuriosität, aber wenn es einen Ausdruck in geschlossener Form der obigen Sequenz gibt, könnte es tatsächlich nützlich sein, wenn PL-Golf eingereicht wird.

FireFly
quelle
7

Haskell, 28 24 Zeichen

f=read.reverse.show.(+0)
Hammar
quelle
2
Wie wäre es f=read.reverse.show.(+0)?
FUZxxl
2
(+0): Legit Mann! Technisch gesehen brauchen Sie das überhaupt nicht .(+0), da fes polymorpher wäre als das, was das Problem erfordert (es ist erlaubt, eine ähnlich typisierte Ausgabe zurückzugeben). Ich würde diese 5 Charaktere abschneiden.
Thomas Eding
7

Vim

17 Zeichen

:se ri<CR>C<C-R>"
Eric Fortis
quelle
Ich würde sagen, das sind 10 Zeichen (Tastenanschläge), wenn Sie den Befehl direkt in vim eingeben. Übrigens habe ich heute in vim etwas Neues gelernt, danke :)
daniero
6

Scala - 33 Zeichen

def r(a:Int)=(a+"").reverse.toInt
Lalith
quelle
1
+1 für Scala, schön, etwas anderes als Python / Ruby / Perl zu sehen
lhk
Dies schlägt bei negativem Int fehl. -123 sollte -321 zurückgeben
samach
6

Rubin (14)

x = 13456
x.to_s.reverse
körperreich
quelle
3
"nein" ist undefiniert. Ich denke, Sie wollten dort "x" setzen.
David Rivers
3
123456.to_s.reverse ist noch kürzer.
Steffen Roller
@mmdemirbas - Dank für die Festsetzung der Typo
bodacious
3
Muss sein .to_s.reverse.to_i, um mit spec zu entsprechen.
Histokrat
Eine Zahl, die mit 0 beginnt, scheint nicht zu funktionieren. 0112.to_s.reverse.to_i => 47
Joel
5

Es ist möglich, eine Zahl in eine Zeichenfolge umzuwandeln, die Zeichenfolge dann umzukehren und diese Zeichenfolge dann wieder in eine Zahl umzuwandeln. Diese Art von Funktion ist wahrscheinlich in allen Sprachen verfügbar. Wenn Sie nach einer mathematischeren Methode suchen, könnte dies helfen:

int n = 76543;
int r = 0;

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

quelle
5
Meins ist absolut das gleiche (:
Ja, der einzige Unterschied ist, dass Ihr Code wie Python aussieht.
Dieser Methodenüberlauf betrifft Sprachen mit begrenzter Genauigkeit. try1111111119
st0le
5

Python 3+

Funktionsform: 28 Zeichen

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

(Unter-) Programmform: 25 Zeichen

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

Ich halte einige der anderen Python-Beispiele für betrügerisch oder zumindest billig, da sie fest codierte Eingaben verwenden und / oder die Anforderungen nicht vollständig erfüllen.

JAB
quelle
5

Golfscript, 5 Zeichen

`-1%~

Dies nimmt ein Argument auf den Stapel und belässt das Ergebnis auf dem Stapel. Ich nutze die "Unterprogramm" -Option in der Spezifikation: Wenn Sie auf einer Funktion bestehen, verbleiben vier Zeichen mehr auf dem Stapel:

{`-1%~}:r
Peter Taylor
quelle
Ich denke, Sie haben es `-1%~eher gemeint als `-1$~(und ich habe mir die Freiheit genommen, Ihre Antwort zu bearbeiten, um dies zu sagen).
Ilmari Karonen
5

In Shell-Skripten:

  echo "your number"|rev

Hoffe das war nützlich :)

tusharmakkar08
quelle
gut! Ich wusste nicht, dass bash dazu auch in der Lage ist!
Pranit Bauva
1
Ich denke , es technisch nicht eine Rückkehr in ähnlicher Weise typisierte „Nummer“ ... weiter verkürzt werden könnte rev<<<yournumber, zum Beispiel rev<<<132(für bash / zsh, nicht pro POSIX obwohl)
FireFly
1
Gerade revgenug ist , stellt sich die Frage nicht sagen , es hat eine Funktion sein. Sie können es revmit einer eingebauten Funktion vergleichen, auch wenn es keine ist.
Nyuszika7h
das ist ungültig: 'rev' ist kein eingebauter, sondern ein externer Programmaufruf.
Bastian Bittorf
67 Bytes reine POSIX-Shell: X = $ 1; während [$ X! = 0]; do Y = $ ((Y * 10 + X% 10)); X = $ ((X / 10)); done; echo $ Y
Bastian Bittorf
3

Ein bisschen spät aber

APL, 3

⍎⌽⍞

Wenn Sie auf einer Funktion bestehen

⍎∘⌽∘⍕
TwiNight
quelle
Es sieht so aus, als ob ich oben kein Duplikat finden konnte ... (da es auf der 2. Seite steht)
TwiNight
Ich bin traurig, dass niemand Brainfu * k oder Whitespace-Lösung gab :( (eine weitere Stimme und Sie sind auf der ersten Seite)
Kiril Kirov
@KirilKirov Ich habe eine brainfu * k-Lösung: codegolf.stackexchange.com/a/32826/24829
rpax
3

Mathematica, 14 Bytes

IntegerReverse

Dies ist kein Wettbewerb, da diese Funktion erst in der Version 10.3 der letzten Woche hinzugefügt wurde, aber der Vollständigkeit halber dachte ich, ich würde die einzige (ich denke?) Funktion hinzufügen, die für diese Aufgabe eingebaut ist.

Martin Ender
quelle
2

In Java können Sie Folgendes tun. Beachten Sie, dass dies in String und zurück konvertiert wird und keine mathematische Lösung ist.

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));
    }
}
Sieger
quelle
2
Es ist eine mathematische Lösung. Mathematik ist keine Zahl, keine Arithmetik. Mathematik befasst sich auch mit Zeichenfolgen. In diesem speziellen Fall handelt es sich bei der Konvertierung von und nach Zeichenfolge lediglich um eine Konvertierung von und nach Basis 10.
R. Martinho Fernandes
Was ich unter "keine mathematische Lösung" verstehe, ist, dass wir selbst keine Mathematik machen. Die Methoden erledigen die gesamte Syntaxanalyse und Mathematik für uns. Im Gegensatz zu zB Kiril Kirovs Antwort.
Victor
Will Overflow ...
st0le
2

Lua

Zahlen und Zeichenfolgen sind austauschbar, das ist also trivial

string.reverse(12345)
Alex
quelle
2

Dieser nimmt WIRKLICH eine Eingabe entgegen, im Gegensatz zu einigen anderen:

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

Python übrigens

Exelian
quelle
2

Actionscript

43 Zeichen. num als Parameter für die Funktion:

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

Groovy

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

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

Perl, 11 Zeichen

Damit pdies funktioniert, wird das Flag benötigt, das in der Zählung enthalten ist.

Verwendung:

$ echo 76543 | perl -pE '$_=reverse'
Zaid
quelle
Ich zähle 10 Zeichen
F. Hauri
Die pFlagge ist in der Zählung enthalten
Zaid
2

Clojure (42 Zeichen)

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

Anwendungsbeispiel:

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

gibt 12389 zurück

Omar
quelle
2

Common Lisp - 60 Zeichen

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

bekommst du 9724.

Chris Zimmerman
quelle
Warum (first(list? parse-integergibt die Nummer bereits zurück.
Florian Margaine
2

K, 3 Bytes:

.|$

Evaluieren Sie ( .) die Umkehrung ( |) des Umwandelns in einen String ( $).

Anwendungsbeispiel:

  .|$76543
34567
JohnE
quelle
2

rs , 20 bytes

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

Technisch gesehen zählt das nicht (rs wurde früher in diesem Jahr erstellt), aber ich habe keine anderen auf Regex basierenden Antworten gesehen, und ich fand das ordentlich.

Live-Demo.

Erläuterung:

#

Fügen Sie ein Pfundzeichen am Anfang der Zeichenfolge ein. Dies wird als Marker verwendet.

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

Stellen Sie das letzte Zeichen der Hauptzeichenfolge fortlaufend in den Bereich vor der Markierung, bis keine Zeichen mehr übrig sind.

#/

Entfernen Sie den Marker.

kirbyfan64sos
quelle
2

mIRC 4,45 (35 Bytes)

$regsubex(12,/(.)/g,$mid(\A,-\n,1))
Onkarjit
quelle