Est-ce un nombre Hardy-Ramanujan-Number-ish Harshad?


16

Contexte

Le nombre 1729 est le nombre Hardy-Ramanujan. Une propriété étonnante en a été découverte par S. Ramanujan (qui est largement considéré comme le plus grand mathématicien indien 1 ), lorsque GH Hardy lui a rendu visite dans un hôpital. Dans les propres mots de Hardy:

Je me souviens être allé le voir une fois quand il était malade à Putney. J'étais monté dans la cabine de taxi numéro 1729 et j'ai remarqué que le numéro me semblait plutôt terne et que j'espérais que ce n'était pas de mauvais augure. "Non," répondit-il, "c'est un nombre très intéressant; c'est le plus petit nombre exprimable comme la somme de deux cubes de deux manières différentes."

En plus de cela, il a de nombreuses autres propriétés étonnantes. L'une de ces propriétés est qu'il s'agit d'un nombre Harshad, c'est-à-dire que la somme de ses chiffres (1 + 7 + 2 + 9 = 19) en est un facteur. Cela aussi, spécial. Comme l'a montré Masahiko Fujiwara, 1729 est un entier positif qui, lorsque ses chiffres sont additionnés, produit une somme qui, multipliée par son inversion, donne le nombre d'origine:

1 + 7 + 2 + 9 = 19

19 × 91 = 1729

Un entier positif ayant un tel bien est ce que je définirais comme Hardy-Ramanujan- de Harshad Nombre, dans le but de ce post. (Il pourrait y avoir un terme technique pour cela, mais je ne l'ai pas trouvé, à moins qu'il ne soit membre de A110921 )


La tâche

Etant donné un entier positif ncomme entrée, la sortie d' une valeur de truthy ou Falsey sur la base de si l'entrée nest une Hardy-Ramanujan- de Harshad Nombre. Sortie véridique, si elle l'est. Sinon, sortez falsey.

Notez que seulement quatre Hardy-Ramanujan- ish nombre harshad existent ( 1, 81, 1458et 1729), et vous pouvez écrire du code qui vérifie l' équivalence avec eux. Mais je ne pense pas que ce sera amusant.


Contribution

