Znajdź najmniejszą dodatnią liczbę całkowitą, która kończy się na n, jest podzielna przez n, a której cyfry sumują się do n


33

Wszystko w tytule ...

Weź jako wejście dodatnią liczbę całkowitą n>=12i ... rób, co mówi tytuł.

Tak, dotyczy to OEIS A187924 .

Niektóre przypadki testowe

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

To jest . Najkrótszy kod w bajtach wygrywa!


Komentarze nie są przeznaczone do rozszerzonej dyskusji; ta rozmowa została przeniesiona do czatu .
Martin Ender,

Aby zamknąć część tego, co zostało przeniesione na czat: moja edycja w OEIS dowodząca, że ​​11 to jedyny numer bez rozwiązania, została właśnie zatwierdzona.
Ørjan Johansen

Odpowiedzi:


19

Befunge, 81 bajtów

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

Wypróbuj online!

Może obsłużyć co najmniej n = 70, po czym niektóre wartości zaczną przepełniać rozmiar komórki stosu w większości implementacji, a na tych, które tego nie robią, potrwa to tak długo, że nie warto czekać, aby się dowiedzieć.

Biorąc pod uwagę te ograniczenia, nawet nie zawracamy sobie głowy próbą obsługi wartości n większych niż 99, co oznacza, że ​​możemy łatwiej przetestować, czy wartość kończy się na n , po prostu porównując wartość modulo 100 z n .

Poniżej znajduje się bardziej szczegółowy podział kodu.

Kod źródłowy z podświetlonymi ścieżkami wykonania

*Odczytaj n ze standardowego i zapisz w pamięci.
*Zainicjuj wartość testową v na 0 i uruchom główną pętlę, zwiększając v z góry.
*Sprawdź, czy v%n == 0, a jeśli nie, wróć do początku głównej pętli.
*Sprawdź, czy v%100 == n, a jeśli nie, wróć do początku głównej pętli.
*Podsumowując cyfry w v kilkakrotnie dodając v modulo 10 oraz podzielenie V przez 10
*testu, gdy suma jest równa n , a jeśli nie powrócić na początek głównej pętli.
*W przeciwnym razie wypisz v i wyjdź.


12

05AB1E , 14 bajtów

[NI«ÐIÖsSOIQ*#

Wypróbuj online!

Wyjaśnienie

Rozwiązania wymagające dużych prefiksów przekroczą limit czasu w 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

Jeśli czujesz się tak, jakby 05AB1E oszukuje, ponieważ jest tak dobry. Jedynym sposobem na pokonanie tego o milę byłoby stworzenie języka „kompresji” programowania, który odwołuje się do języka przeszłego. Przesyłam ans = dic [1] lol
Pathfinder

@Pathfinder: Istnieje kilka języków, które mogą konsekwentnie pokonać 05AB1E, więc nadal możemy mieć nadzieję, że zobaczymy coś jeszcze krótszego :)
Emigna

12

JavaScript (ES6), 55 54 bajtów

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>

Pobiera dane wejściowe jako ciąg. Potrzebuje przeglądarki z obsługą rekurencji ogona, aby uzyskać większe wyniki. Edycja: Zapisano 1 bajt dzięki @Arnauld.


eval([s,...a].join`-`)?działałby również, choć nie jest to krótszy czas ...
ETHprodukcje

@Arnauld Nie, zapomniałem, że mogę to zrobić ||.
Neil

8

Brachylog v2, 12 10 bajtów

a₁.;A×?≜ẹ+

Wypróbuj online!

Jest to przesłanie funkcji, które pobiera dane wejściowe przez .i generuje dane wyjściowe przez ?(odwrotnie niż normalna konwencja; wszystkie funkcje Brachylog mają dokładnie dwa argumenty, które mogą być argumentami wejściowymi lub wyjściowymi, ale język nie wymusza żadnego konkretnego użycia argumentu). My zwykle nie rozważyć konwencje użycia argumentu za istotne w PPCG .

Wyjaśnienie

Poprzednia wersja tego rozwiązania miała specjalny przypadek ( Ḋ|tj. „Dosłownie zwracaj cyfry”) dla pojedynczych cyfr, ale pytanie najwyraźniej mówi, że nie musisz tego sprawdzać (dzięki @DLosc za złapanie tego), więc usunąłem to. (Zapisane rozwiązanie nie będzie działać na pojedynczych cyfrach, ponieważ Brachylog nie weźmie 1 za możliwość nieznanego w mnożeniu, aby zapobiec nieskończonym pętlom; jego multiplikacje są arbitralne).

Ta odpowiedź dotyczy teraz prawie bezpośredniego tłumaczenia specyfikacji. Zaczynając od ?(wynik / liczba, którą próbujemy znaleźć; predykat Brachylog zawsze niejawnie zaczyna się od ?) używamy a₁.do stwierdzenia, że ​​ma .(dane wejściowe) jako sufiks. Następnie ;A×?oznacza, że mnożymy może ( ×) wynik przez coś ( ;A), aby otrzymać ?(na wyjściu). Na koniec ẹ+sumuje ( +) cyfry ( ) ?i domyślnie jest to domniemane twierdzenie na końcu każdego programu Brachylog, który daje wynik końcowy .. Innymi słowy, ten program to „ .sufiks ?, .pomnożony przez coś ?, .to suma cyfr?”, co jest bardzo zbliżone do dosłownego tłumaczenia oryginalnego programu.

