Tìm số nguyên dương nhỏ nhất kết thúc bằng n, chia hết cho n và có các chữ số tổng bằng n


33

Đó là tất cả trong tiêu đề ...

Lấy đầu vào là một số nguyên dương n>=12và ... làm những gì tiêu đề nói.

Vâng, đây là trên OEIS A187924 .

Một số trường hợp thử nghiệm

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

Đây là . Mã ngắn nhất trong byte thắng!


Bình luận không dành cho thảo luận mở rộng; cuộc trò chuyện này đã được chuyển sang trò chuyện .
Martin Ender

Để kết thúc một phần của những gì đã được chuyển sang trò chuyện: bản chỉnh sửa của tôi cho OEIS chứng minh rằng 11 là số duy nhất không có giải pháp mới được phê duyệt.
Ørjan Johansen

Câu trả lời:


19

Befunge, 81 byte

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

Hãy thử trực tuyến!

Ít nhất có thể xử lý tối đa n = 70, sau đó, một số giá trị sẽ bắt đầu vượt quá kích thước ô ngăn xếp trên hầu hết các triển khai và trên những điều không thực hiện, sẽ mất rất nhiều thời gian để không phải chờ đợi để tìm hiểu.

Với những ràng buộc đó, chúng tôi thậm chí không bận tâm đến việc xử lý các giá trị n lớn hơn 99, điều đó có nghĩa là chúng tôi có thể dễ dàng kiểm tra hơn nếu giá trị kết thúc bằng n bằng cách đơn giản so sánh giá trị modulo 100 với n .

Dưới đây là chi tiết chi tiết của mã.

Mã nguồn với các đường dẫn thực thi được tô sáng

*Đọc n từ stdin và lưu trong bộ nhớ.
*Khởi tạo giá trị thử nghiệm v thành 0 và bắt đầu vòng lặp chính, tăng v lên phía trước.
*Kiểm tra nếu v%n == 0và nếu không trở về điểm bắt đầu của vòng lặp chính.
*Kiểm tra nếu v%100 == nvà nếu không trở về điểm bắt đầu của vòng lặp chính.
*Tính tổng các chữ số trong v bằng cách liên tục thêm v modulo 10 và chia v cho 10.
*Kiểm tra xem tổng có bằng n không và nếu không trở về đầu của vòng lặp chính.
*Nếu không thì đầu ra v và thoát.


12

05AB1E , 14 byte

[NI«ÐIÖsSOIQ*#

Hãy thử trực tuyến!

Giải trình

Các giải pháp yêu cầu tiền tố lớn sẽ hết thời gian trên 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

Nếu cảm thấy như thể 05AB1E gian lận, vì nó rất tốt. Cách duy nhất để vượt qua điều này một dặm là tạo ra một ngôn ngữ 'nén' lập trình tham chiếu đến ngôn ngữ trong quá khứ. Tôi gửi ans = dic [1] lol
Pathfinder

@Pathfinder: Có một vài ngôn ngữ ngoài kia có thể liên tục đánh bại 05AB1E, vì vậy chúng tôi vẫn có thể hy vọng sẽ thấy một cái gì đó thậm chí ngắn hơn :)
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>

Đưa đầu vào dưới dạng một chuỗi. Cần một trình duyệt có hỗ trợ đệ quy đuôi cho kết quả lớn hơn. Chỉnh sửa: Đã lưu 1 byte nhờ @Arnauld.


eval([s,...a].join`-`)?cũng sẽ hoạt động, mặc dù nó không ngắn hơn ...
Sản phẩm ETH

@Arnauld Không, tôi chỉ quên rằng tôi có thể làm điều đó với ||.
Neil

8

Brachylog v2, 12 10 byte

a₁.;A×?≜ẹ+

Hãy thử trực tuyến!

Đây là một đệ trình hàm nhận đầu vào qua .và tạo đầu ra thông qua ?(ngược lại với quy ước thông thường; tất cả các hàm Brachylog có chính xác hai đối số, có thể là đối số đầu vào hoặc đầu ra, nhưng ngôn ngữ không thực thi bất kỳ cách sử dụng đối số cụ thể nào). Chúng tôi thường không xem xét các quy ước cho việc sử dụng đối số có liên quan tại PPCG .

Giải trình

Một phiên bản trước của giải pháp này có trường hợp đặc biệt ( Ḋ|nghĩa là "trả về chữ số theo nghĩa đen") cho các chữ số đơn, nhưng câu hỏi rõ ràng nói rằng bạn không phải kiểm tra điều đó (cảm ơn @DLosc vì đã nắm bắt được điều này), vì vậy tôi đã xóa nó (Giải pháp dưới dạng văn bản sẽ không hoạt động trên các chữ số đơn lẻ vì Brachylog sẽ không coi 1 là khả năng cho một ẩn số trong phép nhân, để ngăn chặn các vòng lặp vô hạn; phép nhân của nó là tùy ý.)