Votre programme doit prendre un entier positif (un nombre naturel, en d'autres termes). Il peut le prendre de n'importe quelle manière sauf en supposant qu'il soit présent dans une variable. La lecture à partir de la fenêtre modale, de la zone de saisie, de la ligne de commande, du fichier, etc. est autorisée. Prendre l'entrée comme argument de fonction est également autorisé.


Production

Votre programme doit afficher une valeur true ou falsey. Ils n'ont pas besoin d'être cohérents. Votre programme peut sortir de n'importe quelle façon sauf écrire la sortie dans une variable. L'écriture sur l'écran, la ligne de commande, le fichier, etc. est autorisée. La sortie avec fonction returnest également autorisée.


Règles supplémentaires

  • Vous ne devez pas utiliser un intégré pour accomplir la tâche (je me demande si n'importe quelle langue aura un tel intégré, mais Mathematica ... )

  • Les échappatoires standard s'appliquent.


Cas de test

Input        Output
1            Truthy (because 1 × 1 (reverse of 1) = 1)
2            Falsey
3            Falsey
4            Falsey
5            Falsey
81           Truthy (because 9 (8 + 1) × 9 (reverse of 9) = 81)
1458         Truthy (because 18 (1 + 4 + 5 + 8) × 81 (reverse of 18) = 1458)
1729         Truthy (because 19 (1 + 7 + 2 + 9) × 91 (reverse of 19) = 1729)
1730         Falsey
2017         Falsey

Critère gagnant

C'est du , donc le code le plus court en octets gagne!


1 Chaque année, le 22 e Décembre, l'anniversaire de Srinivasa Ramanujan, la Journée nationale des mathématiques est observée en Inde. Ses collègues, ceux de Cambridge, le comparaient à Jacobi, Euler et même Newton. En plus d'être si grand, il n'avait presque aucune formation formelle en mathématiques pures , mais il a quand même apporté d'importantes contributions à l'analyse mathématique , à la théorie des nombres , aux séries infinies et aux fractions continues . Malheureusement, il est décédé à un âge précoce de 32 ans avec des milliers de découvertes mathématiques à l'esprit. Un film a également été réalisé sur lui, basé sur sa biographie ,L'homme qui connaissait l'infini .


4
"mais vous ne devez pas écrire de code qui vérifie leur équivalence." Il s'agit d'une exigence de programme non observable .
Martin Ender

@MartinEnder Mais alors ce sera juste le nombre égal à 1729, 1458, 81 ou 1 . Je ne pense pas que ce sera amusant.
Arjun

2
Pourquoi les downvotes?
Arjun

Preuve: la somme numérique maximale d'un nombre à n chiffres est 9n. L'inverse de 9n serait au maximum de 90n. Ainsi, le produit serait au maximum de 810n ^ 2, qui doit avoir n chiffres, il doit donc être d'au moins 10 ^ (n-1). Lorsque n = 7, c'est à peu près fait, il suffit donc de vérifier jusqu'à 999999.
Leaky Nun

6
Je pense que vous devriez simplement permettre de vérifier l'équivalence avec eux. Ce genre de réponses aurait de toute façon des votes négatifs et sera probablement plus long dans certains cas.
Okx

Réponses:


12

Neim , 5 octets

𝐬D𝐫𝕋𝔼

Explication:

Example input: 1729
𝐬      Implicitly convert to digit list and 𝐬um the digits [19]
 D     Duplicate [19, 19]
  𝐫    𝐫everse [19, 91]
   𝕋   mul𝕋iply [1729]
    𝔼  check for 𝔼quality with input [1]
Implicit output: 1

Essayez!


Les 4 autres octets ne sont-ils pas imprimables? Je compte 1 octet
GamrCorps

1
@GamrCorps Il semble qu'ils ne soient pas pris en charge par votre navigateur. Voici une image: puu.sh/wpETt/9f92af18e0.png
Okx

1
Nice, mais 5 octets dans quel encodage? :-) Des 5 caractères ici, 𝐬 (U + 1D42C MATHEMATICAL BOLD SMALL S) , 𝐫 (U + 1D42B MATHEMATICAL BOLD SMALL R) , 𝕋 (U + 1D54B MATHEMATICAL DOUBLE-STRUCK CAPITAL T) et 𝔼 (U + 1D53C MATHEMATICAL CAPITAL DOUBLE STRUCK E) occupent chacun 4 octets en UTF-8 (également en UTF-16 et en (évidemment) UTF-32). Il s'agit donc en fait de 17 octets, même si je suppose que l'on pourrait définir un codage personnalisé optimisé pour ASCII + ces caractères.
ShreevatsaR

3
@ShreevatsaR Neim semble utiliser sa propre page de codes
The_Lone_Devil

@The_Lone_Devil Ah ça pourrait l'expliquer, merci!
ShreevatsaR

15

ArnoldC, 888 octets

IT'S SHOWTIME
HEY CHRISTMAS TREE i
YOU SET US UP 0
GET YOUR ASS TO MARS i
DO IT NOW
I WANT TO ASK YOU A BUNCH OF QUESTIONS AND I WANT TO HAVE THEM ANSWERED IMMEDIATELY
HEY CHRISTMAS TREE a
YOU SET US UP 0
GET TO THE CHOPPER a
HERE IS MY INVITATION 1
YOU ARE NOT YOU YOU ARE ME i
ENOUGH TALK
HEY CHRISTMAS TREE b
YOU SET US UP 0
GET TO THE CHOPPER b
HERE IS MY INVITATION 81
YOU ARE NOT YOU YOU ARE ME i
ENOUGH TALK
HEY CHRISTMAS TREE c
YOU SET US UP 0
GET TO THE CHOPPER c
HERE IS MY INVITATION 1458
YOU ARE NOT YOU YOU ARE ME i
ENOUGH TALK
HEY CHRISTMAS TREE d
YOU SET US UP 0
GET TO THE CHOPPER d
HERE IS MY INVITATION 1729
YOU ARE NOT YOU YOU ARE ME i
ENOUGH TALK
HEY CHRISTMAS TREE res
YOU SET US UP 0
GET TO THE CHOPPER res
HERE IS MY INVITATION a
CONSIDER THAT A DIVORCE b
CONSIDER THAT A DIVORCE c
CONSIDER THAT A DIVORCE d
ENOUGH TALK
TALK TO THE HAND res
YOU HAVE BEEN TERMINATED

Je sais, je vérifie juste l'égalité, mais cela ne devrait pas être la partie amusante du programme.

Bonne lecture. :)

