Tạo giá trị lười biếng


25

Liên quan: Chương trình lò vi sóng của tôi . Lấy cảm hứng từ Tạo đầu vào lò vi sóng lười biếng .

Giá trị lười biếng của số nguyên N không âm là nhỏ nhất trong các số nguyên gần nhất với N trong khi tất cả các chữ số của chúng là giống hệt nhau.

Return (bằng bất kỳ phương tiện) giá trị lười biếng của một nhất định (bằng bất kỳ phương tiện) N .

Nsố nguyên lớn nhất mà ngôn ngữ của bạn đại diện ở dạng phi số mũ theo mặc định. 1000000 (Rất nhiều giải pháp thú vị bị mất vì yêu cầu quá cao này.)

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

   0 →    0
   8 →    8
   9 →    9
  10 →    9
  16 →   11
  17 →   22
  27 →   22
  28 →   33
 100 →   99
 105 →   99
 106 →  111
 610 →  555
 611 →  666
7221 → 6666
7222 → 7777 

Đồng nghiệp trong câu hỏi đã chứng minh rằng sẽ không có mối quan hệ nào: Ngoại trừ 9/11, 99/111, v.v ... trong đó một câu ngắn hơn câu kia, hai câu trả lời hợp lệ liên tiếp luôn cách nhau một khoảng lẻ, vì vậy không có số nguyên nào có thể chính xác bình đẳng từ họ.

Câu trả lời:


15

JavaScript (ES6), 31 byte

n=>~-(n*9+4).toPrecision(1)/9|0

Trực tiếp tính toán giá trị lười biếng cho mỗi n.

Chỉnh sửa: Chỉ hoạt động tối đa 277777778 do các giới hạn của loại số nguyên của JavaScript. Phiên bản thay thế:

n=>((n*9+4).toPrecision(1)-1)/9>>>0

35 byte, hoạt động lên đến 16666666667.

n=>((n=(n*9+4).toPrecision(1))-n[0])/9

38 byte, hoạt động lên tới 944444444444443. Nhưng vẫn còn thiếu 2 53 , đó là 9007199254740992.


@ user81655 Tôi đã thêm một số phiên bản thay thế với giới hạn số của chúng.
Neil

1
Tôi không thể làm cho thuật toán này hoạt động với Number.MAX_SAFE_INTEGERmột trong hai vì 8e16 - 1được thể hiện dưới dạng 8e16. Đáng buồn thay, có vẻ như cách duy nhất sẽ mã hóa cứng kết quả tối đa. Tuy nhiên +1.
dùng81655

@ user81655 Tôi hạ giới hạn trên để cho phép giải pháp.
Adám

Có bạn đến 10k @Neil, yêu thích golf!
NiCk Newman

1
@NiCkNewman Woohoo! Cảm ơn!
Neil

5

Thạch, 16 byte

ḤRµDIASµÐḟµạ³ỤḢị

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

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

ḤRµDIASµÐḟµạ³ỤḢị  Main link. Input: n

Ḥ                 Compute 2n.
 R                Yield [1, ..., 2n] or [0].
  µ               Begin a new, monadic chain. Argument: R (range)
   D              Convert to base 10.
    I             Compute all differences of consecutive decimal digits.
     A            Take the absolute values of the differences.
      S           Sum the absolute values.
       µÐḟ        Filter-false by the chain to the left.
          µ       Begin a new, monadic chain. Argument: L (lazy integers)
           ạ³     Take the absolute difference of each lazy integer and n (input).
             Ụ    Grade up; sort the indices of L by the absolute differences.
                  This is stable, so ties are broken by earlier occurrence and,
                  therefore, lower value.
              Ḣ   Head; retrieve the first index, corresponding to the lowest
                  absolute difference.
               ị  Retrieve the item of L at that index.

4

Oracle SQL 11.2, 200 byte

WITH v(i)AS(SELECT 0 FROM DUAL UNION ALL SELECT DECODE(SIGN(i),0,-1,-1,-i,-i-1)FROM v WHERE LENGTH(REGEXP_REPLACE(:1+i,'([0-9])\1+','\1'))>1)SELECT:1+MIN(i)KEEP(DENSE_RANK LAST ORDER BY rownum)FROM v;

Không chơi gôn

WITH v(i) AS
(
  SELECT 0 FROM DUAL      -- Starts with 0
  UNION ALL
  SELECT DECODE(SIGN(i),0,-1,-1,-i,-i-1) -- Increments i, alternating between negatives and positives
  FROM   v 
  WHERE  LENGTH(REGEXP_REPLACE(:1+i,'([0-9])\1+','\1'))>1  -- Stop when the numbers is composed of only one digit
)
SELECT :1+MIN(i)KEEP(DENSE_RANK LAST ORDER BY rownum) FROM v;

3

Pyth - 26 byte

Câu trả lời này không phải lúc nào cũng trả về giá trị nhỏ nhất trong một tie, nhưng điều đó không có trong thông số kỹ thuật, vì vậy, đang chờ làm rõ trong 3 byte.

