Найти наименьшее натуральное число, которое заканчивается на 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 - единственное число без решения, было только что одобрено.
Орджан Йохансен

Ответы:


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 .

Ниже приведена более подробная разбивка кода.

Исходный код с выделенными путями выполнения

*Чтение п из стандартного ввода и сохранения в памяти.
*Инициализируйте тестовое значение v равным 0 и запустите основной цикл, увеличивая v вперед.
*Проверьте v%n == 0, а если нет, вернитесь к началу основного цикла.
*Проверьте v%100 == n, а если нет, вернитесь к началу основного цикла.
*Суммируйте цифры в v путем многократного добавления v по модулю 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×?≜ẹ+

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

Это отправка функции, которая принимает ввод через .и производит вывод через ?(в противоположность обычному соглашению; все функции брахилога имеют ровно два аргумента, которые могут быть аргументами ввода или вывода, но язык не требует применения какого-либо конкретного аргумента). Обычно мы не считаем соглашения об использовании аргументов актуальными в PPCG .

объяснение

В предыдущей версии этого решения был специальный случай ( Ḋ|т. Е. «Буквально возвращать цифры») для однозначных чисел, но вопрос, по-видимому, гласит, что вам не нужно проверять это (спасибо @DLosc за это), поэтому я удалил Это. (Написанное решение не будет работать с однозначными числами, поскольку Brachylog не будет рассматривать 1 как возможность для неизвестного в умножении предотвратить бесконечные циклы; его умножения произвольной арности.)

Таким образом, этот ответ теперь относится к прямому переводу спецификации. Начиная с ?(выход / число, которое мы пытаемся найти; предикат брахилога всегда неявно начинается с ?), мы используем, a₁.чтобы утверждать, что он имеет .(вход) в качестве суффикса. Тогда ;A×?означает, что мы можем умножить ( ×) результат на что-то ( ;A), чтобы произвести ?(вывод). Наконец, ẹ+sums ( +) для digits ( ) ?, и по умолчанию в конце каждой программы на брахилоге создается неявное утверждение, которое дает конечный результат .. Другими словами, эта программа " .является суффиксом ?, .умноженным на что-то ?, .является цифрой суммы?", что очень близко к буквальному переводу оригинальной программы.

Это необходимо для выполнения требования о сумме цифр. Я предполагаю, что кое-что о не любит неизвестных, поэтому он говорит 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;}

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

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

Ungolfed:

  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
Luca H

1
Хех. n/=10вместо n=n/10тоже. Также i+=aв цикле for вы можете пропустить проверку делимости.
JollyJoker

@JollyJoker Вау, я сделал это для суммы, но не для деления ... Спасибо, я добавлю это в ближайшее время
Лука Х

1
92 байта , используя API, короче, чем вычисление самостоятельно. Кроме того, точка с запятой не является частью bytecount, потому что в качестве аргумента метода можно указать допустимую лямбду, и тогда вам не нужна эта точка с запятой.
Оливье Грегуар

4

Mathematica, 72 байта

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

-18 байт от @MartinEnder

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

Вот еще одна версия от Мартина Эндера.
Этот подход может доходить до n=40(41 превышает предел итерации по умолчанию)

Mathematica, 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

Я пытался с длинным и% 1000, но тайм-аут

-2 байта благодаря устойчивой коробке

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 == return j trick. Хороший код
Майкл Дорган

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 байтов благодаря Emigna и моей сверхъестественной способности писать (""+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

@ Emigna почему n%100? Что если n>100?
Чарли

Ах да, игнорируй эту часть. Это было от тестирования с 2-значным вводом. Мод должен быть 10 ^ len (вход). Наверное, не стоит того.
Emigna




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являются falsy; затем печатает i.


0

м4, 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

Скала, 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.
Орджан Йохансен

Большое спасибо, я не собираюсь побеждать здесь, просто хочу принять участие в этом соревновании: 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.