Ajout de quelques nouvelles lignes pour une meilleure lisibilité:

Essayez-le en ligne


6
Je vous aime bien. C'est pourquoi je vais te tuer en dernier.
David Conrad

12

Assemblage x86, 55 35 33 31 octets:

Suppose un ABI où la valeur de retour est en EAX et les paramètres sont poussés sur la pile ... donc presque tous.

00000000: 8B 44 24 04        mov         eax,dword ptr [esp+4]
00000004: 48                 dec         eax
00000005: 74 16              je          0000001D
00000007: 83 E8 50           sub         eax,50h
0000000A: 74 11              je          0000001D
0000000C: 2D 61 05 00 00     sub         eax,561h
00000011: 74 0A              je          0000001D
00000013: 2D 0F 01 00 00     sub         eax,10Fh
00000018: 74 03              je          0000001D
0000001A: 33 C0              xor         eax,eax
0000001C: C3                 ret
0000001D: 40                 inc         eax
0000001E: C3                 ret



4

JavaScript ES6, 59 57 octets

x=>(q=eval([...x].join`+`)+'')*[...q].reverse().join``==x

Essayez-le en ligne!

Se divise fondamentalement en tableau de chiffres, et se joint à +et évalue cette expression pour sommer essentiellement les chiffres. string*stringconvertira automatiquement les chaînes en pouces. Prend l'entrée sous forme de chaîne


2

Mathematica, 42 octets

