Temukan bilangan bulat positif terkecil yang berakhir dengan n, dapat dibagi dengan n dan yang jumlahnya dijumlahkan menjadi n

33

Semuanya ada dalam judul ...

Ambil sebagai input bilangan bulat positif n>=12dan ... lakukan apa yang dikatakan judulnya.

Ya, ini ada di OEIS A187924 .

Beberapa test case

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

Ini adalah . Kode terpendek dalam byte menang!

pengguna202729
sumber
Komentar bukan untuk diskusi panjang; percakapan ini telah dipindahkan ke obrolan .
Martin Ender
Untuk menutup bagian dari apa yang dipindahkan ke obrolan: edit saya ke OEIS membuktikan bahwa 11 adalah satu-satunya nomor tanpa solusi yang baru saja disetujui.
Ørjan Johansen

Jawaban:

19

Befunge, 81 byte

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

Cobalah online!

Dapat menangani hingga n = 70 setidaknya, setelah itu beberapa nilai akan mulai melimpah ukuran sel stack pada sebagian besar implementasi, dan pada yang tidak, akan memakan waktu begitu lama sehingga tidak layak menunggu untuk mengetahuinya.

Mengingat mereka kendala, kita tidak repot-repot mencoba untuk menangani nilai-nilai n lebih besar dari 99, yang berarti kita dapat lebih mudah menguji apakah nilai ujungnya di n dengan hanya dengan membandingkan nilai modulo 100 dengan n .

Di bawah ini adalah rincian kode yang lebih rinci.

Kode sumber dengan jalur eksekusi disorot

*Baca n dari stdin dan simpan di memori.
*Inisialisasi nilai tes v ke 0 dan mulai loop utama, menambah v di depan.
*Tes jika v%n == 0, dan jika tidak kembali ke awal loop utama.
*Tes jika v%100 == n, dan jika tidak kembali ke awal loop utama.
*Jumlahkan angka dalam v dengan menambahkan berulang-ulang v modulo 10 dan bagi v dengan 10.
*Uji apakah jumlahnya sama dengan n , dan jika tidak kembali ke awal loop utama.
*Kalau tidak, output v dan keluar.

James Holderness
sumber
12

05AB1E , 14 byte

[NI«ÐIÖsSOIQ*#

Cobalah online!

Penjelasan

Solusi yang membutuhkan awalan besar akan habis di 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
Emigna
sumber
Jika merasa seolah-olah 05AB1E curang, karena itu sangat bagus. Satu-satunya cara untuk mengalahkan ini sejauh satu mil adalah dengan membuat bahasa pemrograman 'kompresi' yang merujuk ke bahasa sebelumnya. Saya mengirimkan ans = dic [1] lol
Pathfinder
@Pathfinder: Ada beberapa bahasa di luar sana yang secara konsisten dapat mengalahkan 05AB1E, jadi kita masih bisa berharap untuk melihat sesuatu yang lebih pendek :)
Emigna
12

JavaScript (ES6), 55 54 byte

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>

Mengambil input sebagai string. Membutuhkan browser dengan dukungan rekursi ekor untuk hasil yang lebih besar. Sunting: Disimpan 1 byte berkat @Arnauld.

Neil
sumber
eval([s,...a].join`-`)?juga akan bekerja, meskipun tidak lebih pendek ...
ETHproduksi
@Arnauld Tidak, saya hanya lupa bahwa saya dapat melakukannya dengan ||.
Neil
8

Brachylog v2, 12 10 byte

a₁.;A×?≜ẹ+

Cobalah online!

Ini adalah penyerahan fungsi yang mengambil input melalui .dan menghasilkan output via ?(kebalikan dari konvensi normal; semua fungsi Brachylog memiliki dua argumen, yang bisa berupa input atau argumen output, tetapi bahasa tidak memaksakan penggunaan argumen tertentu). Kami biasanya tidak menganggap konvensi untuk penggunaan argumen menjadi relevan di PPCG .

Penjelasan

