Codegolf - Плюс И Времена, Единицы И Девятки

  • Автор темы Sayasat
  • Обновлено
  • 20, Oct 2024
  • #1

Реализуйте это рекуррентное отношение как функция или программа, которая вводит и выводит неотрицательное целое число:

  • Ф(0) = 0

  • F(N) = наименьшее целое число, большее, чем F(N-1), такое, что сумма и/или произведение его цифр по основанию 10 равна N.

N — это входные данные вашей программы, а F(N) — ее выходные данные.

Для ясности: сумма цифр в числе, например 913, равна 9+1+3=13. Произведение равно 9×1×3=27. Для однозначных чисел сумма и произведение представляют собой одно и то же число. Числа, содержащие 0, конечно, имеют произведение 0.

Результаты через F(70):

 N F(N)
0 0
1 1
2 2
3 3
4 4
5 5
6 6
7 7
8 8
9 9
10 19
11 29
12 34
13 49
14 59
15 69
16 79
17 89
18 92
19 199
20 225
21 317
22 499
23 599
24 614
25 799
26 899
27 913
28 1147
29 2999
30 3125
31 4999
32 5999
33 6999
34 7999
35 8999
36 9114
37 19999
38 29999
39 39999
40 41125
41 59999
42 61117
43 79999
44 89999
45 91115
46 199999
47 299999
48 311128
49 499999
50 511125
51 699999
52 799999
53 899999
54 911116
55 1999999
56 2111147
57 3999999
58 4999999
59 5999999
60 6111125
61 7999999
62 8999999
63 9111117
64 11111188
65 29999999
66 39999999
67 49999999
68 59999999
69 69999999
70 71111125
 

Выигрывает самый короткий код в байтах. Слава, если вы сможете показать, что ваш код обладает некоторой эффективностью.

#код-гольф #математика #последовательность #арифметика #целое число

Sayasat


Рег
20 Jul, 2004

Тем
93

Постов
206

Баллов
671
  • 26, Oct 2024
  • #2

05AB1E, 20 12 байт

Сэкономлено 8 байт благодаря Осабл!

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 for(;$c<=$a=$argn;$c=count($r))array_product($s=str_split($n++))!=$c&&array_sum($s)!=$c?:$r[]=~-$n;echo$r[$a];
 

Использует CP-1252 кодировка. Попробуйте онлайн!

 

DeettyCymn


Рег
24 Oct, 2020

Тем
72

Постов
190

Баллов
570
  • 26, Oct 2024
  • #3

Mathematica, 71 байт, 68 символов

&20p Read N and save for later. > Start of main loop; current target and test number on stack, initially 0. : Duplicate the test number so we can manipulate it. 000p Initialise the sum to 0. 110p Initialise the product to 1. > Start of inner loop. :55+%: Modulo 10 of the test number to get the first digit. 00g+00p Add to the sum. 10g* Multiply by the product. :"~"`!* If greater than 126, set to 0 to prevent overflows - it'll never match. 10p Update the product variable. 55+/ Divide the test number by 10 to get the next digit. :!_ If not zero, repeat the inner loop $ Drop the zero left over from the loop. \::00g-\10g- Compare the sum and product with the current target. *| Multiply the two diffs and branch; up if no match, down if either match. \1+^ On no match, we increment the test number and repeat the main loop. :>20g-!| With a match, we compare the current target with the saved N. 1+\v If that doesn't match, increment the current target and restart main loop. \>.@ If it does match, we've got our result; output it and exit.

Всего за 4 байта есть версия, в которой хранятся значения &20p>:000pv >\1+^vp011< | >.@>:55+%:00g+00p10g*v>10g-* ::\$_^#!:/+55p01*!`"~":<^\-g00 < |!-g02 +1< v\ :

for ((;n<=$1;z++)){ p(){ fold -1<<<$z|paste -sd$1|bc;} [ `p +` = $n -o `p \*` = $n ]&&((z-->n++)) } echo $z

