Số tiếp theo với k fives


8

Thử thách:

Chương trình của bạn sẽ lấy hai số nguyên nklàm đầu vào, và xuất ra số nguyên nhỏ nhất lớn hơn (nhưng không bằng) ncó chứa ít nhất các klần xuất hiện của chữ số 5.

Bạn có thể giả định 1 ≤ k ≤ 151 ≤ n < 10**15.

Đây là một thách thức . Chương trình của bạn phải chạy trên TIO cho tất cả các trường hợp thử nghiệm và hoàn thành trong vòng 10 giây.

Quy tắc chung:

  • Đây là , vì vậy câu trả lời ngắn nhất bằng byte sẽ thắng.
    Đừng để ngôn ngữ mã-golf ngăn cản bạn đăng câu trả lời với các ngôn ngữ không mã hóa. Cố gắng đưa ra một câu trả lời càng ngắn càng tốt cho bất kỳ ngôn ngữ lập trình nào .

  • Quy tắc chuẩn áp dụng cho câu trả lời của bạn với quy tắc I / O mặc định , vì vậy bạn được phép sử dụng STDIN / STDOUT, các hàm / phương thức với các tham số thích hợp và kiểu trả về, chương trình đầy đủ. Cuộc gọi của bạn. Các tham số chức năng có thể được thực hiện theo thứ tự, nhưng vui lòng ghi rõ trong câu trả lời của bạn.

  • Lỗ hổng mặc định bị cấm.
  • Bạn phải thêm một liên kết với một bài kiểm tra cho mã của bạn (ví dụ TIO ).
  • Tiêu đề câu trả lời phải liệt kê điểm theo byte nhưng cũng là tổng thời gian thực hiện cho tất cả các trường hợp kiểm tra trên TIO
  • Nếu ngôn ngữ của bạn không có trên TIO, mã sẽ hoàn thành dưới 10 giây trên máy của bạn để bạn tự tin rằng nó đủ nhanh trên bất kỳ máy tính hợp lý nào.
  • Thêm một lời giải thích cho câu trả lời của bạn là rất khuyến khích.

Các trường hợp thử nghiệm:

(n, k) ->  output
(53, 2) -> 55
(55, 1) -> 56
(65, 1) -> 75
(99, 1) -> 105
(555, 3) -> 1555
(557, 1) -> 558
(5559, 3) -> 5565
(6339757858743, 5) -> 6339757859555
(99999999999999, 15) -> 555555555555555

Ví dụ chương trình:

Chương trình này là chính xác.


1
Lưu ý rằng thời gian trên TIO không hoàn toàn đáng tin cậy , mặc dù không đủ cho mã nhanh nhất nhưng nó có thể đủ cho thời gian hạn chế .
Laikoni

Tôi giả sử câu trả lời đúng (n, k) = (45, 1)50? Một số câu trả lời sai.
Neil

Câu trả lời:


5

R + stringr, 85 84 76 byte, .062s trên TIO

f=function(n,k,m=2+stringr::str_count(n+1,"5")-k)`if`(m<2,f(n+.1^m*2,k),n+1)

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

-1 byte nhờ Robert S.
-8 byte nhờ Giuseppe.

Một giải pháp đệ quy đơn giản sẽ là tăng thêm 1 cho đến khi tìm thấy câu trả lời, nhưng điều này sẽ không đáp ứng được giới hạn thời gian. Để đáp ứng giới hạn thời gian, chức năng này sử dụng thực tế là nếu thiếu p 5s, chúng ta có thể tăng thêm 2 * 10 ^ (p-2).

Lưu ý rằng khi p = 1, mức tăng trở thành 0,2. Điều này là ổn, vì sau 5 bước chúng tôi quay lại một số nguyên và không có số thập phân nào gặp phải trong thời gian trung bình có thêm 5. Nếu thay vào đó, chúng tôi đã tăng thêm 5 * 10 ^ (p-2) hoặc 1 * 10 ^ (p-2), sau đó chúng ta sẽ tìm thấy f (24, 1) = 24,5 thay vì 25 chẳng hạn.


2
Lưu 1 byte bằng cách sử dụng một ifbiến thể chức năng.
Robert S.

@RobertS. Cảm ơn. Tôi không biết về biến thể đó; Có nơi nào tôi có thể đọc thêm về nó?
Robin Ryder


1
Ngoài ra, bạn có thể đặt câu hỏi trong trò chuyện của người chơi golf R không hoạt động nhưng tốt hơn là không có gì :-)
Giuseppe

2
76 byte - Tôi không thực sự chắc chắn những gì ađang làm, vì vậy tôi đã loại bỏ nó và nó có vẻ ổn.
Giuseppe

3

Jelly , 37 byte 0.113 giây trên TIO

»DL‘Ɗ}©5xḌ_DḌÐƤ;®ŻṬ€UḌ¤+⁹D=5S>ʋƇ⁸’¤ḟṂ

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