Vì vậy, câu trả lời này bây giờ đi cho một bản dịch trực tiếp khá nhiều đặc điểm kỹ thuật. Bắt đầu bằng ?(đầu ra / số mà chúng tôi đang cố gắng tìm; một vị từ Brachylog luôn luôn bắt đầu bằng ?) chúng tôi sử dụng a₁.để khẳng định rằng nó có .(đầu vào) là hậu tố. Sau đó, ;A×?có nghĩa là chúng ta có thể nhân ( ×) kết quả với một cái gì đó ( ;A) để tạo ra ?(đầu ra). Cuối cùng, tính ẹ+tổng ( +) các chữ số ( ) của ?và theo mặc định, một xác nhận ngầm định ở cuối mỗi chương trình Brachylog mà kết quả cuối cùng tạo ra .. Vì vậy, nói cách khác, chương trình này là " .là hậu tố của ?, .nhân với một cái gì đó ?, .là tổng số của? ", mà là rất gần với một bản dịch theo nghĩa đen của chương trình gốc.

Điều này là cần thiết cho yêu cầu tổng số chữ số được thi hành. Tôi giả sử một cái gì đó không giống như những điều chưa biết, vì vậy, Brachylog nói với Brachylog sử dụng cách tiếp cận vũ phu cho phần đó của chương trình hơn là đại số.


6

Haskell , 72 byte

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

Hãy thử trực tuyến!

Lưu ý rằng số tìm thấy trừ n phải là bội của cả n và 10 ^ chiều dài (n).

Lấy cảm hứng từ Laikoni và hoàn toàn nhân đạo


Chào mừng đến với trang web!
DJMcMayhem

3
Thay đổi lcm n(10^length(show n))thành lcm(10^length(show n))n1 byte
H.PWiz

6

Alice , 35 byte

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

Hãy thử trực tuyến!

Giải trình

Chương trình này có sự pha trộn và tương tác thực sự tốt đẹp giữa chế độ Cardinal (xử lý số nguyên) và chế độ Thông thường (xử lý chuỗi).

Khung thông thường cho các thách thức với I / O thập phân hoạt động chủ yếu ở chế độ Cardinal:

/o 
\i@/...

Và chương trình thực tế:

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

-26 cảm ơn JollyJoker

-7 một lần nữa nhờ JollyJoker

-11 cảm ơn Oliver Grégoire

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

Hãy thử trực tuyến!

Phải yêu Java! Cũng có thể là tôi đang sử dụng một cách tiếp cận không hiệu quả, nhưng không có chức năng tổng kiểm tra tích hợp và chuyển đổi kép thành Chuỗi để kiểm tra kết thúc của số byte chi phí ...

Ung dung:

  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)nên làm việc.
JollyJoker

@JollyJoker rực rỡ, cảm ơn vì đã khiến tôi cảm thấy ngu ngốc: P
Luca H

1
Heh. n/=10thay vì n=n/10quá Ngoài ra, i+=atrong vòng lặp for để bạn có thể bỏ qua kiểm tra chia hết.
JollyJoker

@JollyJoker wow, tôi đã làm nó cho số tiền nhưng không phải cho bộ phận ... Cảm ơn bạn, tôi sẽ thêm nó ngay
Luca H

1
92 byte , sử dụng API, ngắn hơn so với tự tính toán. Ngoài ra, dấu chấm phẩy không phải là một phần của bytecount vì ví dụ lambda hợp lệ có thể được đưa ra làm đối số phương thức và sau đó bạn không cần dấu chấm phẩy đó.
Olivier Grégoire

4

Toán học, 72 byte

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

-18 byte từ @MartinEnder

Hãy thử trực tuyến!

Đây là một phiên bản khác từ Martin Ender
Cách tiếp cận này có thể lên tới n=40(41 vượt quá giới hạn lặp mặc định)

Toán học, 65 byte

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

Hãy thử trực tuyến!


3

Python 2 , 74 byte

Giải pháp này giả định rằng n <= sys.maxint.

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

Hãy thử trực tuyến!


Thay thế str(x)bằng xback-tick hai lần để tiết kiệm 6 byte (làm thế nào để bạn thoát back-tick bên trong back-tick?).
Chas Brown