В последней версии, прежде чем оценивать f\.{ 0\0 @( find @(or = #1 sum #0) = #1 prod #0 ) (dp + 1 (f -#0 1)) N } , f\.{0\0@(:>@(| =#1sum#0)=#1prod#0)(dp +1f -#0 1)N}; f 10 будет иметь два нижних значения:

f\.{0\0@(:>@(| =#1sum#0)=#1prod#0)(dp +1f -#0 1)N

Теперь, если мы оценим f=lambda n,k=0,r=0:-(k>n)or-~f(n,k+(k in[eval(c.join(`r`))for c in'+*']),r+1) :

Q.f ) - first_n(input, start=1) Y - digits(^) 'Bs] - [sum(^), product(^)] R} - V in ^ i - len(results)+1 e - ^[-1]

Это значительно ускоряет будущие вычисления, поскольку Mathematica больше не будет вычислять значения между Q.fY'Bs]iR{)e and i рекурсивно. Сэкономленное время более драматично, поскольку first_n increases:

t.fY'Bs]~ohR{Io(e ||answer||

С#, 155 159 135 байт

N>50

Супер неэффективно, занимает много времени N=40 . Gonna try to get a more efficient, but longer solution.

Хорошо, теперь намного лучше, но на 4 байта длиннее. О, ну я могу сделать 20 pretty quickly now. Thank you @milk for saving 24 bytes!

 

Editorre


Рег
19 Mar, 2015

Тем
76

Постов
194

Баллов
614
  • 26, Oct 2024
  • #4

Пиф — 18 17 байт

Один байт сэкономлен благодаря @Jakube!

Использует сокращение для рекурсивных действий.

$i[$n]

Тестовый набор.

 

PabloEskobaro


Рег
30 Nov, 2010

Тем
62

Постов
171

Баллов
521
  • 26, Oct 2024
  • #5

Р, 124 112 байт

$i

Ошибка при N=45, потому что R настаивает на записи 10.000 как 1e+05, что не нравится $l , this is fixable by using for по стоимости 12 байт:

$l++

Будучи языком статистического программирования, R имеет раздражающе многословные способы разделения чисел на вектор цифр. Тем более, что все должно быть явно преобразовано обратно из строк в числовые значения.

Сэкономлено 12 байт благодаря billywob.

 

Zol411skestSoky


Рег
06 Sep, 2011

Тем
76

Постов
190

Баллов
590
  • 26, Oct 2024
  • #7

JavaScript (ES6), 84 86

Изменить: сохранено 2 байта, спасибо @Arnauld

$_

Тест Обратите внимание, что при значении выше 50 будет использоваться слишком много ресурсов вашего процессора. Нажмите «Скрыть результаты», чтобы остановиться, пока не стало слишком поздно.

* + ||answer||

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

for

Функция с именем $_ . Takes a number as input and returns a number as output. Inspired by the previous Mathematica solution, but uses a different looping mechanism.

 

Safariman


Рег
21 Jun, 2011

Тем
65

Постов
193

Баллов
538
  • 26, Oct 2024
  • #8

С, 240 байт

-notin

Попытка использовать некоторые математические свойства последовательности.

 

Zmei91


Рег
28 Nov, 2017

Тем
77

Постов
208

Баллов
623
  • 26, Oct 2024
  • #9

PowerShell v3+, 114 байт

*

Итеративное решение, без простого способа превратить число в сумму/произведение его цифр, поэтому оно немного длиннее, чем ответы JavaScript.

Принимает ввод eval , sets Invoke-Expression в массив всего лишь iex (this is the collection of + и наборы -join equal to $b (это последняя char ). We then loop upward from "$l" к $l , each iteration executing a for петля.

for loop's conditional takes the $n номер теста в строке 1 , then casts that as a F -array и сохраняет этот массив во временную переменную 1 . We then $l эти цифры вместе с F() and pipe that to 0 (сокращение от $i and similar to $n ). Кроме того, мы также делаем то же самое с param($n)$i=,0;$l=1;1..$n|%{for(;$_-notin((($b=[char[]]"$l")-join'+'|iex)),(($b-join'*'|iex))){$l++}$i+=$l};$i[$n] . Those two numbers are encapsulated in parens and treated as the array argument for the int f(char n){int q[19],i=19,r=n%9,j=9,*p=q,c=n/9;while(i)q[--i]=0;if(c){if(!r){r=9;c--;}q[9]=c;if(!(n%r)){n/=r;while((j-1)*(n-1)*c){if(n%j)j--;else{c--;q[9+j]++;n/=j;}}q[10]=c;if(1==n)p+=9;}while(++i<10){while(p[i]--)r=r*10+i;}}return(r);} оператор против текущего номера a of the outer loop (i.e., the a@0=0;a@b_:=NestWhile[#+1&,a[b-1]+1,+##!=b&&1##!=b&@*IntegerDigits] цикл выполняется до тех пор, пока <pre id=O></pre> and f=n=>eval("for(v=n&&f(n-1),p=s=n+1;s&&p-1;)[...++v+''].map(d=>(p/=d,s-=d),p=s=n);v") out=x=>O.textContent=x+'\n'+O.textContent i=0 step=_=>out(i+' '+f(i),++i,setTimeout(step,i*10)) step() отличаются от f=n=>eval("for(v=n&&f(n-1),p=s=n+1;s&&p-1;)[...++v+''].map(d=>(p/=d,s-=d),p=s=n);v") ). The body of the f=n=>n&&eval(`for(i=f(n-1);++i,${x="[...i+''].reduce((r,v)=>"}+r+ +v)-n&&${x}r*v)-n;);i`) console.log(f.toString().length + 2); console.log(f(25)); console.log(f(13)); console.log(f(8)); цикл просто увеличивается f=function(N){y=x=`if`(N-1,f(N-1),0);while(N!=prod(y)&N!=sum(y)){x=x+1;y=as.double(el(strsplit(c(as.integer(x),""),"")))};x} .

Как только мы выйдем из этого внутреннего as.integer() loop, we add our as.numeric() как новый элемент f=function(N){y=x=`if`(N-1,f(N-1),0);while(N!=prod(y)&N!=sum(y)){x=x+1;y=as.double(el(strsplit(c(x,""),"")))};x} . Once we've fully completed the range loop, we just place uf}HsM*FBjT;hGSQZ на конвейере, и вывод неявный.

NB — выполняется довольно медленно, как указано выше. N<=50 , simply because of the loop structure. For example, N>=14 на моей машине это занимает около двух минут, и я даже не удосужился протестировать a=n=>{if(n<1)return 0;int i=n,s=0,p=1,N=a(n-1);for(;;){s=0;p=1;foreach(var c in++i+""){s+=c-48;p*=c-48;}if(i>N&(s==n|p==n))return i;}}; .

 

Boryazavalniy


Рег
27 Oct, 2019

Тем
76

Постов
194

Баллов
614
  • 26, Oct 2024
  • #10

Пайк, 17 байт

In[5]:= Quit[] In[1]:= ±0=0;±n_:=(For[x=±(n-1),FreeQ[{+##,1##}&@@IntegerDigits@x,n],x++];±n=x) In[2]:= AbsoluteTiming[±60] Out[2]= {23.0563, 6111125} In[3]:= AbsoluteTiming[±60] Out[3]= {9.89694*10^-6, 6111125}

Попробуйте здесь!

Или 13 байт неконкурентно

n now puts the amount of items already found plus one in 20 если используется.

0

Попробуйте здесь!

In[3]:= ±20 In[3]:= 225 In[4]:= DownValues@PlusMinus Out[4]= {HoldPattern[±0] :> 0, HoldPattern[±1] :> 1, HoldPattern[±2] :> 2, HoldPattern[±3] :> 3, HoldPattern[±4] :> 4, HoldPattern[±5] :> 5, HoldPattern[±6] :> 6, HoldPattern[±7] :> 7, HoldPattern[±8] :> 8, HoldPattern[±9] :> 9, HoldPattern[±10] :> 19, HoldPattern[±11] :> 29, HoldPattern[±12] :> 34, HoldPattern[±13] :> 49, HoldPattern[±14] :> 59, HoldPattern[±15] :> 69, HoldPattern[±16] :> 79, HoldPattern[±17] :> 89, HoldPattern[±18] :> 92, HoldPattern[±19] :> 199, HoldPattern[±20] :> 225, HoldPattern[±n_] :> (For[x=±(n-1),FreeQ[{+##,1##}&@@IntegerDigits@x,n],x++];±n=x)} ||answer||

Питон 2, 77 байт

±20

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

 

Ivanopulos


Рег
07 Jun, 2004

Тем
70

Постов
182

Баллов
552
  • 26, Oct 2024
  • #11

Удивляться, 49 байт

In[2]:= DownValues@PlusMinus Out[2]= {HoldPattern[±0] :> 0, HoldPattern[±n_] :> (For[x=±(n-1),FreeQ[{+##,1##}&@@IntegerDigits@x,n],x++];±n=x)}

Сопоставление с образцом ftw! Использование:

PlusMinus

Более читабельно:

±n

По сути, это просто дословная реализация спецификаций.

 

Nulta


Рег
23 Dec, 2008

Тем
70

Постов
189

Баллов
549
  • 26, Oct 2024
  • #12

БАШ, 107 байт

со сгибом + вставка + BC

±0=0;±n_:=(For[x=±(n-1),FreeQ[{+##,1##}&@@IntegerDigits@x,n],x++];±n=x) ||answer||

Бефунге, 101 байт

±n

Попробуйте онлайн! Но учтите, что, как только вы доберетесь до сорока пяти, процесс станет очень медленным. Если вы хотите протестировать весь диапазон, вам действительно нужно использовать компилятор Befunge.

Объяснение

±0=0;±n_:=(For[x=±(n-1),FreeQ[{+##,1##}&@@IntegerDigits@x,n],x++];x) ||answer||

PHP, 110 байт

µNSDOsP‚¾>å½

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

 

Mynameis500


Рег
22 Mar, 2013

Тем
94

Постов
219

Баллов
709
Тем
403,760
Комментарии
400,028
Опыт
2,418,908

Интересно