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


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


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

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.


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.


10

J - 6 caractères + variable

".|.":y

Où y est votre valeur.


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


8

PHP, 9 caractères

(int)strrev(123);

Pour faire court où Nest une constante:

strrev(N)

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.


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.


7

Haskell, 28 24 caractères

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

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

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

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

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

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.


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

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


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

⍎∘⌽∘⍕

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.


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

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)

2

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

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

Python btw.


2

Actionscript

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

num.toString().split('').reverse().join('')

2

Sensationnel

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

assert r(1234) == 4321
assert r(345678987654567898765) == 567898765456789876543
assert r(345346457.24654654) == 45645642.754643543

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'

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


2

Lisp commun - 60 caractères

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

vous obtiendrez 9724.


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

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.


2

mIRC 4,45 (35 octets)

$regsubex(12,/(.)/g,$mid(\A,-\n,1))
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.