N ile biten, n ile bölünebilen ve haneleri n ile toplamlanan en küçük pozitif tamsayının yerini bulun.


33

Hepsi başlığında ...

Girdi olarak pozitif bir tamsayı alın n>=12ve başlık ne diyorsa onu yapın.

Evet, bu OEIS A187924’de .

Bazı test durumları

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

Bu . Bayt cinsinden en kısa kod kazanır!


Yorumlar uzun tartışmalar için değildir; bu konuşma sohbete taşındı .
Martin Ender

Sohbete taşınanın bir bölümünü kapatmak için: OEIS’e yaptığım düzenleme, 11’in çözümü olmayan tek numara olduğunu onayladı.
Ørjan Johansen

Yanıtlar:


19

Befunge, 81 bayt

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

Çevrimiçi deneyin!

En az n = 70'e kadar işlem yapabilir , bunun ardından bazı değerler çoğu uygulamada yığın hücre boyutunu taşmaya başlayacaktır ve yapmayanlarda ise onu bulmayı beklemeye değmeyecek kadar uzun sürecektir.

Bu kısıtlamalar göz önüne alındığında, biz bile değerlerini işlemek için çalışırken rahatsız etmeyin n hangi araçlar, 99'dan büyük biz daha kolay bir test eğer değer uçları n basitçe ile değer modulo 100 karşılaştırarak ile n .

Aşağıda kodun daha ayrıntılı bir dökümü bulunmaktadır.

Source code with execution paths highlighted

*Stdin'den n oku ve hafızaya kaydet. V ile 0
*arasındaki test değerini sıfırlayın ve v'yi önden artırarak ana döngüyü başlatın . Ana döngünün başlangıcına dönüp dönmediğini test edin . Ana döngünün başlangıcına dönüp dönmediğini test edin . Rakamları v'yi art arda v modulo 10 ekleyerek ve v'yi 10'a bölerek toplayın. Toplamın n'ye eşit olup olmadığını ve ana döngünün başına dönmediğini test edin . Aksi halde v çıkış ve çıkış.
*v%n == 0
*v%100 == n
*
*
*


12

05AB1E , 14 bayt