@ChasBrown `dấu gạch chéo ngược bên trong backticks.
wvxvw

@ChasBrown không, vì đối với các số nguyên dài sẽ thêm một Lsố có thể làm rối thuật toán.
FlipTack

3

C (gcc) 71 69 byte, không thành công trên 100

Tôi đã thử với dài và% 1000 nhưng hết thời gian

-2 byte nhờ hộp ổn định

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

Dùng thử trực tuyến


Đã học một mẹo mới ngày hôm nay với j * = 1 == return j trick. Mã đẹp.
Michael Dorgan

stackoverflow.com/questions/2598084/ (toán cuối cùng được trả lại.)
Michael Dorgan


@Steadybox cảm ơn bạn, tôi sẽ làm điều đó
PrincePolka


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

Hãy thử trực tuyến!

  • 6 byte được lưu nhờ Emigna và khả năng kỳ lạ của tôi để viết (""+n)ở một số nơi và n.ToString()ở những nơi khác.

n=>{for(int i=n;n%100!=i|n%i>0|(""+n).Sum(c=>c-'0')!=i;n++);return n;}tiết kiệm 20 byte.
Emigna

@Emigna tại sao n%100? Nếu như n>100?
Charlie

Ồ vâng, bỏ qua phần đó. Đó là từ thử nghiệm với đầu vào 2 chữ số. Bản mod sẽ phải là 10 ^ len (đầu vào). Có lẽ là không đáng
Emigna



1

Pip , 18 byte

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

Thuật toán lấy cảm hứng từ câu trả lời của Emigna . Hãy thử trực tuyến!

Làm thế nào nó hoạt động

                    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 byte

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

@totallyhuman Đã sửa
l4m2

Trong bảng điều khiển, nó xuất ra mà không có cảnh báo () vì vậy tôi đoán
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

Hãy thử trực tuyến!

Giải trình:

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.

Tôi tự hỏi liệu phần "kết thúc n" có thể được rút ngắn. Tôi cũng đã thử show n`elem`scanr(:)""(show x), nhưng nó lâu hơn.





0

PowerShell , 84 byte

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

Hãy thử trực tuyến!

Xây dựng đơn giản nhưng lệnh dài. Đã hết thời gian trên TIO n=100, nhưng nếu chúng tôi đặt rõ ràng ilà đóng, nó sẽ xuất ra chính xác.

Đây chỉ là một forvòng lặp đơn giản mà tiếp tục kéo dài miễn là bất kỳ một trong những điều kiện là đúng. Ba điều kiện là 1) $i%$n, tức là chúng ta có một phần còn lại; 2) $i-notmatch"$n$", nghĩa là, nó không khớp với hai chữ số cuối cùng; và 3) ([char[]]"$i"-join'+'|iex)-$n, nghĩa là các chữ số được cộng lại với nhau không bằng$n (ở đây được kiểm tra bằng phép trừ đơn giản, vì các giá trị khác 0 là trung thực). Trong vòng lặp, chúng tôi chỉ đơn giản là tăng$i .

Do đó, nếu chúng ta không có phần còn lại, regex khớp và các số bằng nhau, cả ba điều kiện đều được $falsevà chúng ta thoát khỏi vòng lặp. Kết quả là, chúng ta chỉ có thể rời khỏi $iđường ống và đầu ra là ẩn.


0

PHP, 73 + 1 byte

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

Chạy như ống với -R .

các vòng lặp $iqua bội số <input>cho đến khi sum_of_digits-<input>và sai tail_of_i-$nlệch; sau đó in i.


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

Xác định một macro fmà tính toán câu trả lời. Nó hơi chậm một cách khó tin, vì vậy, nhưng tôi hứa nó sẽ hoạt động.

Tôi nghĩ m4 sẽ tốt vì nó mặc định là số nguyên dưới dạng chuỗi, nhưng điều này khá tệ.


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}

Điều này hoạt động cho đến khi n = 70, sau đó số nguyên tràn. Đối với một ký tự phụ, Intcó thể thay đổi thành a Longvà cho phép các giá trị chon > 100 được tính toán.

Đây là phiên bản dài hơn một chút:

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

Hãy thử trực tuyến!

Chức năng R khủng khiếp. Số gia tăng F(bắt đầu từ 0) bởin cho đến khi tìm thấy một giá trị thỏa mãn các thuộc tính cần thiết, sau đó nó trả về. Việc sử dụng anytrên một doublebiểu thức sẽ gửi một cảnh báo cho mỗi lần lặp của vòng lặp, nhưng không ảnh hưởng đến tính chính xác.

Đã hết thời gian trên TIO cho các đầu vào đủ lớn (n = 55 hoặc cao hơn) nhưng nên tính toán chính xác giải pháp được cung cấp đủ thời gian / không gian.



0

Thạch , 22 21 byte

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

Hãy thử trực tuyến!

Chỉnh sửa: nén thành một dòng

Giải trình

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?

Điều này khiến tôi mất nhiều giờ để viết vì tôi đang học Jelly nhưng bây giờ tôi đã hoàn thành, tôi rất hài lòng. Trong một thời gian dài tôi đã không nhận ra mình cần ¤và tôi không thể làm cho nó hoạt động được. Nhìn vào [điều này] [1] mã giải thích tốt đã giúp tôi đóng dấu thỏa thuận. Rất nhiều câu trả lời Jelly khác trong PPCG cũng hướng dẫn tôi.


0

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

Cách sử dụng: 1. getNumber (12) 2. getNumber (13) 3. ....


Tôi không biết nhiều về chơi golf Javascript, nhưng tôi khá chắc chắn rằng bạn nên rút ngắn tên getNumberhoặc sumDigits.
Ørjan Johansen

Cảm ơn bạn rất nhiều, tôi không đi đến đây để chiến thắng, chỉ muốn tham gia thử thách này: cười:
NTCG

0

J , 37 33 byte

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

Hãy thử trực tuyến!

                                ~    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

Chuẩn bị bộ đếm lặp nhanh hơn ~ 5 lần nhưng dài hơn 5 byte:

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

Hãy thử trực tuyến!

Tăng thêm 100, 27 byte :

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

Hãy thử trực tuyến!


Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.