Versi sebelumnya dari solusi ini memiliki kasus khusus ( Ḋ|, yaitu "kembalikan digit secara harfiah") untuk satu digit, tetapi pertanyaannya jelas menyatakan bahwa Anda tidak perlu memeriksanya (terima kasih @Dosc untuk menangkap ini), jadi saya menghapus saya t. (Solusi sebagaimana ditulis tidak akan bekerja pada satu digit karena Brachylog tidak akan menganggap 1 sebagai kemungkinan untuk yang tidak diketahui dalam perkalian, untuk mencegah loop tak terbatas; penggandaannya adalah arbitrase-arity.)

Jadi jawaban ini sekarang berlaku untuk terjemahan spesifikasi yang cukup langsung. Dimulai dengan ?(keluaran / angka yang kami coba temukan; predikat Brachylog selalu secara implisit dimulai dengan ?) kami gunakan a₁.untuk menyatakan bahwa ia memiliki .(input) sebagai akhiran. Kemudian ;A×?berarti bahwa kita dapat mengalikan ( ×) hasilnya dengan sesuatu ( ;A) untuk menghasilkan ?(output). Akhirnya, ẹ+jumlah ( +) digit ( ) dari ?, dan secara default ada pernyataan implisit di akhir setiap program Brachylog yang dihasilkan oleh hasil akhir .. Jadi dengan kata lain, program ini " .adalah sufiks ?, .dikalikan dengan sesuatu ?, .adalah jumlah digit?", yang sangat dekat dengan terjemahan literal dari program aslinya.

Hal ini diperlukan agar persyaratan jumlah digit diberlakukan. Saya berasumsi sesuatu tentang tidak suka yang tidak diketahui, jadi Brachylog memberitahu untuk menggunakan pendekatan brute-force untuk bagian program daripada aljabar.

Komunitas
sumber
6

Haskell , 72 byte

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

Cobalah online!

Perhatikan bahwa angka yang ditemukan minus n harus merupakan kelipatan dari panjang n dan 10 ^ (n).

Terinspirasi oleh Laikoni dan benar-benar manusiawi

fishinear
sumber
Selamat datang di situs ini!
DJMcMayhem
3
Ubah lcm n(10^length(show n))ke lcm(10^length(show n))nuntuk 1 byte
H.PWiz
6

Alice , 35 byte

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

Cobalah online!

Penjelasan

Program ini memiliki perpaduan yang sangat bagus dan interaksi antara mode Cardinal (integer-processing) dan Ordinal (string-processing).

Kerangka kerja biasa untuk tantangan dengan desimal I / O yang beroperasi sebagian besar dalam mode Kardinal:

/o 
\i@/...

Dan program yang sebenarnya:

!     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.
Martin Ender
sumber
5

Java (OpenJDK 8) , 136 110 103 92 byte

-26 terima kasih kepada JollyJoker

-7 lagi terima kasih kepada JollyJoker

-11 Terima kasih kepada Oliver Grégoire

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

Cobalah online!

Harus mencintai Jawa! Mungkin saja saya menggunakan pendekatan yang tidak efisien, tetapi tidak memiliki fungsi checksum bawaan dan konversi ganda ke String untuk memeriksa akhir dari byte biaya biaya ...

Tidak Disatukan:

  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
}
Luca H
sumber
1
(""+i).endsWith(""+a)harus bekerja.
JollyJoker
@JollyJoker brilian, terima kasih telah membuat saya merasa bodoh: P
Luca H
1
Heh. n/=10bukannya n=n/10terlalu. Juga, i+=adalam loop untuk sehingga Anda dapat melewati pemeriksaan pembagian.
JollyJoker
@JollyJoker wow, saya melakukannya untuk jumlah tetapi tidak untuk divisi ... Terima kasih, saya akan menambahkannya segera
Luca H
1
92 byte , menggunakan API, lebih pendek dari menghitung sendiri. Juga, titik koma bukan bagian dari bytecount karena lambda yang valid dapat diberikan sebagai argumen metode, misalnya dan kemudian Anda tidak memerlukan titik koma itu.
Olivier Grégoire
4

Mathematica, 72 byte

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

-18 byte dari @MartinEnder

Cobalah online!

Ini adalah versi lain dari Martin Ender.
Pendekatan ini dapat naik n=40(41 melebihi batas iterasi default)

