Manière la plus courte d'inverser un nombre

31

Écrivez une fonction (ou un sous-programme équivalent) pour accepter un seul argument de valeur entière et renvoyer une valeur (typée de manière similaire) trouvée en inversant l'ordre des chiffres de base 10 de l'argument.

Par exemple, étant donné 76543, retournez 34567

dmckee
la source
6
Revenez à l'époque où le nombre était une chaîne, puis inversez la chaîne
pmg
2
L'idée d'un «algorithme le plus court» est quelque peu spécieuse, surtout si vous autorisez «n'importe quelle langue». Imaginez un algorithme, et je vous donnerai une DSL avec un opérateur "~" approprié ...
3
Juste un avis: tout nombre se terminant par 0 devient un nombre de chiffres plus court lorsqu'il est inversé ...
powtac
44
Je connais un algorithme qui ne prend pas de temps du tout , mais qui ne fonctionne que sur les nombres palindromiques;)
schnaader
J'ai trouvé le temps de faire la réécriture moi-même. J'espère que cela restera le puzzle que Eltond voulait poser.
dmckee

Réponses:

85

HTML 21 7 caractères (1 caractère si je suis effronté ...)

‮n

remplacer npar votre numéro

Griffon
la source
1
C'est tout simplement du génie. J'irais pour un char. Ou 2, car il code en deux octets en UTF-16: P
tomsmeding
17
Hahaha J'ai fait une recherche Google sur cette balise et j'ai été récompensé par Your search -‮ - ne correspond à aucun document.
JoeFish
U pourrait essayer ce lien dans le navigateur:data:text/html,&%238238;egnahcxEkcatS olleH
F. Hauri
3
Drôle dans google transate aussi. @JoeFish: Je ne peux pas reproduire, veuillez poster un lien!
F. Hauri
1
@JoeFish Quand je regarde le commentaire, votre nom d'utilisateur est retourné et il y a du texte après. txet emos si ereH
Stefnotch
32

Python

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

MODIFIER:

Solution plus courte comme suggéré par @gnibbler:

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

ou, si ce qui précède n'est pas clair:

x=76543
int(`x`[::-1])
Vader
la source
4
s[::-1]est beaucoup plus rapide que''.join(reversed(s))
riza
4
Vous pouvez utiliser des backticks (pour repr) au lieu d'utiliser str
gnibbler
@gnibbler Merci pour la suggestion. J'ai mis à jour ma réponse.
Vader
2
TBH, ce n'est pas une fonction / procédure / quoi que vous vouliez l'appeler, et les spécifications l'exigent.
Thomas Eding
De plus, il n'accepte même pas de valeur ...
Exelian
28

Universel ( indépendant du langage / indépendant )

Si vous souhaitez utiliser uniquement des nombres (évitez de convertir le nombre en chaîne) et ne souhaitez pas utiliser une bibliothèque spécifique (pour être universelle pour n'importe quelle langue):

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

C'est du python, mais cela pourrait être fait dans n'importe quel langage, car c'est juste une méthode mathématique.

Kiril Kirov
la source
Si vous remplacez modpar %, c'est Python valide;)
phihag
Vous avez raison, en fait :) 10x
3
Pas le plus court, mais le plus courant et le plus universel.
Kiril Kirov
3
y=y*10+x%10....
st0le
1
BrainFuck ne le fait pas, bien qu'il puisse être calculé. Toute langue qui ne l'a pas peut utiliser à la a - (n * int(a/n))place de a mod n. De plus, si vous regardez ici , l'opération de module est implémentée différemment dans chaque langue. (Voir le tableau à droite.)
mbomb007
13

Perl 6

+$n.flip

ou:

$n.flip

pour le code tapé dynamiquement.

Les nombres ont obtenu des méthodes de chaîne en raison de la conception du langage.

Ming-Tang
la source
10

J - 6 caractères + variable

".|.":y

Où y est votre valeur.

MPelletier
la source
2
En fonction: |.&.":"reverse under do" qui est à peu près une traduction littérale de la tâche.
FireFly
9

APL (3)

⍎⌽⍕

Usage:

⍎⌽⍕12345 => 54321
marinus
la source
8

PHP, 9 caractères

(int)strrev(123);

Pour faire court où Nest une constante:

strrev(N)
powtac
la source
8

Befunge (3 personnages)

Programme exécutable complet:

N.@

Nest ton numéro. Les règles disent "accepter un seul argument de valeur entière "; Dans Befunge, vous ne pouvez saisir que des entiers de 0 à 9.

