Знайдіть найменше додатне ціле число, яке закінчується на n, ділиться на n і цифри якого дорівнюють n


33

Це все в назві ...

Візьміть як вхід додатне ціле число n>=12і ... зробіть те, що говорить заголовок.

Так, це на OEIS A187924 .

Деякі тестові випадки

12 -> 912  
13 -> 11713  
14 -> 6314  
15 -> 915  
16 -> 3616  
17 -> 15317  
18 -> 918  
19 -> 17119 
20 -> 9920  
40 -> 1999840   
100-> 99999999999100

Це . Найкоротший код у байтах виграє!


Коментарі не для розширеного обговорення; ця розмова перенесена в чат .
Мартін Ендер

Щоб закрити частину того, що було переміщено до чату: моя редакція в OEIS, що свідчить про те, що 11 є єдиним номером без рішення, щойно було затверджено.
Ørjan Johansen

Відповіді:


19

Befunge, 81 байт

&>00p0v<!%g0<
v%"d":_>1+:0^
>00g->#^_:0v
0g10g-#^_.@1>
>0p:55+/\:v>
^1+g01%+55_$^

Спробуйте в Інтернеті!

Можна обробляти до n = 70 принаймні, після чого деякі значення почнуть переповнювати розмір комірки стека для більшості реалізацій, а для тих, що цього не роблять, це займе стільки часу, що не варто чекати, щоб дізнатися це.

Враховуючи ці обмеження, ми навіть не турбуємось, намагаючись обробити значення n більше 99, а це означає, що ми можемо легше перевірити, чи закінчується значення n на простому порівнянні значення модуля 100 з n .

Нижче детальніше розбиття коду.

Source code with execution paths highlighted

*Прочитайте n від stdin і збережіть у пам'яті.
*Ініціалізуйте тестове значення v до 0 та запустіть основну петлю, збільшуючи v передню частину.
*Перевірте, якщо v%n == 0і якщо не повернутися до початку основної петлі.
*Перевірте, якщо v%100 == nі якщо не повернутися до початку основної петлі.
*Підсумовуйте цифри v v , багаторазово додаючи v modulo 10 і діляючи v на 10.
*Перевірте, чи сума дорівнює n , а якщо не повертається до початку основної петлі.
*В іншому випадку виведіть v та вихід.


12

05AB1E , 14 байт