[NI«ÐIÖsSOIQ*#

Çevrimiçi deneyin!

açıklama

Büyük ön ekler gerektiren çözümler TIO'da zaman aşımına uğrayacak

[                # 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 hile yapıyormuş gibi hissediyorum, çünkü çok iyi. Bunu bir mil aşmanın tek yolu, geçmiş dile referans veren bir programlama 'sıkıştırma' dili yapmaktır. Ben ans = dic [1] lol gönderirim
Pathfinder

@Pathfinder: 05AB1E'yi sürekli yenebilen bir kaç dil var, bu yüzden hala daha kısa bir şey görmeyi umut edebiliriz :)
Emigna

12

JavaScript (ES6), 55 54 bayt

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>

Bir dize olarak girdi alır. Daha büyük sonuçlar için kuyruk özyineleme desteğine sahip bir tarayıcıya ihtiyaç vardır. Düzenleme: @Arnauld sayesinde 1 bayt kaydedildi.


eval([s,...a].join`-`)?daha kısa olmasa da çalışacaktı ...
ETHproductions

@Arnauld Hayır, sadece bunu yapabileceğimi unuttum ||.
Neil

8

Brachylog v2, 12 10 bayt

a₁.;A×?≜ẹ+

Çevrimiçi deneyin!

Bu, üzerinden girdi alan .ve çıktı üreten bir işlev gönderimidir ?(normal kuralın tam tersi; tüm Brachylog işlevleri, girdi veya çıktı bağımsız değişkenleri olabilen tam olarak iki bağımsız değişkene sahiptir, ancak dil, herhangi bir bağımsız değişken kullanımını zorlamaz). Biz normalde argüman kullanımı için konvansiyonlar PPCG de alakalı olacak şekilde düşünmüyoruz .

açıklama

Bu çözümün önceki bir sürümünde, Ḋ|tek basamaklar için özel bir durum ( yani "kelimenin tam anlamıyla" dönüş haneleri ") vardı, ancak soru açıkça bunun için kontrol etmek zorunda olmadığınıza işaret ediyor (bunu yakalamak için teşekkürler @DLosc). o. (Yazılan çözüm, Brachylog'un 1'i çarpmadaki bilinmeyen bir olasılık olarak, sonsuz döngüleri önlemek için bir olasılık olarak düşünmeyeceği için tek basamaklarda işe yaramaz; çarpımları isteğe bağlı bir durumdur.)

Yani bu cevap şimdi şartnamenin hemen hemen doğrudan çevirisine gidiyor. İle başlayarak ?(çıkış / numara biz bulmaya çalışıyoruz; bir Brachylog yüklem her zaman örtük ile başlar ?) Kullandığımız a₁.o sahip olduğunu iddia etmek .son ek olarak (giriş). O zaman , sonucu üretmek için bir şeyle ( ) ;A×?çarparak ( ×) elde edebileceğimiz anlamına gelir . Son olarak, ( ) basamağının ( ) toplamı ve varsayılan olarak nihai sonucun ürettiği her Brachylog programının sonunda örtük bir iddia vardır . Yani başka bir deyişle, bu program "dır bir eki olan , bir şeye ile çarpılır , rakamı toplamıdır;A?ẹ++?..?.?.?", orijinal programın gerçek anlamıyla çevirisine çok yakın.

Haneli toplamı gereksinimi uygulanmak üzere gereklidir. Hakkında bir şeyin bilinmeyenleri sevmediğini farz ediyorum , bu yüzden Brachylog'a programın cebirden ziyade programın kaba bir yaklaşımını kullanmasını söyler.


6

Haskell , 72 bayt

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

Çevrimiçi deneyin!

Bulunan eksi n sayısının hem n, hem de 10 ^ uzunluğunun (n) bir katı olması gerektiğini unutmayın.

Laikoni ve insanlıktan esinlenerek


Siteye Hoşgeldiniz!
DJMcMayhem

3
Değişim lcm n(10^length(show n))için lcm(10^length(show n))n1 byte için
H.PWiz

6

Alice , 35 bayt

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

Çevrimiçi deneyin!

açıklama

Bu program Kardinal (tamsayı işleme) ve Ordinal (string işleme) modu arasında gerçekten güzel bir karışım ve etkileşime sahiptir.

Büyük ölçüde Kardinal modda çalışan ondalık G / Ç ile mücadeleye ilişkin olağan çerçeve:

/o 
\i@/...

Ve asıl 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 bayt

-26 JollyJoker'e teşekkürler

-7 JollyJoker sayesinde tekrar

-11 Oliver Grégoire sayesinde

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

Çevrimiçi deneyin!

Java'yı sevmeliyim! Verimsiz bir yaklaşım kullanıyorum olabilir, ancak yerleşik bir sağlama toplamı işlevine ve sayı baytlarının sonunu kontrol etmek için String'e çift dönüşüme sahip olmasam ...

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)çalışmalı.
JollyJoker

@JollyJoker, beni aptal gibi hissettirdiğin için teşekkürler: P
Luca H

1
Heh. n/=10yerine n=n/10. Ayrıca, i+=afor döngüsünde böylelikle bölünme kontrolünü atlayabilirsiniz.
JollyJoker

@ JollyJoker vay, toplam için yaptım ama bölümü için değil ... Teşekkürler, kısa bir süre ekleyeceğim
Luca H

1
API kullanarak 92 byte , kendinizi hesaplamaktan daha kısa. Ayrıca, noktalı virgül, bayt sayısının bir parçası değildir, çünkü geçerli bir lambda örneğin yöntem argümanı olarak verilebilir ve o zaman bu noktalı virgül gerekmez.
Olivier Grégoire

4

Mathematica, 72 bayt

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

@MartinEnder tarafından -18 bayt

Çevrimiçi deneyin!

Martin Ender'den başka bir versiyon daha.
Bu yaklaşım en yüksek seviyeye ulaşabilir n=40(41 varsayılan yineleme limitini aşıyor)

Mathematica, 65 bayt

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

Çevrimiçi deneyin!


3

Python 2,74 bayt

Bu çözüm bunu varsayar n <= sys.maxint.

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

Çevrimiçi deneyin!


Değiştir str(x)ile x6 bayt (nasıl içeri-kene arka keneler kaçacağız?) Kurtarmak için iki kez arka-keneler.
Chas Brown

@ChasBrown `ters eğik çizgi kene backticks içinde.
wvxvw

@ChasBrown no, Lalgoritmayı bozabilecek bir uzun tamsayı olarak olduğu gibi .
FlipTack

3

C (gcc) 71 69 bayt, 100’de başarısız oluyor

Uzun ve% 1000 ile denedim ama zaman aşımına uğradı

Sabit kutu sayesinde -2 bayt

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;}

Çevrimiçi deneyin


Bugün yeni bir numara öğrendim j * = 1 == return j trick. Güzel kod.
Michael Dorgan



@Steadybox teşekkür ederim, bunu yapacağım
PrincePolka


2

C # (.NET Core) , 90 84 83 + 18 = 101 bayt

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

Çevrimiçi deneyin!

  • 6 bayt, Emigna ve (""+n)bazı yerlerde ve bazılarında yazma konusundaki esrarengiz yeteneğim sayesinde kurtarıldı n.ToString().

n=>{for(int i=n;n%100!=i|n%i>0|(""+n).Sum(c=>c-'0')!=i;n++);return n;}20 bayt kaydeder.
Emigna

@Emigna neden n%100? Ya eğer n>100?
Charlie

Evet, o kısmı görmezden gelin. Bu 2 basamaklı girişle yapılan testlerdendi. Mod, 10 ^ len (giriş) olmalıdır. Muhtemelen buna değmez.
Emigna

1

Julia, 70 bayt

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)Bununla 5 bayt kaydedebilirsiniz. Çevrimiçi deneyin!
Luke,


1

Pip , 18 bayt

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

Algoritma Emigna'nın cevabından ilham aldı . Çevrimiçi deneyin!

Nasıl çalışır

                    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 bayt

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

@totallyhuman Sabit
l4m2

Konsolda alarm olmadan çıktı () yani sanırım
l4m2

0

Haskell , 75 bayt

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

Çevrimiçi deneyin!

Açıklama:

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.

Acaba "biter n" kısmı kısaltılabilir mi? Ben de denedim show n`elem`scanr(:)""(show x), ama daha uzun.





0

PowerShell , 84 bayt

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

Çevrimiçi deneyin!

Basit yapı ancak uzun komutlar. TIO için zaman aşımına uğradı n=100, ancak açıkça ikapatılmaya başladığımızda , doğru şekilde çıktı veriyor.

Bu sadece forkoşullardan herhangi biri doğru olduğu sürece devam eden basit bir döngüdür. Üç koşul 1'dir) $i%$n, yani bir geri kalanımız var; 2) $i-notmatch"$n$", yani, son birkaç rakamla eşleşmiyor; ve 3) ([char[]]"$i"-join'+'|iex)-$nyani birlikte toplanan rakamlar,$n (burada sıfır olmayan değerler gerçeğe yakın olduğu için basit çıkarma ile kontrol edilir). Döngünün içinde biz basitçe arttırıyoruz $i.

Böylece, eğer bir geri kalanımız yoksa, regex eşleşir ve sayılar eşittir, üç koşul da aynıdır $falseve döngüden çıkarız. Sonuç olarak, sadece $iboru hattında kalabiliriz ve çıktı kapalıdır.


0

PHP, 73 + 1 bayt

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

İle boru olarak çalıştır -R .

kadar ve katılıklı $ikatları arasında döngü ; sonra yazdırır .<input>sum_of_digits-<input>tail_of_i-$ni


0

m4, 210 bayt

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

Bir makro tanımlar fCevabı hesaplayan . Biraz yavaş - alışılmadık bir şekilde - ama işe yarayacağına söz veriyorum.

M4'ün iyi olacağını düşündüm, çünkü tamsayıları varsayılan olarak dizge olarak kabul ediyor, ama bu oldukça kötü.


0

Scala, 120 bayt

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}

Bu n = 70, sonra tam sayıları taşma kadar çalışır . Bir ekstra karakter için, Inta geçebilirsinizLong ve değerlerini izinn > 100 hesaplanmasına .

İşte biraz daha uzun ungolfed versiyonu:

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 bayt

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}

Çevrimiçi deneyin!

Korkunç R işlevi. Gerekli özellikleri karşılayan bir değer bulunana ve ardından döndürdüğü değere kadar artar F(başlar 0) n. anyBir doubleifadede kullanılması , döngünün her yinelemesi için bir uyarı gönderir, ancak doğruluğunu etkilemez.

TIO'da yeterince büyük girişler için zaman aşımı (n = 55 veya daha yüksek) ancak yeterli zaman / alan verilen çözümü doğru şekilde hesaplamalıdır.



0

Jöle , 22 21 bayt

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

Çevrimiçi deneyin!

Düzenleme: tek bir satıra sıkıştırılmış

açıklama

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?

Bu bana yazmak için uzun saatler sürdü çünkü Jelly'i öğreniyorum ama şimdi işim bitti. Uzun süredir ihtiyacım olduğunun farkında değildim ¤ve işe yaramadı. [Bu] [1] 'e bakarak iyi açıklanan kod anlaşmayı imzalamama yardımcı oldu. PPCG'de çok sayıda diğer Jelly cevapları da bana rehberlik etti.


0

Javascript, 224 bayt 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;
}
}
}

Kullanımı: 1. getNumber (12) 2. getNumber (13) 3. ....


Javascript golf hakkında pek bir şey bilmiyorum ama isimleri kısaltmanız gerektiğinden eminim getNumberya da sumDigits.
Ørjan Johansen

Çok teşekkür ederim, burada kazanmayacağım, sadece bu zorluğa girmek istiyorum: gülümse:
NTCG

0

J , 37 33 bayt

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

Çevrimiçi deneyin!

                                ~    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

Yineleme sayacını hazırlamak ~ 5 kat daha hızlı ancak 5 bayt daha uzun:

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

Çevrimiçi deneyin!

100, 27 bayt artırma :

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

Çevrimiçi deneyin!


Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.