Daniero
la source
3
Ce sont les seuls littéraux , mais d'autres chiffres pourraient certainement être représentés. Sinon, la réponse gagnante serait Brainfuck avec le programme vide. ;-)
FireFly
8

Indépendant de la langue / mathématiques

Inspiré par la réponse de Kiril Kirov ci-dessus. Je suis devenu curieux de connaître les propriétés mathématiques de l'inversion d'un nombre, j'ai donc décidé d'enquêter un peu.

Il s'avère que si vous tracez la différence n - rev(n)pour les nombres naturels ndans une base r, vous obtenez des modèles comme celui-ci ( (n - rev(n)) / (r - 1), pour r=10, encapsulé dans les rcolonnes, le rouge indique un nombre négatif):

tableau des différences

Cette séquence pourrait être générée en tant que telle (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)

Si vous stockez ces valeurs dans une liste / tableau, n - arr[n]vous obtiendrez alors la forme inversée de n. Maintenant, pour "jouer au golf mathématiquement", nous voudrions idéalement une expression de forme fermée qui nous donne la valeur n: e dans la séquence, afin que nous puissions avoir une expression de forme fermée pour résoudre la tâche entière. Malheureusement, je n'ai pas pu trouver une telle expression ... mais il semble que cela devrait être possible. :(

Donc oui, pas tant un golf de code qu'une curiosité mathématique, mais s'il y a une expression sous forme fermée de la séquence ci-dessus, cela pourrait en fait être utile dans les soumissions de golf PL appropriées.

Luciole
la source
7

Haskell, 28 24 caractères

f=read.reverse.show.(+0)
hammar
la source
2
Et alors f=read.reverse.show.(+0)?
FUZxxl
2
(+0): Homme légitime! Bien que techniquement, vous n'ayez pas besoin du .(+0)tout, car ce fserait plus polymorphe que ce que le problème nécessite (il est permis de renvoyer une sortie de type similaire). Je raserais ces 5 personnages.
Thomas Eding
7

Vim

17 caractères

:se ri<CR>C<C-R>"
Eric Fortis
la source
Je dirais que c'est 10 caractères (frappes) si vous tapez la commande directement dans vim. Btw, j'ai appris quelque chose de nouveau dans vim aujourd'hui, merci :)
daniero
6

Scala - 33 caractères

def r(a:Int)=(a+"").reverse.toInt
Lalith
la source
1
+1 pour scala, agréable de voir autre chose que python / ruby ​​/ perl
lhk
Cela échouera sur Int négatif. -123 devrait revenir -321
samach
6

Rubis (14)

x = 13456
x.to_s.reverse
corsé
la source
3
"non" n'est pas défini. Je pense que vous vouliez mettre "x" là.
David Rivers
3
123456.to_s.reverse est encore plus court.
Steffen Roller
@mmdemirbas - merci d'avoir corrigé la faute de frappe
bodacious
3
Doit être .to_s.reverse.to_iconforme aux spécifications.
histocrate
Un nombre commençant par 0 ne semble pas fonctionner. 0112.to_s.reverse.to_i => 47
Joel
5

Il est possible de convertir un nombre en chaîne, puis d'inverser la chaîne, puis de reconvertir cette chaîne en nombre. Ce type de fonctionnalité est probablement disponible dans toutes les langues. Si vous recherchez une méthode plus mathématique, cela peut vous aider:

int n = 76543;
int r = 0;

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