[NI«ÐIÖsSOIQ*#

Спробуйте в Інтернеті!

Пояснення

Рішення, які потребують великих префіксів, на TIO вичерпаються

[                # start a loop
 NI«             # append input to current iteration number
    Ð            # triplicate
     IÖ          # is the first copy evenly divisible by input?
       sSOIQ     # is the digit sum of the second copy equal to the input?
            *    # multiply
             #   # if true, break loop
                 # output the third copy

Якщо ви відчуваєте, ніби 05AB1E обманює, бо це так добре. Єдиний спосіб подолати це за милю - це зробити мову програмування «стиснення», що посилається на минулу мову. Я подаю ans = dic [1] lol
Pathfinder

@Pathfinder: Є кілька мов, які можуть постійно перемогти 05AB1E, тому ми все ще можемо сподіватися побачити щось ще коротше :)
Emigna

12

JavaScript (ES6), 55 54 байти

f=(s,p=0,a=p+s)=>a%s|eval([...a].join`+`)-s?f(s,p+1):a
<input type=number min=12 oninput=o.textContent=f(this.value)><pre id=o>

Вводиться як рядок. Для більших результатів потрібен браузер із підтримкою рекурсії хвоста. Редагувати: Збережено 1 байт завдяки @Arnauld.


eval([s,...a].join`-`)?також буде працювати, хоча це не коротше ...
ETHproductions

@Arnauld Ні, я просто забув, що можу це зробити ||.
Ніл

8

Brachylog v2, 12 10 байт

a₁.;A×?≜ẹ+

Спробуйте в Інтернеті!

Це подання функції, яке приймає вхід через .і виробляє вихід через ?(протилежне звичайній умові; всі функції Brachylog мають рівно два аргументи, які можуть бути вхідними або вихідними аргументами, але мова не примушує конкретного використання аргументу). Ми , як правило, не вважаємо умовами використання аргументів релевантними в PPCG .

Пояснення

Попередня версія цього рішення мала особливий випадок ( Ḋ|тобто "повернути цифри буквально") для однозначних цифр, але в питанні, мабуть, зазначено, що вам не потрібно перевіряти це (дякую @DLosc, що це зробив), тому я видалив це. (Написане рішення не буде працювати з однозначними цифрами, оскільки Брахілог не розглядає 1 як можливість для невідомого у множенні, щоб запобігти нескінченним циклам; його множення є довільною цілістю.)

Тож ця відповідь зараз стосується майже прямого перекладу специфікації. Починаючи з ?(вихід / число, яке ми намагаємося знайти; предикат Brachylog завжди неявно починається з ?), ми використовуємо, a₁.щоб стверджувати, що він .(вхід) є суфіксом. Тоді ;A×?означає, що ми можемо помножити ( ×) результат на щось ( ;A), щоб отримати ?(вихід). Нарешті, ẹ+підсумовує ( +) цифри ( ) ?та, за замовчуванням, неявне твердження в кінці кожної програми Brachylog, що дає кінцевий результат .. Іншими словами, ця програма " .є суфіксом ?, .помноженим на щось є ?, .це цифра суми?", що дуже близьке до буквального перекладу оригінальної програми.

Необхідно вимога цифри суми повинні бути виконано. Я припускаю, що щось не подобається невідомим, тому підказує Брахілогу використовувати грубу силу підходу для цієї частини програми, а не алгебри.


6

Haskell , 72 байти

f n=[x|x<-[n,n+lcm n(10^length(show n))..],sum[read[j]|j<-show x]==n]!!0

Спробуйте в Інтернеті!

Зауважте, що знайдене число мінус n повинно бути кратним і n, і 10 ^ довжині (n).

Натхненний Лайконі і абсолютнолюдський


Ласкаво просимо на сайт!
DJMcMayhem

3
Перехід lcm n(10^length(show n))на lcm(10^length(show n))n1 байт
H.PWiz

6

Аліса , 35 байт

/o
\i@/!w?+.?~\ & /-$K..?\ L z $ /K

Спробуйте в Інтернеті!

Пояснення

Ця програма по-справжньому приємно поєднує та взаємодіє між режимом Cardinal (ціла обробка) та Ordinal (обробка рядків).

Звичайна основа для викликів з десятковим введенням-виведенням, які працюють в основному в кардинальному режимі:

/o 
\i@/...

І власне програма:

!     Store the input N on the tape.
      We'll use an implicit zero on top of the stack as our iterator variable X,
      which searches for the first valid result.
w     Store the current IP position on the return address stack. This marks
      the beginning of the main search loop. We can avoid the divisibility
      test by going up in increments of N. To check the other two 
      conditions, we'll use individual conditional loop ends that skip to 
      the next iteration. Only if both checks pass and all loop ends are 
      skipped will the search terminate.

  ?+    Increment the iterator X by N.
  .     Duplicate X.
  ?~    Put a copy of N underneath.
  \     Switch to Ordinal mode.
  &     Implicitly convert X to a string, then fold the next command over its
        characters, i.e. its digits. Here, "fold" means that each character
        is pushed to the stack in turn, followed by one execution of that
        next command.
  /     Switch back to Cardinal mode (this is not a command).
  -     Fold subtraction over the digits. This implicitly converts each 
        digit back to its numerical value and subtracts it from N. If the
        digit sum of X is equal to N, this will result in 0.
  $K    Jump back to the w if the digit sum of X isn't N.
  ..    Duplicate X twice.
  ?     Get a copy of N.
  \     Switch to Ordinal mode.
  L     Shortest common superstring. Implicitly converts X and N to strings
        and gives the shortest string that starts with X and ends with N. 
        This will be equal to X iff X already ends with N. Call this Y.
  z     Drop. If X contains Y, this deletes everything up to and including
        Y from X. This can only happen if they are equal, i.e. if X ended
        with N. Otherwise X remains unchanged.
  $     Skip the next command if the string is empty, i.e. if X ended with N.
  /     Switch back to Cardinal mode.
  K     Jump back to w if X didn't end with N.

5

Java (OpenJDK 8) , 136 110 103 92 байт

-26 завдяки JollyJoker

-7 знову завдяки JollyJoker

-11 завдяки Оліверу Грегуару

a->{for(int i=a;!(""+a).endsWith(""+i)|i!=(""+a).chars().map(x->x-48).sum();a+=i);return a;}

Спробуйте в Інтернеті!

Треба любити Java! Цілком може бути, що я використовую неефективний підхід, але не маю вбудованої функції контрольної суми та подвійного перетворення в String, щоб перевірити на кінець кількості байтів витрат ...

Безголівки:

  a->{                                                       //input n (as integer)
      for (int i = a;                                        //initiate loop
           !("" + a).endsWith("" + i)                        //check if the calculated number ends with the input
           | i != ("" + a).chars().map(x -> x - 48).sum();   //check if the checksum is equal to the input
           a += i)                                           //for every iteration, increase i by the input to save checking for divisibility
        ;                                                    //empty loop body, as everything is calculated in the header
    return a;                                                //return number
}

1
(""+i).endsWith(""+a)повинні працювати.
JollyJoker

@JollyJoker блискучий, дякую за те, що я почувався дурним: P
Лука H

1
Хе. n/=10замість n=n/10теж. Крім того, i+=aв циклі for, щоб ви могли пропустити перевірку на роздільність.
JollyJoker

@JollyJoker Ух, я зробив це за суму, але не для поділу ... Дякую, скоро додам
Лука H

1
92 байти , використовуючи API, коротше, ніж самостійно обчислювати. Крім того, крапка з комою не є частиною побічного рахунку, тому що дійсна лямбда може бути вказана як аргумент методу, наприклад, і тоді вам не потрібна крапка з комою.
Олів'є Грегоар

4

Математика, 72 байти

(t=#;While[Mod[t,10^IntegerLength@#]!=#||Tr@IntegerDigits@t!=#,t+=#];t)&  

-18 байт від @MartinEnder

Спробуйте в Інтернеті!

Ось ще одна версія Мартіна Ендера.
Цей підхід може досягти n=40(41 перевищує ліміт ітерації за замовчуванням)

Математика, 65 байт

#//.t_/;Mod[t,10^IntegerLength@#]!=#||Tr@IntegerDigits@t!=#:>t+#&

Спробуйте в Інтернеті!


3

Python 2 , 74 байти

Це рішення передбачає, що n <= sys.maxint.

n=x=input()
while sum(map(int,str(x)))-n*str(x).endswith(`n`):x+=n
print x

Спробуйте в Інтернеті!


Замінити str(x)з xв бек-тики два рази , щоб зберегти 6 байт (як ви біжите назад кліщ в бек-тики?).
Час Браун

@ChasBrown `зворотний косий галочку всередині задньої панелі .
wvxvw

@ChasBrown ні, що стосується довгих цілих чисел, які додали б додаток, Lщо може зіпсувати алгоритм.
FlipTack

3

C (gcc) 71 69 байт, не відповідає 100

Я намагався з long і% 1000, але час вийшов

-2 байти завдяки steadybox

s,i,j;f(n){for(j=0;s^n|j%100!=n;)for(s=0,i=j+=n;i;i/=10)s+=i%10;j=j;}

Спробуйте в Інтернеті


Сьогодні дізнався новий трюк за допомогою цього j * = 1 == повернути j трюк. Хороший код.
Michael Dorgan

stackoverflow.com/questions/2598084/… (повертається остання математика.)
Майкл Дорган


@Steadybox дякую, я зроблю це
PrincePolka


2

C # (.NET Core) , 90 84 83 + 18 = 101 байт

using System.Linq;
n=>{for(int i=n;!(""+n).EndsWith(""+i)|n%i>0|(""+n).Sum(c=>c-48)!=i;n++);return n;}

Спробуйте в Інтернеті!

  • 6 байтів збереглися завдяки Еміньї та моїй незвичній здатності писати (""+n)в одних місцях та n.ToString()в інших.

n=>{for(int i=n;n%100!=i|n%i>0|(""+n).Sum(c=>c-'0')!=i;n++);return n;}економить 20 байт.
Емінья

@Emigna чому n%100? Що робити, якщо n>100?
Чарлі

О так, ігноруйте цю частину. Це було з тестування з двозначним введенням. Мод повинен бути 10 ^ len (вхід). Напевно, тоді не варто.
Емінья




1

JavaScript REPL (ES5), 60 59 байт

for(n=prompt(i=0);eval([].join.call(t=++i+n,'+'))-n|t%n;);t

@totallyhuman Виправлено
l4m2

У консолі він виводить без попередження (), тому я здогадуюсь
l4m2

0

Haskell , 75 байт

f n=[x|x<-[0,n..],sum[read[d]|d<-show x]==n,mod x(10^length(show n))==n]!!0

Спробуйте в Інтернеті!

Пояснення:

f n=[x|                                      ]!!0 -- Given input n, take the first x
       x<-[0,n..],                                -- which is a multiple of n,
                  sum[read[d]|d<-show x]==n,      -- has a digital sum of n
                  mod x(10^length(show n))==n     -- and ends in n.

Цікаво, чи nможна скоротити частину "кінців ". Я також спробував show n`elem`scanr(:)""(show x), але це довше.





0

PowerShell , 84 байти

for($n=$i=$args[0];$i%$n-or$i-notmatch"$n$"-or([char[]]"$i"-join'+'|iex)-$n){$i++}$i

Спробуйте в Інтернеті!

Проста конструкція, але тривалі команди. Час очікується на TIO для n=100, але якщо ми явно встановимо i, що це близько, він виводиться правильно.

Це просто простий forцикл, який триває так довго, як будь-яка з умов є істинною. Три умови дорівнює 1) $i%$n, тобто у нас є залишок; 2) $i-notmatch"$n$", тобто він не відповідає повторним вираженням останніх кількох цифр; і 3) ([char[]]"$i"-join'+'|iex)-$n, тобто підсумовані цифри разом не дорівнюють $n(тут перевіряється простим відніманням, оскільки ненульові значення є правдою). Всередині петлі ми просто збільшуємо $i.

Таким чином, якщо у нас немає залишку, регулярне вираження збігається, а числа рівні, всі три умови є, $falseі ми виходимо з циклу. Як результат, ми просто можемо залишити $iна конвеєрі, і вихід неявний.


0

PHP, 73 + 1 байт

while(array_sum(str_split($i+=$n=$argn))-$n|$i%10**strlen($n)-$n);echo$i;

Запустити як труба -R.

петлі $iчерез кратні <input>до sum_of_digits-<input>і tail_of_i-$nє фальшивими; потім друкує i.


0

m4, 210 байт

define(d,define)d(i,ifelse)d(s,`i($1,,0,`eval(substr($1,0,1)+s(substr($1,1)))')')d(k,`r($1,eval($2+1))')d(r,`i(s($2),$1,i(regexp($2,$1$),-1,`k($1,$2)',i(eval($2%$1),0,$2,`k($1,$2)')),`k($1,$2)')')d(f,`r($1,1)')

Визначає макрос, fякий обчислює відповідь. Це трохи повільно - неприпустимо так - але я обіцяю, що це працює.

Я думав, що m4 було б непогано, оскільки він розглядає цілі числа як рядки за замовчуванням, але це досить погано.


0

Scala, 120 байт

def a(n:Int)={val b=math.pow(10,math.ceil(math.log10(n))).##;var c=b+n;while(c%n!=0||(0/:c.toString)(_+_-'0')!=n)c+=b;c}

Це працює до тих пір n = 70, після чого цілі числа переповнюються. Для одного додаткового символу Intможе змінюватися значення a Longі дозволяти n > 100обчислювати значення.

Ось дещо довший варіант, що не має волі:

def golfSourceLong(n: Long): Long = {
  val delta = math.pow(10, math.ceil(math.log10(n))).toInt
  var current = delta + n
  while (current % n != 0 || current.toString.foldLeft(0)(_ + _ - '0') != n) {
    current += delta
  }
  current
}

0

R , 115 байт

function(n,d=nchar(n):1){while(sum(D<-F%/%10^((k=nchar(F)):1-1)%%10)-n|any(D[k-d+1]-n%/%10^(d-1)%%10)|F%%n)F=F+n
F}

Спробуйте в Інтернеті!

Страшна функція R. Збільшення F(починається з 0) до nтих пір, поки не буде знайдено значення, яке задовольняє необхідним властивостям, яке воно потім повертає. Використання anyна doubleвираз посилає попередження для кожної ітерації циклу, але не впливає на правильність.

Час вичерпається на TIO для достатньо великих входів (n = 55 або вище), але слід правильно обчислити рішення, враховуючи достатньо часу / місця.



0

Желе , 22 21 байт

DS=³a³ḍaDṫ³DLC¤Ḍ=³ø1#

Спробуйте в Інтернеті!

Правка: стискається до одного рядка

Пояснення

DS=³a³ḍaDṫ³DLC¤Ḍ=³ø1#
                  ø1#  Evaluate the condition before this and increment a counter until it is met then output the counter                     
D                      Digits of incremented variable as a list
 S                     Sum
  =³                   Equals argument of program?
    a                  Logical and
     ³ḍ                Does arg divide incremented variable?
       a               Logical and
        Dṫ     Ḍ       Last n digits of inc. var. where n is number of digits in program input
          ³DLC         1 - (number of digits of program input)
              ¤        Book ends above nilad
                =³     Equals program input?

На це мені пішло багато годин, тому що я навчаюсь Желі, але тепер, коли я закінчив, я так задоволений. Тривалий час я не розумів, що мені потрібно, ¤і просто не міг змусити його працювати. Дивлячись на [це] [1] добре пояснений код допоміг мені укласти угоду. Дуже багато відповідей Jelly в PPCG також керували мене.


0

Javascript, 224 байти function getNumber(x){if(x<12){return!1};const sumDigits=(x)=>x.toString().split('').map(Number).reduce((a,b)=>a+b,0);for(let i=2;i<9999;i++){if((x*i-x)%(Math.pow(10,x.toString().length))==0&&sumDigits(x*i)==x){return x*i}}} Un-golf:

function getNumber(x){
	if (x<12) {return false};
	const sumDigits = (x) => x.toString().split('').map(Number).reduce((a,b)=>a+b, 0);
	for (let i=2; i<9999; i++){
		if((x*i-x)%(Math.pow(10, x.toString().length))==0 && sumDigits(x*i)==x){
			return x*i;
}
}
}

Використання: 1. getNumber (12) 2. getNumber (13) 3. ....


Я не знаю багато про гольф Javascript, але я впевнений, що ви повинні скоротити імена getNumberабо sumDigits.
Ørjan Johansen

Дякую вам велика, я не збираюся перемагати тут, просто хочу взяти участь у цьому виклику: smile:
NTCG

0

J , 37 33 байт

+^:(((=1#."."0)*:(e.".\.))":)^:_~

Спробуйте в Інтернеті!

                                ~    A = N
+^:                          ^:_     while(...)A+=N; return A
   (                      ":)        A to string
   (((    "."0)          )  )        digits of A
   ((( 1#.    )          )  )        sum
   (((=       )          )  )        equals N
   ((            (e.".\.))  )        N is one of the suffixes of A-string
   ((          *:        )  )        not AND

Попередження лічильника ітерацій ~ в 5 разів швидше, але на 5 байт довше:

(]+[((=1#.,.&.":)<:|),~&.":)^:_&1,&":]

Спробуйте в Інтернеті!

Збільшення на 100, 27 байт :

(]+100*(=1#.,.&.":)<:|)^:_~

Спробуйте в Інтернеті!


Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.