Điều này hoạt động bởi

  1. tính toán tối đa số chữ số trong đầu vào cộng với một kvà tạo một số có nhiều số đó
  2. Trừ đầu vào từ số đó
  3. Tạo tất cả các hậu tố của số đó
  4. Đồng thời tạo ra tất cả các quyền hạn của mười từ 1 đến tiếp theo lớn hơn đầu vào lớn hơn đầu vào
  5. Thêm từng số trong 3 và 4 vào đầu vào
  6. Xóa câu trả lời với quá ít 5
  7. Lọc đầu vào từ câu trả lời
  8. Và trả về mức tối thiểu

@KevinCruijssen xin lỗi tôi có nghĩa là nhiều người vợ
Nick Kennedy

1
Hmm .. Có vẻ thất bại cho [557,1](kết quả 558thay vì 560); trường hợp thử nghiệm trong mô tả có vẻ không chính xác, vì [557,2]sẽ dẫn đến 558thay thế.
Kevin Cruijssen

3
@KevinCruijssen Tôi đã hỏi về điều này: ít nhất là k 5s không chính xác là k.
Nick Kennedy

À, vậy thì đúng rồi. :)
Kevin Cruijssen

2

05AB1E , 33 32 byte

sg>‚à©5s×α.s0š®Ý°0šâO+IKʒ§5¢¹@}ß

Cách tiếp cận tuyệt vời của Port @NickKennedy trong câu trả lời Jelly của anh ấy , vì vậy hãy đảm bảo nâng cao anh ấy !!

kn

Hãy thử trực tuyến hoặc xác minh tất cả các trường hợp thử nghiệm .

Giải trình:

sg>                # Get the length+1 of the second (implicit) input-integer
   ‚à              # Pair it with the first input-integer, and leave the maximum
     ©             # Store this maximum in the register (without popping)
      5s×          # Create an integer (actually, create a string..) with that many 5s
         α         # Take the absolute difference with the second (implicit) input
          .s       # Get the prefixes of that number
            0ª     # Prepended with an additional 0
    ®              # Get the maximum from the register again
     Ý             # Create a list in the range [0, max]
      °            # Raise 10 to the power of each integer
       0ª          # And also prepend an additional 0 to this list
              â    # Then create each possible pair of these two lists
               O   # Sum each pair
                +  # Add the second input to each sum
IK                 # Then remove the second input from this list (if present)
  ʒ                # And filter this list by:
   §               #  Cast the number to a string (bug, shouldn't be necessary)
    5¢             #  Count the amount of 5s in the string
      ¹@           #  And check if this count is larger than or equal to the first input
                 # After the filter: only leave the lowest number
                   # (which is output implicitly as result)

2

Stax , 17 byte (tổng số 6.861 giây trên TIO)

≈ª╞¥é£ôñτ←╝α┴╢JLd

Chạy và gỡ lỗi nó

Chương trình này có kntrên đầu vào tiêu chuẩn cách nhau bởi không gian. Stax không có cách thuận tiện để chạy nhiều trường hợp thử nghiệm trên TIO, vì vậy tôi đã chạy từng đầu vào riêng biệt và thêm thời gian. 99% thời gian là trong quá trình phiên dịch khởi động. Sử dụng trình thông dịch javascript trên staxlang.xyz, tất cả các trường hợp thử nghiệm chạy trong 50 mili giây.

Trường hợp thử nghiệm cuối cùng trên Dùng thử trực tuyến!

Thủ tục :

  1. Đầu vào tăng
  2. Nếu có đủ 5s, chấm dứt và in
  3. t= số lượng 5s trong số
  4. Thêm vào 10 ** t
  5. Đi 2

2

Python 2 , 70 68 byte (.025 giây trên TIO)

l=lambda n,k:'5'*k*(10**~-k>n)or-~n*(`n+1`.count('5')>=k)or l(n+1,k)

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

Điều này có thể là một chút của một căng; nó đúng trong mọi trường hợp và kết thúc trong thời gian không đáng kể cho các trường hợp thử nghiệm, nhưng không kết thúc trong thời gian hợp lý cho một số trường hợp khác. Nó về mặt kỹ thuật đáp ứng các yêu cầu mặc dù.

Nói tóm lại, nếu số nhỏ nhất có số klớn hơn n, chúng tôi sử dụng số đó vì đó rõ ràng là giải pháp chính xác. Nếu không, chúng tôi sử dụng phương pháp đệ quy tiêu chuẩn.


Tôi luôn đánh giá cao sự bẻ cong quy tắc trong golf.
đệ quy

1

Perl 5 -pl , 44 byte

$k=<>;$_++;s/.*?(?=5*$)/1+$&/e while$k>y/5//

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

Tìm thấy số đó là gì mà không có dấu vết 5s. Số phần đó tăng thêm 1. Tiếp tục cho đến khi đủ số 5 trong số. Mất khoảng 0,012 giây trên TIO để chạy tất cả các trường hợp thử nghiệm.


1

Python 3 , 144 98 86 75 byte

