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


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


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

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.


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.


10

J - 6 Zeichen + Variable

".|.":y

Wo y ist dein Wert.


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

9

APL (3)

⍎⌽⍕

Verwendung:

⍎⌽⍕12345 => 54321

8

PHP, 9 Zeichen

(int)strrev(123);

Um es kurz zu machen, wo Nist eine Konstante:

strrev(N)

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.


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.


7

Haskell, 28 24 Zeichen

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

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

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

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

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

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.


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

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


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

⍎∘⌽∘⍕

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.


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

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)

2

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

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

Python übrigens


2

Actionscript

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

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 Zeichen

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

Verwendung:

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

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


2

Common Lisp - 60 Zeichen

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

bekommst du 9724.


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

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.


2

mIRC 4,45 (35 Bytes)

$regsubex(12,/(.)/g,$mid(\A,-\n,1))
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.