la source
5
Le mien est absolument le même (:
Oui, la seule différence est que votre code ressemble à Python.
Cette méthode déborde sur les langues avec une précision limitée. try1111111119
st0le
5

Python 3+

Forme de fonction: 28 caractères

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

Formulaire (sous) programme: 25 caractères

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

Je considère que certains des autres exemples Python trichent, ou du moins pas cher, en raison de l'utilisation d'une entrée codée en dur et / ou ne répondant pas pleinement aux exigences.

COUP
la source
5

Golfscript, 5 caractères

`-1%~

Cela prend un argument sur la pile et laisse le résultat sur la pile. J'exploite l'option "subprogram" dans la spécification: si vous insistez sur une fonction, c'est quatre caractères de plus en la laissant sur la pile:

{`-1%~}:r
Peter Taylor
la source
Je pense que vous avez dû vouloir dire `-1%~plutôt que `-1$~(et j'ai pris la liberté de modifier votre réponse pour le dire).
Ilmari Karonen
5

Dans le script shell:

  echo "your number"|rev

J'espère que cela vous a été utile :)

tusharmakkar08
la source
bon! ne savait pas que bash était capable de ça aussi!
Pranit Bauva
1
Je suppose que, techniquement , il ne retourne un « numéro » de la même typé ... pourrait être encore raccourci avec rev<<<yournumber, par exemple rev<<<132(pour bash / zsh, et non par Posix si)
FireFly
1
Juste revsuffit, la question ne dit pas qu'il doit être une fonction. Vous pouvez comparer revà une fonction intégrée, même si elle n'en est pas une.
nyuszika7h
ceci n'est pas valide: 'rev' n'est pas un programme intégré, mais un appel de programme externe.
Bastian Bittorf
Shell POSIX pur de 67 octets: X = $ 1; tandis que [$ X! = 0]; do Y = $ ((Y * 10 + X% 10)); X = $ ((X / 10)); done; echo $ Y
Bastian Bittorf
3

Un peu tard mais

APL, 3

⍎⌽⍞

Si vous insistez sur une fonction

⍎∘⌽∘⍕
TwiNight
la source
On dirait bien que je n'ai pas repéré de doublon ci-dessus ... (car il est sur la 2e page)
TwiNight
Je suis triste, que personne n'ait donné brainfu * k ou solution d'espace blanc :( (un vote de plus et vous êtes sur la première page)
Kiril Kirov
@KirilKirov J'ai une solution brainfu * k: codegolf.stackexchange.com/a/32826/24829
rpax
3

Mathematica, 14 octets

IntegerReverse

Ce n'est pas concurrent, car cette fonction n'a été ajoutée que dans la version 10.3 de la semaine dernière, mais pour être complet, j'ai pensé ajouter la seule (jamais je pense?) Intégrée pour cette tâche.

Martin Ender
la source
2

Vous pouvez effectuer les opérations suivantes en Java. Notez que cela se convertit en chaîne et en arrière et n'est pas une solution mathématique.

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));
    }
}
Victor
la source
2
C'est une solution mathématique. Les mathématiques ne sont pas des nombres, ce n'est pas de l'arithmétique. Les mathématiques traitent également des chaînes de symboles. Et dans ce cas particulier, la conversion vers et depuis la chaîne est juste une conversion vers et depuis la base-10.
R. Martinho Fernandes
Ce que je voulais dire par «pas une solution mathématique», c'est que nous ne faisons pas de maths nous-mêmes. Les méthodes font toute l'analyse et les mathématiques pour nous. Par opposition à, par exemple, la réponse de Kiril Kirov.
Victor
Will Overflow ...
st0le
2

Lua

Les nombres et les chaînes sont interchangeables, c'est donc trivial

string.reverse(12345)
Alex
la source
2

Celui - ci EFFECTIVEMENT prend une entrée, contrairement à certains des autres:

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

Python btw.

Exelian
la source
2

Actionscript

43 caractères. num comme paramètre de la fonction:

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

Sensationnel

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

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

Perl, 11 caractères

Le pdrapeau est nécessaire pour que cela fonctionne, inclus dans le décompte.

Usage:

$ echo 76543 | perl -pE '$_=reverse'
Zaid
la source
Je compte 10 caractères
F. Hauri
Le pdrapeau est inclus dans le décompte
Zaid
2

Clojure (42 caractères)

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

Exemple d'utilisation:

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

renvoie 12389

Omar
la source
2

Lisp commun - 60 caractères

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

vous obtiendrez 9724.

Chris Zimmerman
la source
Pourquoi (first(list? parse-integerrenvoie déjà le numéro.
Florian Margaine
2

K, 3 octets:

.|$

Évaluez ( .) l'inverse ( |) de la conversion en chaîne ( $).

Exemple d'utilisation:

  .|$76543
34567
JohnE
la source
2

rs , 20 octets

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

Techniquement, cela ne compte pas (rs a été créé plus tôt cette année), mais je n'ai vu aucune autre réponse basée sur des expressions rationnelles, et j'ai pensé que c'était bien.

Démo en direct.

Explication:

#

Insérez un caractère dièse au début de la chaîne. Ceci est utilisé comme marqueur.

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

Ajoutez continuellement le dernier caractère de la chaîne principale à la zone avant le marqueur jusqu'à ce qu'il ne reste plus de caractères.

#/

Retirez le marqueur.

kirbyfan64sos
la source
2

mIRC 4,45 (35 octets)

$regsubex(12,/(.)/g,$mid(\A,-\n,1))
onkarjit
la source