Jest to konieczne do wprowadzenia wymogu sumy cyfrowej. Zakładam, że coś nie lubi nieznanych, więc Brachylog mówi Bruteylogowi, by użyła metody brutalnej siły w tej części programu zamiast algebry.


6

Haskell , 72 bajty

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

Wypróbuj online!

Zauważ, że znaleziona liczba minus n musi być wielokrotnością zarówno n, jak i 10 ^ długości (n).

Inspirowany Laikoni i całkowicie ludzki


Witamy na stronie!
DJMcMayhem

3
Zmiana lcm n(10^length(show n))do lcm(10^length(show n))n1 bajta
H.PWiz

6

Alice , 35 bajtów

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

Wypróbuj online!

Wyjaśnienie

Ten program ma naprawdę niezłą mieszankę i interakcję między trybem Cardinal (przetwarzanie liczb całkowitych) i Ordinal (przetwarzanie ciągów znaków).

Typowe ramy dla wyzwań z dziesiętnymi wejściami / wyjściami, które działają głównie w trybie kardynalnym:

/o 
\i@/...

A aktualny program:

!     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 bajty

-26 dzięki JollyJoker

-7 ponownie dzięki JollyJoker

-11 dzięki Oliverowi Grégoire

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

Wypróbuj online!

Uwielbiam Javę! Może być tak, że używam nieefektywnego podejścia, ale nie mam wbudowanej funkcji sumy kontrolnej i podwójnej konwersji na String, aby sprawdzić, czy koniec liczby kosztuje bajty ...

Nie golfowany:

  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)powinno działać.
JollyJoker

@JollyJoker genialna, dzięki za to, że poczułam się głupio: P
Luca H

1
Heh n/=10zamiast n=n/10też. Ponadto i+=aw pętli for można pominąć sprawdzenie podzielności.
JollyJoker

@JollyJoker wow, zrobiłem to dla sumy, ale nie dla podziału ... Dziękuję, dodam to wkrótce
Luca H

1
92 bajty , przy użyciu interfejsu API, krótsze niż obliczanie siebie. Ponadto średnik nie jest częścią liczby bajtowej, ponieważ na przykład jako argument metody można podać poprawną lambda, a wtedy średnik nie jest potrzebny.
Olivier Grégoire,

4

Mathematica, 72 bajty

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

-18 bajtów od @MartinEnder

Wypróbuj online!

Oto kolejna wersja autorstwa Martina Endera
To podejście może wzrosnąć do n=40(41 przekracza domyślny limit iteracji)

Mathematica, 65 bajtów

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

Wypróbuj online!


3

Python 2 , 74 bajty

Takie rozwiązanie zakłada n <= sys.maxint.

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

Wypróbuj online!


Wymień str(x)się xw back-kleszcze dwa razy, aby zapisać 6 bajtów (jak można uciec z powrotem-kleszcze wewnątrz back-kleszczy?).
Chas Brown,

