Это харшадский номер Харди-Рамануджана?


16

Фон

Число 1729 - это число Харди-Рамануджана. Удивительное свойство этого было открыто С. Рамануджаном (которого многие считают величайшим индийским математиком 1 ), когда Г.Х. Харди посетил его в больнице. По словам самого Харди:

Я помню, как однажды увидел его, когда он был болен в Путни. Я ехал в такси № 1729 и заметил, что номер мне показался довольно скучным, и я надеялся, что это не было предзнаменованием. «Нет, - ответил он, - это очень интересное число; это наименьшее число, которое можно выразить как сумму двух кубов двумя разными способами».

Кроме того, у него есть много других удивительных свойств. Одним из таких свойств является то, что это число Харшада, то есть сумма его цифр (1 + 7 + 2 + 9 = 19) является его фактором. Это тоже особенный. Как показал Масахико Фудзивара, 1729 - это положительное целое число, которое, когда его цифры складываются вместе, дает сумму, которая при умножении на ее обращение дает исходное число:

1 + 7 + 2 + 9 = 19

19 × 91 = 1729

Положительное целое число , имеющее такое свойство является то , что я определяю как Харди-Ramanujan- ISH Харшад номер, с целью этого поста. (Для этого может быть технический термин, но я не смог его найти, если он не член A110921 )


Задание

Учитывая положительное целое число в nкачестве ввода, вывода значения truthy или falsey в зависимости от того входного nявляется Харди-Ramanujan- ISH Харшад номер. Вывод правда, если это так. В противном случае выведите фальси.

Обратите внимание , что только четыре Харди-Ramanujan- ISH существует число харшада ( 1, 81, 1458и 1729), и вы можете написать код , который проверяет эквивалентность с ними. Но я не думаю, что это будет весело.


вход

Ваша программа должна принимать положительное целое число (другими словами, натуральное число). Это может быть принято любым способом, кроме предположения, что он присутствует в переменной. Чтение из модального окна, поля ввода, командной строки, файла и т. Д. Разрешено. Также возможно использование ввода в качестве аргумента функции.


Выход

Ваша программа должна выдавать истинное или ложное значение. Они не должны быть последовательными. Ваша программа может выводить любым способом, кроме записи выходных данных в переменную. Запись на экран, в командную строку, файл и т. Д. Разрешена. Вывод с функцией также returnдопускается.


Дополнительные правила

  • Вы не должны использовать встроенный для выполнения задачи (интересно, что любой язык будет иметь такой встроенный, но тогда Mathematica ... )

  • Стандартные лазейки применяются.


Тестовые случаи

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

Критерий победы

Это , поэтому выигрывает самый короткий код в байтах!


1 Каждый год 22 - го декабря, в день рождения Сриниваса Рамануджане, Национальный день Математика наблюдается в Индии. Его коллеги в Кембридже сравнивали его с Якоби, Эйлером и даже Ньютоном. Помимо того, что он был настолько велик, у него почти не было формальной подготовки по чистой математике , но он все же внес важный вклад в математический анализ , теорию чисел , бесконечные ряды и непрерывные дроби . К сожалению, он умер в раннем возрасте 32 лет с тысячами математических открытий в его памяти. На нем также был снят фильм , основанный на его биографии ,Человек, который знал бесконечность .


4
«но вы не должны писать код, который проверяет эквивалентность с ними». Это ненаблюдаемое требование к программе .
Мартин Эндер

@MartinEnder Но тогда это будет просто число, равное 1729, 1458, 81 или 1 . Я не думаю, что это будет весело.
Арджун

2
Почему отрицательные?
Арджун

Доказательство: максимальная цифровая сумма числа с n цифрами составляет 9n. Реверс 9n будет максимум 90n. Таким образом, произведение должно быть не более 810n ^ 2, которое должно иметь n цифр, поэтому оно должно быть не менее 10 ^ (n-1). Когда n = 7, это в значительной степени сделано, поэтому нужно проверить только до 999999.
Leaky Nun

6
Я думаю, вы должны просто разрешить проверку на эквивалентность с ними. Такого рода ответы в любом случае будут иметь отрицательные последствия, а в некоторых случаях, вероятно, будут более продолжительными.
Okx,

Ответы:


12

Нейм , 5 байт

𝐬D𝐫𝕋𝔼

Объяснение:

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

Попытайся!


Остальные 4 байта непечатаемые? Я считаю 1 байт
GamrCorps

1
@GamrCorps Кажется, они не поддерживаются вашим браузером. Вот изображение: puu.sh/wpETt/9f92af18e0.png
Okx,