hSh.g.a-kQsmsM*RdjkUTtBl`Q

Phòng thử nghiệm .


3

Bình thường, 16 byte

haDQsM*M*`MTSl`Q

Dùng thử trực tuyến: Trình diễn hoặc Test Suite

Giải trình:

haDQsM*M*`MTSl`Q   implicit: Q = input number
              `Q   convert Q to a string
             l     take the length
            S      create the list [1, 2, ..., len(str(Q))]
         `MT       create the list ["0", "1", "2", "3", ..., "9"]
        *          create every combination of these two lists:
                   [[1, "0"], [1, "1"], [1, "2"], ..., [len(str(Q)), "9"]]
      *M           repeat the second char of each pair according to the number:
                   ["0", "1", "2", ..., "9...9"]
    sM             convert each string to a number [0, 1, 2, ..., 9...9]
  D                order these numbers by:
 a Q                  their absolute difference with Q
h                  print the first one

3

MATL , 25 byte

2*:"@Vt!=?@]]N$vtG-|4#X<)

Sử dụng lực lượng vũ phu, vì vậy có thể mất một thời gian cho số lượng lớn.

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

2*:       % range [1,2,...,2*N], where is input
"         % for each number in that range
  @V      %   push that number, convert to string
  t!=     %   test all pair-wise combinations of digits for equality
  ?       %   if they are all equal
    @     %     push number: it's a valid candidate
  ]       %   end if
]         % end for each
N$v       % column array of all stack contents, that is, all candidate numbers
t         % duplicate
G-|       % absolute difference of each candidate with respect to input
4#X<      % arg min
)         % index into candidate array to obtain the minimizer. Implicitly display

3

Perl, 32

Dựa trên giải pháp JavaScript tuyệt đẹp của Neil.

$_=0|1/9*~-sprintf"%.e",$_*9+4.1

Bắt đầu thất bại tại 5e15


2

Toán học, 122 byte

f@x_:=Last@Sort[Flatten@Table[y*z,{y,1,9},{z,{FromDigits@Table[1,10~Log~x+1-Log[10,1055555]~Mod~1]}}],Abs[x-#]>Abs[x-#2]&]

Hàm có tên x.


2

JavaScript (ES6), 59 byte

n=>eval(`for(i=a=0;i<=n;a=i%10?a:++i)p=i,i+=a;n-p>i-n?i:p`)

Giải pháp đệ quy (56 byte)

Điều này ngắn hơn một chút nhưng không hoạt động n > 1111111110vì vượt quá kích thước ngăn xếp cuộc gọi tối đa, vì vậy nó không hợp lệ về mặt kỹ thuật.

f=(n,p,a,i=0)=>n<i?n-p>i-n?i:p:f(n,i,(i-=~a)%10?a:i++,i)

Giải trình

Lặp lại qua mỗi số lười cho đến khi số đầu tiên lớn hơn số nđó, sau đó so sánh nvới số này và số trước để xác định kết quả.

var solution =

n=>
  eval(`           // eval enables for loop without {} or return
    for(
      i=a=0;       // initialise i and a to 0
      i<=n;        // loop until i > n, '<=' saves having to declare p above
      a=i%10?a:++i // a = amount to increment i each iteration, if i % 10 == 0 (eg.
    )              //     99 + 11 = 110), increment i and set a to i (both become 111)
      p=i,         // set p before incrementing i
      i+=a;        // add the increment amount to i
    n-p>i-n?i:p    // return the closer value of i or p
  `)
N = <input type="number" oninput="R.textContent=solution(+this.value)"><pre id="R"></pre>


Tôi hạ thấp giới hạn trên để cho phép giải pháp của bạn.
Adám


1

05AB1E , 20 byte

9Ývy7L×})˜ïD¹-ÄWQÏ{¬

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

9Ý                   # Push 0..9
  vy7L×})˜           # For each digit, 0-9, push 1-7 copies of that number.
          ïD         # Convert to integers, dupe the list.
            ¹        # Push original input (n).
             -Ä      # Push absolute differences.
               WQ    # Get min, push 1 for min indices.
                 Ï{¬ # Push indices from original array that are the min, sort, take first.

99 chắc chắn là lười hơn 111, vì nó chỉ cần hai lần nhấn nút.
Adám

@ Adám đủ công bằng, thêm lệnh đầu.
Bạch tuộc ma thuật Urn

1

Toán học, 56 byte

Min@Nearest[##&@@@Table[d(10^n-1)/9,{n,0,6},{d,0,9}],#]&

Hàm thuần túy với đối số đầu tiên #, hoạt động cho đầu vào lên đến 10^6.

Đối với một số nguyên không âm nvà một chữ số d, 10^n-1 = 99...9( 9lần lặp lại n), vì vậy d(10^n-1)/9 = dd...d( dlần lặp lại n). Tạo một Tablegiá trị cho 0 <= n <= 60 <= d <= 9sau đó làm phẳng bảng, tìm danh sách các phần tửNearest đến #và lấy Min.

Tôi tin rằng phiên bản này sẽ hoạt động cho các số nguyên lớn tùy ý:

Min@Nearest[##&@@@Table[d(10^n-1)/9,{n,0,IntegerLength@#},{d,0,9}],#]&
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.