f=lambda N,k,d=1:k>str(-~N).count("5")and f(N+-(-~N//d+5)%10*d,k,d*10)or-~N

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

O(k)

Thuật toán là làm tròn từng chữ số (bắt đầu từ số có nghĩa nhỏ nhất) đến giá trị gần nhất là 5 cho đến khi biểu diễn thập phân của số mới có số lượng mong muốn.

Cách tiếp cận ban đầu đã sử dụng một danh sách hủy bỏ (D = iter (phạm vi (k)) và danh sách (D) tại nơi làm việc ở đây), nhưng @ ASCII-chỉ thuyết phục tôi rằng sẽ không bao giờ thắng được môn đánh gôn. Tôi không thích đệ quy, nhưng nếu thuật toán được viết để giảm thiểu độ sâu đệ quy, thì trình biên dịch / trình thông dịch trong tương lai sẽ đủ thông minh để thực hiện lại nó như một vòng lặp while.






1
đó (-(-~n//l+5))%10là lý do
ASCII - chỉ

0

Python 3 , 59 byte

Giải pháp đệ quy. Độ sâu đệ quy là một vấn đề (phải thay đổi cho số cao hơn), nhưng nó là chính xác.

lambda x,k:eval(("f(x+1,k)","x+1")[str(x+1).count("5")==k])

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


4
Điều này có đáp ứng giới hạn thời gian nếu độ sâu đệ quy đủ cao không? Tôi không thể tưởng tượng nó sẽ hoàn thành trường hợp thử nghiệm cuối cùng trong vòng 10 giây trên bất kỳ máy hợp lý nào.
Nick Kennedy


0

Java 8, 69 byte, hơn 60 giây trên TIO với trường hợp thử nghiệm cuối cùng, ~ 1,5 giây mà không có.

(n,k)->{for(;(++n+"").chars().filter(i->i==53).count()<k;);return n;}


Bất cứ ai có bất kỳ ý tưởng về làm thế nào để vượt qua trường hợp thử nghiệm cuối cùng?



0

Võng mạc , 63 byte

.+$
*
^.+
$.(*__
/((5)|.)+¶(?<-2>_)+$/^+`^.*?(?=5*¶)
$.(*__
1G`

Hãy thử trực tuyến! Thực hiện nktrên các dòng riêng biệt, nhưng liên kết bao gồm tiêu đề chuyển đổi bộ kiểm tra thành định dạng phù hợp. Giải trình:

.+$
*

Chuyển đổi ksang unary.

^.+
$.(*__

Tăng n. Việc *lặp lại đối số bên phải của nó (ở đây là _ký tự đầu tiên ) số lần được đưa ra bởi đối số bên trái của nó (như ở đây, mặc định cho trận đấu). Điều này dẫn đến một chuỗi có độ dài đó. Các $((những )được áp dụng) sau đó concatenates rằng với sự thứ hai _.làm cho chiều dài kết quả được thực hiện. (Trên thực tế, Retina 1 thông minh hơn thế và chỉ thực hiện phép tính trên độ dài cơ bản ở vị trí đầu tiên.)

/((5)|.)+¶(?<-2>_)+$/

Kiểm tra xem 5có thể tìm thấy đủ s nđể phù hợp với _s của đại diện đơn nguyên của k. Bài kiểm tra này đã được đánh gôn và sẽ nhanh hơn ba lần ^khi được thêm vào sau lần đầu tiên /và nhanh hơn nếu [^5]được sử dụng thay vì ..

^+`

Cho đến khi bài kiểm tra trôi qua ...

^.*?(?=5*¶)
$.(*__

... gia tăng nnhưng loại trừ dấu vết 5s.

1G`

Xóa k.


0

Ngao , 30 byte, ~ 0,2 giây trên TIO

=Q+r1=qC5R1?<qQ[=qrw<n#:q5QqiQ

Chuyển mã sang JS này (bộ kiểm tra đầy đủ được thêm vào cho thời gian của khóa học), trong đó inputslà một mảng của các đầu vào ( nthứ nhất, kthứ hai)

Cảm ơn @ArBo vì cách tiếp cận

Giải trình

=Q+r1=qC5R1?<qQ[=qrw<n#:q5QqiQ - Implicit Q = first input
=Q+r1                          - Q = next input (1st input) + 1
     =qC5R1                    - q = 2nd input 5s (eg 555 for k=3)
           ?<qQ[               - if q < Q...
                =qr            -   q = next input (2nd input)
                   w           -   while...
                     n         -     length of...
                      #:q5Q    -       Q.filter(q=>q==5)
                    <          -     is less than...
                           q   -       q
                            iQ -     Increment Q
                               - Implicit output of Q

0

C (gcc) , 159 158 152 150 149 byte, ~ 0,04 giây

Đưa ra câu trả lời cho STDOUT, với các số 0 đứng đầu.

-3 byte nhờ trần

m,j;f(n,k)long n;{char*t,s[17];for(t=s+sprintf(s,"%016ld",++n),m=n=0;m<k&--t>s;m<k&&*t-53?n=*t>53,*t=53:0)for(*t+=n,m=j=17;j--;)m-=s[j]!=53;puts(s);}

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.