@ChasBrown `backslash zaznacz w backticks.
wvxvw

@ChasBrown nie, jak w przypadku długich liczb całkowitych, które mogłyby dodać Lbałagan w algorytmie.
FlipTack,

3

C (gcc) 71 69 bajtów, błąd kończy się na 100

Próbowałem z długim i% 1000, ale przekroczył limit czasu

-2 bajty dzięki 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;}

Wypróbuj online


Nauczyłem się dziś nowej sztuczki z tą j * = 1 == zwróć j sztuczkę. Niezły kod.
Michael Dorgan

stackoverflow.com/questions/2598084/… (ostatnia matematyka jest zwracana.)
Michael Dorgan


@ Steadybox dziękuję, zrobię to
PrincePolka


2

C # (.NET Core) , 90 84 83 + 18 = 101 bajtów

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

Wypróbuj online!

  • 6 bajtów zaoszczędzonych dzięki Emignie i mojej niesamowitej umiejętności pisania (""+n)w niektórych miejscach i n.ToString()innych.

n=>{for(int i=n;n%100!=i|n%i>0|(""+n).Sum(c=>c-'0')!=i;n++);return n;}oszczędza 20 bajtów.
Emigna

@Emigna dlaczego n%100? Co jeśli n>100?
Charlie

O tak, zignoruj ​​tę część. To było z testowania z 2-cyfrowym wejściem. Mod musiałby mieć wartość 10 ^ len (wejście). Prawdopodobnie więc nie warto.
Emigna

1

Julia, 70 bajtów

f(x)=(n=x;while(sum(digits(n))!=x||x!=n%(10^length("$x")));n+=x;end;n)

¬x=(n=x;while sum(digits(n))!=x||!endswith("$n","$x");n+=x;end;n)Dzięki temu możesz zaoszczędzić 5 bajtów. Wypróbuj online!
Łukasza


1

Pip , 18 bajtów

T!y%a&$+y=aY++i.ay

Algorytm inspirowany odpowiedzią Emigny . Wypróbuj online!

Jak to działa

                    a is 1st cmdline arg, i is 0, y is "" (implicit)
T                   Loop until
 !y%a&              y%a is 0 and
      $+y=a         sum of y is a:
            ++i      Increment i
           Y   .a    and yank (i concat a) into y
                 y  After the loop exits, autoprint y

1

JavaScript REPL (ES5), 60 59 bajtów

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

@totallyhuman Naprawiono
l4m2

W konsoli wyświetla się bez alert (), więc chyba
l4m2,

0

Haskell , 75 bajtów

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

Wypróbuj online!

Wyjaśnienie:

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.

Zastanawiam się, czy „koniec w n” można skrócić. Też próbowałem show n`elem`scanr(:)""(show x), ale to dłużej.





0

PowerShell , 84 bajty

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

Wypróbuj online!

Prosta konstrukcja, ale długie polecenia. Przekroczono limit czasu dla TIO dla n=100, ale jeśli wyraźnie ustawimy, iaby być blisko, wyprowadza poprawnie.

To tylko prosta forpętla, która działa tak długo, jak spełniony jest jeden z warunków. Te trzy warunki to 1) $i%$n, tzn. Mamy resztę; 2) $i-notmatch"$n$", tzn. Nie jest wyrażeniem regularnym pasującym do ostatnich kilku cyfr; i 3) ([char[]]"$i"-join'+'|iex)-$n, tj. $nsumy cyfr nie są równe (tutaj sprawdzane przez proste odejmowanie, ponieważ niezerowe wartości są prawdziwe). Wewnątrz pętli po prostu zwiększamy $i.

Zatem, jeśli nie mamy reszty, wyrażenie regularne pasuje, a liczby są równe, wszystkie trzy warunki są $falsei wychodzimy z pętli. W rezultacie możemy po prostu wyjść $iz rurociągu, a wynik jest niejawny.


0

PHP, 73 + 1 bajty

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

Uruchom jako potok z -R.

Pętle $iprzez wielokrotność <input>momentu sum_of_digits-<input>i tail_of_i-$nsą falsy; następnie drukuje i.


0

m4, 210 bajtów

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

Definiuje makro, fktóre oblicza odpowiedź. Jest to trochę powolne - bezużyteczne - ale obiecuję, że zadziała.

Myślałem, że m4 byłoby fajne, ponieważ domyślnie traktuje liczby całkowite jako ciągi, ale jest to całkiem złe.


0

Scala, 120 bajtów

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}

Działa to do czasu n = 70, po którym nastąpi przepełnienie liczb całkowitych. Dla jednego dodatkowego znaku Intmożna zmienić na a Longi pozwolić na n > 100obliczenie wartości.

Oto nieco dłuższa wersja bez golfa:

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 bajtów

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}

Wypróbuj online!

Straszna funkcja R. Przyrosty F(zaczyna się od 0) do nmomentu znalezienia wartości spełniającej wymagane właściwości, którą następnie zwraca. Zastosowanie anyna doublewypowiedzi wysyła ostrzeżenie dla każdej iteracji pętli, ale nie wpływa na prawidłowość.

Przekracza limit czasu dla TIO dla wystarczająco dużych danych wejściowych (n = 55 lub więcej), ale powinien poprawnie obliczyć rozwiązanie, biorąc pod uwagę wystarczającą ilość czasu / przestrzeni.



0

Galaretka , 22 21 bajtów

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

Wypróbuj online!

Edycja: skompresowany do jednej linii

Wyjaśnienie

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?

Pisanie zajęło mi wiele godzin, ponieważ uczę się Jelly, ale teraz, kiedy skończyłem, jestem bardzo zadowolony. Przez długi czas nie zdawałem sobie sprawy, że jest mi potrzebny ¤i po prostu nie mogłem go uruchomić. Patrząc na [ten] [1] dobrze wyjaśniony kod pomógł mi podpisać umowę. Prowadziło mnie także wiele innych odpowiedzi na żelki w PPCG.


0

JavaScript, 224 bajty 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;
}
}
}

Zastosowanie: 1. getNumber (12) 2. getNumber (13) 3. ....


Nie znam się na golfie Javascript, ale jestem pewien, że powinieneś skrócić nazwy getNumberlub sumDigits.
Ørjan Johansen

Dziękuję bardzo, nie zamierzam tutaj wygrywać, chcę tylko wziąć udział w tym wyzwaniu: uśmiech:
NTCG

0

J , 37 33 bajtów

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

Wypróbuj online!

                                ~    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

Przygotowanie licznika iteracji jest ~ 5 razy szybsze, ale o 5 bajtów dłuższe:

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

Wypróbuj online!

Zwiększanie o 100, 27 bajtów :

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

Wypróbuj online!


Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.