(s=Tr@IntegerDigits@#)IntegerReverse@s==#&

2

Rubis, 69 octets

Essayez d'abord, avec un entier comme entrée:

->i{(x=i.to_s.split'').inject(0){|s,a|s+a.to_i}*(x[-1]+x[0]).to_i==i}

Deuxième essai, avec une chaîne en entrée:

->i{(x=i.split('').map &:to_i).inject(0,&:+)*(x[-1]*10+x[0])==i.to_i}

.split('')peut être fait.chars
Conor O'Brien

2

Lot, 164 octets

@set/an=%1,s=0
:s
@set/as+=n%%10,n/=10
@if %n% gtr 0 goto s
@set/an=s,r=0
:r
@set/ar=r*10+n%%10,n/=10
@if %n% gtr 0 goto r
@set/an=%1-r*s
@if %n%==0 echo 1

Imprime 1 en cas de succès, aucune sortie en cas d'échec.


2

JavaScript (ES6), 72 octets

Il s'agit d'une soumission ES6 valide. Ajoutez f=au début et invoquez comme f(arg).

n=>(y=[...`${n}`].reduce((c,p)=>+c+ +p))*[...`${y}`].reverse().join``==n

Extrait de test:

let f =

n=>(y=[...`${n}`].reduce((c,p)=>+c+ +p))*[...`${y}`].reverse().join``==n

console.log(1 + " -> " + f(1))
console.log(81 + " -> " + f(81))
console.log(1458 + " -> " + f(1458))
console.log(1729 + " -> " + f(1729))
console.log((randomNum = Math.floor(Math.random() * 10000) + 1) + " -> " + f(randomNum))


Comme je l'ai appris récemment, répondre immédiatement à votre propre défi est mal vu.
Shaggy

@Shaggy Mais valide.
Okx

3
Et je note généralement ceux qui ne se soucient pas de la communauté.
Leaky Nun

1
@Okx, pas selon les gens qui m'ont immédiatement déçu et réprimandé pour l'avoir fait. Nous devons être cohérents quant à savoir si cette pratique est autorisée ou non.
Shaggy

3
Je pense que c'est parce que cela donne à l'affiche du défi un avantage temporel injuste car il est possible qu'ils puissent inventer un défi, le résoudre et le poster.
2017 totalement humain

2

Kotlin, 111 108 octets

fun main(a:Array<String>)=print(a[0].sumBy{c->"$c".toInt()}.run{"${this*"$this".reversed().toInt()}"}==a[0])

Essayez-le en ligne!

Comme c'est généralement le cas pour les solutions JVM compilées statiquement, beaucoup d'octets sont perdus uniquement sur la déclaration de la fonction principale et l'appel à print (). La fonction de la fonction est de 60 octets, ce qui n'est pas mal du tout pour un langage à usage général typé comme Kotlin.

Kotlin, solution ennuyeuse, 69 octets

fun main(a:Array<String>)=print(a[0].toInt()in setOf(1,81,1458,1729))

Essayez-le en ligne!



1

Python 2 , 55 octets

def f(n):x=sum(map(int,`n`));return x*int(`x`[::-1])==n

Essayez-le en ligne!

Explication

def f(n):                           # define a function f that takes an argument n
    x = sum(                        # assign to x the sum of...
            map(int, `n`))          # ...the integer conversion of all elements in stringified n
    return x * int(                 # return True if x times the integer conversion of...
                   `x`[::-1])       # ...the stringified x reversed...
                              == n  # ...equals n

Une eval()solution est un peu plus longue de 2 octets ...

def f(n):x=eval('+'.join(`n`));return x*int(`x`[::-1])==n

Solution alternative (non valide?) , 42 29 octets

Cette solution vérifie l'égalité par rapport à tous les nombres.

lambda n:n in[1,81,1458,1729]

Essayez-le en ligne!


Solution alternative alternative, même durée:[1,81,1458,1729].__contains__
musicman523


1

NewStack , 16 octets

ḟᵢ¹f YΣ©Eᴙx| ∏=f

La répartition:

Utiliser 1729 comme exemple

ḟᵢ                 Define new function equal to input.               []
  ¹                Add 1 to stack.                                   [1]
   f               Multiply stack by the function.                   [1729]
     Y             Split the stack into digits.                      [1,7,2,9]
      Σ            Sum the stack.                                    [19]
       ©           Duplicate stack.                                  [19,19]
        E  |       Define new value for the first element            [19,19]
         ᴙx        Reverse first element.                            [91,19]
             ∏     Take the product.                                 [1729]
              =f   Remove from stack if not equal to the function.   [1729]

N'imprime rien si faux et l'entrée d'origine si vrai.


Multipliez la pile par la fonction . Je n'ai pas compris ça. Est-ce à dire l'entrée?
Arjun

Oui et non, après ¹, la pile se compose [1]. Et puisque nous avons défini fou f(x)pour égaler votre entrée, multiplier chaque élément de la pile par la fonction fremplace essentiellement le 1par notre entrée. (Parce que [1] * f(x)= [f])
Graviton

1

MATL, 11 bytes

tV!UstVPU*=

Try it online!

t - take input and duplicate it

V!U - split it into individual digits

s - sum those digits

t - duplicate that sum

VP - transformez cela en chaîne, retournez-le de gauche à droite

U - transformer cela en un nombre

* - multiplier les deux dernières valeurs (la somme des chiffres et sa version inversée de gauche à droite)

= - check if this is equal to the original input (which is the only other value in stack)








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.