Mathematica, 65 byte

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

Cobalah online!

J42161217
sumber
3

Python 2 , 74 byte

Solusi ini mengasumsikan itu n <= sys.maxint.

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

Cobalah online!

FlipTack
sumber
Ganti str(x)dengan xback-ticks dua kali untuk menghemat 6 byte (bagaimana Anda lolos dari back-ticks di dalam back-ticks?).
Chas Brown
@ChasBrown `backslash centang dalam backticks.
wvxvw
@ ChasBrown tidak, seperti bilangan bulat panjang yang akan menambahkan Lyang bisa mengacaukan algoritma
FlipTack
3

C (gcc) 71 69 byte, gagal pada 100

Saya mencoba dengan panjang dan% 1000 tetapi waktu habis

-2 byte berkat stabilbox

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

Cobalah online

PrincePolka
sumber
Mempelajari trik baru hari ini dengan j * = 1 == return j trick. Kode yang bagus
Michael Dorgan
stackoverflow.com/questions/2598084/… (matematika terakhir dikembalikan.)
Michael Dorgan
@MichaelDorgan rakitan j = j dan j * = 1
PrincePolka
@Steadybox terima kasih, saya akan melakukannya
PrincePolka
3

Sekam , 20 19 17 byte

ḟȯ=⁰Σdfȯ€d⁰ṫdm*⁰N

Terima kasih @Zgarb untuk -2 byte!

Cobalah online!

ბიმო
sumber
17 byte dengan memisahkan kondisinya menjadi dua.
Zgarb
2

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

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

Cobalah online!

  • 6 byte disimpan berkat Emigna dan kemampuan luar biasa saya untuk menulis (""+n)di beberapa tempat dan n.ToString()di tempat lain.
Charlie
sumber
n=>{for(int i=n;n%100!=i|n%i>0|(""+n).Sum(c=>c-'0')!=i;n++);return n;}menghemat 20 byte.
Emigna
@ Emigna kenapa n%100? Bagaimana jika n>100?
Charlie
Oh ya, abaikan bagian itu. Itu dari pengujian dengan input 2 digit. Mod harus 10 ^ len (input). Mungkin tidak sepadan dengan itu.
Emigna
1

Julia, 70 byte

f(x)=(n=x;while(sum(digits(n))!=x||x!=n%(10^length("$x")));n+=x;end;n)
EricShermanCS
sumber
¬x=(n=x;while sum(digits(n))!=x||!endswith("$n","$x");n+=x;end;n)Anda dapat menghemat 5 byte dengan ini. Cobalah online!
LukeS
1

Pip , 18 byte

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

Algoritma terinspirasi oleh jawaban Emigna . Cobalah online!

Bagaimana itu bekerja

                    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
DLosc
sumber
1

JavaScript REPL (ES5), 60 59 byte

for(n=prompt(i=0);eval([].join.call(t=++i+n,'+'))-n|t%n;);t
l4m2
sumber
@totallyhuman Tetap
l4m2
Di konsol itu keluaran tanpa peringatan () jadi saya kira
l4m2
0

Haskell , 75 byte

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

Cobalah online!

Penjelasan:

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.

Saya bertanya-tanya apakah bagian "ujung n" dapat dipersingkat. Saya juga mencoba show n`elem`scanr(:)""(show x), tetapi lebih lama.

Laikoni
sumber
0

Ruby , 65 63 54 53 byte

->n{a=n;a+=n until/#{n}$/=~a.to_s&&a.digits.sum==n;a}

Cobalah online!

GB
sumber
0

Haskell , 75 byte

f n=[i|i<-[n,n+10^length(show$n)..],i`mod`n<1,sum[read[j]|j<-show$i]==n]!!0

Cobalah online!

benar-benar manusiawi
sumber
0

PowerShell , 84 byte

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

Cobalah online!

Konstruksi sederhana tetapi perintah yang panjang. Waktu habis pada TIO untuk n=100, tetapi jika kami secara eksplisit mengatur iuntuk menjadi dekat, itu keluar dengan benar.

Ini hanyalah sebuah forloop sederhana yang terus berlangsung selama salah satu dari kondisi itu benar. Tiga syarat tersebut adalah 1) $i%$n, yaitu, kita memiliki sisanya; 2) $i-notmatch"$n$", yaitu, ia tidak cocok dengan beberapa digit terakhir; dan 3) ([char[]]"$i"-join'+'|iex)-$n, yaitu, angka yang dijumlahkan bersama tidak sama dengan $n(di sini diperiksa dengan pengurangan sederhana, karena nilai bukan nol adalah benar). Di dalam lingkaran kita hanya menambah $i.

Jadi, jika kita tidak memiliki sisa, regex cocok, dan angkanya sama, ketiga syaratnya adalah $falsedan kita keluar dari loop. Sebagai hasilnya, kita bisa membiarkannya $i, dan hasilnya tersirat.

AdmBorkBork
sumber
0

PHP, 73 +1 byte

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

Jalankan sebagai pipa dengan -R.

loop $imelalui beberapa <input>sampai sum_of_digits-<input>dan tail_of_i-$npalsu; lalu cetak i.

Titus
sumber
0

m4, 210 byte

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

Menentukan makro fyang menghitung jawabannya. Agak lambat — luar biasa begitu — tetapi saya berjanji itu berhasil.

Saya pikir m4 akan menyenangkan karena memperlakukan bilangan bulat sebagai string secara default, tetapi ini sangat buruk.

Program man
sumber
0

Scala, 120 byte

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}

Ini bekerja sampai n = 70, setelah itu bilangan bulat melimpah. Untuk satu karakter tambahan, Intdapat berubah menjadi Longdan memungkinkan nilai untuk n > 100dihitung.

Ini versi yang sedikit lebih panjang yang tidak disunat:

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
}
Martin Tuskevicius
sumber
0

R , 115 byte

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}

Cobalah online!

Fungsi R yang mengerikan. Peningkatan F(dimulai pada 0) oleh nhingga nilai ditemukan yang memenuhi properti yang diperlukan, yang kemudian dikembalikan. Penggunaan anypada doubleekspresi mengirimkan peringatan untuk setiap iterasi dari loop, tetapi tidak mempengaruhi kebenaran.

Waktu habis pada TIO untuk input yang cukup besar (n = 55 atau lebih tinggi) tetapi harus menghitung solusi dengan benar karena diberikan waktu / ruang yang cukup.

Giuseppe
sumber
0

Perl 5, 46 44 +1 (-p) = 45 byte

2 byte disimpan berkat Xcali, tidak dapat menemukan yang lebih baik

($\=++$t.$_)%$_|$_-eval$\=~s//+/gr.0&&redo}{

jawaban pertama

$\=++$x.$_;eval$\=~s//+/gr."-$_"|$\%$_&&redo}{

Cobalah online

Nahuel Fouilleul
sumber
1
Berhasil menyimpan beberapa byte: Cobalah secara online!
Xcali
0

Jelly , 22 21 byte

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

Cobalah online!

Sunting: dikompresi menjadi satu baris

Penjelasan

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?

Butuh waktu berjam-jam untuk menulis karena saya belajar Jelly, tetapi sekarang sudah selesai, saya sangat puas. Untuk waktu yang lama saya tidak menyadari bahwa saya membutuhkannya ¤dan saya tidak bisa membuatnya bekerja. Melihat [ini] [1] kode yang dijelaskan dengan baik membantu saya menyegel transaksi. Banyak jawaban Jelly lainnya di PPCG juga memandu saya.

dylnan
sumber
0

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

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

NTCG
sumber
Saya tidak tahu banyak tentang golf Javascript, tapi saya cukup yakin Anda harus mempersingkat nama getNumberatau sumDigits.
Ørjan Johansen
Terima kasih banyak, saya tidak akan menang di sini, hanya ingin masuk ke tantangan ini: senyum:
NTCG
0

J , 37 33 byte

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

Cobalah 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

Membebani penghitung iterasi ~ 5 kali lebih cepat tetapi lebih lama 5 byte:

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

Cobalah online!

Bertambah sebesar 100, 27 byte :

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

Cobalah online!

FrownyFrog
sumber