1
Здорово, но 5 байтов в какой кодировке? :-) Из 5 символов здесь 𝐬 (U + 1D42C МАТЕМАТИЧЕСКИЙ ЖИРНЫЙ МАЛЫЙ S) , 𝐫 (U + 1D42B МАТЕМАТИЧЕСКИЙ ЖИРКИЙ МАЛЫЙ R) , 𝕋 (U + 1D54B МАТЕМАТИЧЕСКИЙ ДВОЙНОЙ СТРУКТУРА КАПИТАЛ T) и 𝔼 (U + 1D53C МАТЕМАТИЧЕСКИЙ ДВОЙНОЙ СТРОИТЕЛЬНЫЙ КАПИТАЛ E) каждый занимает 4 байта в UTF-8 (также в UTF-16 и (очевидно) в UTF-32). Так что на самом деле это 17 байт, хотя я думаю, что можно определить пользовательскую кодировку, оптимизированную для ASCII + эти символы.
ShreevatsaR

3
@ShreevatsaR Нейм, похоже, использует свою собственную кодовую страницу
The_Lone_Devil

@The_Lone_Devil Ах, это бы объяснило, спасибо!
ShreevatsaR

15

ArnoldC, 888 байт

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

Я знаю, я просто проверяю равенство, но это не должно быть забавной частью программы.

Приятного чтения. :)

Добавлены некоторые новые строки для удобства чтения:

Попробуйте онлайн


6
Ты мне нравишься. Вот почему я собираюсь убить тебя в последний раз.
Дэвид Конрад

12

Сборка x86, 55 35 33 31 байт:

Предполагается ABI, где возвращаемое значение находится в EAX, а параметры помещаются в стек ... так что почти все из них.

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 байт

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

Попробуйте онлайн!

В основном разбивается на массив цифр, объединяется с +этим выражением и убирает его, чтобы в основном суммировать цифры. string*stringавтоматически преобразует строки в целые. Принимает ввод в виде строки



2

Рубин, 69 байт

Сначала попробуйте с целым числом в качестве входных данных:

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

Вторая попытка со строкой в ​​качестве ввода:

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

.split('')может быть сделано.chars
Конор О'Брайен

2

Пакет, 164 байта

@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

Печатает 1 в случае успеха, нет вывода при ошибке.


2

JavaScript (ES6), 72 байта

Это действительное представление ES6. Добавить f=в начале и вызвать как f(arg).

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

Тестовый фрагмент:

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


Как я недавно узнал, сразу же ответить на ваш собственный вызов.
Лохматый

@ Шэгги Но верно.
Okx,

3
И я обычно принижаю тех, кто не заботится о сообществе.
Дрянная монахиня

1
@ Ок, не в соответствии с людьми, которые сразу же понизили голос и ругали меня за это. Мы должны быть последовательными в том, разрешена ли эта практика.
Лохматый

3
Я думаю, это потому, что это дает эмблеме конкурса несправедливое преимущество во времени, поскольку возможно, что они могут составить задачу, решить ее и затем опубликовать.
полностью человек

2

Котлин, 111 108 байт

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

Попробуйте онлайн!

Как это типично для статически скомпилированных JVM-решений, много байтов теряется только при объявлении основной функции и при вызове print (). Основная часть функции - 60-байтовые байты, что совсем неплохо для статически типизированного языка общего назначения, такого как Kotlin.

Kotlin, буровой раствор, 69 байт

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

Попробуйте онлайн!



1

Python 2 , 55 байт

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

Попробуйте онлайн!

объяснение

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

eval()Решение является бит 2 байта больше ...

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

Альтернативное (недействительное?) Решение, 42 29 байт

Это решение проверяет равенство всех чисел.

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

Попробуйте онлайн!


Альтернативное альтернативное решение, той же длины:[1,81,1458,1729].__contains__
musicman523


1

NewStack , 16 байт

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

Разбивка:

Используя 1729 в ​​качестве примера

ḟᵢ                 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]

Ничего не печатает, если false, и исходный ввод, если true.


Умножьте стек на функцию . Я этого не понял. Означает ли это вход?
Арджун

Да и нет, после ¹, стек состоит из [1]. И так как мы определили fили f(x)равняем ваш вход, умножение каждого элемента в стеке на функцию fзаменяет 1наш вход. (Потому что [1] * f(x)= [f])
Гравитон

1

MATL , 11 байт

tV!UstVPU*=

Попробуйте онлайн!

t - принять данные и продублировать их

V!U - разбить его на отдельные цифры

s - суммировать эти цифры

t - продублируйте эту сумму

VP - превратить это в строку, переверните ее слева направо

U - превратить это обратно в число

* - умножить два последних значения (цифра-сумма и ее перевернутая версия слева направо)

= - проверьте, равен ли это исходному входу (который является единственным другим значением в стеке)








Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.