Cơ sở lớn, chữ số nhỏ


19

Ngôn ngữ J có một cú pháp rất ngớ ngẩn để chỉ định các hằng số . Tôi muốn tập trung vào một tính năng đặc biệt: khả năng viết trong các cơ sở tùy ý.

Nếu bạn viết XbYcho Xbất kỳ số nào và Ybất kỳ chuỗi chữ số nào, thì J sẽ hiểu YXsố cơ sở , trong đó 0thông qua 9ý nghĩa thông thường của chúng và athông qua zđại diện từ 10 đến 35.

Và khi tôi nói Xbất kỳ số nào, tôi có nghĩa là bất kỳ số nào . Đối với mục đích của câu hỏi này, tôi sẽ giới hạn Xlà một số nguyên dương, nhưng trong J bạn có thể sử dụng bất cứ thứ gì: số âm, phân số, số phức, bất cứ thứ gì.

Điều kỳ lạ là bạn chỉ có thể sử dụng các số từ 0 đến 35 làm số cơ sở của mình - bất kỳ chữ số nào, bởi vì bộ sưu tập các ký hiệu có thể sử dụng của bạn chỉ bao gồm 0-9 và az.

Vấn đề

Tôi muốn có một chương trình giúp tôi chơi những con số ma thuật như 2.933.774.030.998 bằng phương pháp này. Chà, được thôi, có lẽ không lớn lắm, tôi sẽ dễ dàng với bạn. Vì thế...

Nhiệm vụ của bạn là viết chương trình hoặc hàm lấy số thập phân (thường là lớn) Ntrong khoảng từ 1 đến 4.294.967.295 (= 2 32 -1) làm đầu vào và xuất / trả về biểu diễn ngắn nhất của biểu mẫu XbY, trong đó Xlà số nguyên dương, Ylà một chuỗi gồm chữ cái và số (0-9 và az, trường hợp không nhạy cảm), và Ygiải thích cơ sở Xtương đương N.

Nếu độ dài của mỗi đại diện đại XbYdiện lớn hơn hoặc bằng số chữ số của N, thì đầu ra Nthay thế. Trong tất cả các mối quan hệ khác, bạn có thể xuất ra bất kỳ tập hợp con không trống nào của các biểu diễn ngắn nhất.

Đây là mã golf, nên ngắn hơn là tốt hơn.

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

      Input | Acceptable outputs (case-insensitive)
------------+-------------------------------------------------------
          5 | 5
            |
   10000000 | 79bkmom  82bibhi  85bgo75  99bauua  577buld
            | 620bq9k  999baka
            |
   10000030 | 85bgo7z
            |
   10000031 | 10000031
            |
   12345678 | 76bs9va  79bp3cw  82bmw54  86bjzky  641buui
            |
   34307000 | 99bzzzz
            |
   34307001 | 34307001
            |
 1557626714 | 84bvo07e  87brgzpt  99bglush  420blaze
            |
 1892332260 | 35bzzzzzz  36bvan8x0  37brapre5  38bnxkbfe  40bij7rqk
            | 41bgdrm7f  42bek5su0  45bablf30  49b6ycriz  56b3onmfs
            | 57b38f9gx  62b244244  69b1expkf  71b13xbj3
            |
 2147483647 | 36bzik0zj  38br3y91l  39bnvabca  42bgi5of1  48b8kq3qv
 (= 2^31-1) | 53b578t6k  63b2akka1  1022b2cof  1023b2661  10922bio7
            | 16382b8wv  16383b8g7  32764b2gv  32765b2ch  32766b287
            | 32767b241
            |
 2147483648 | 512bg000  8192bw00
            |
 4294967295 | 45bnchvmu  60b5vo6sf  71b2r1708  84b12mxf3  112brx8iv
 (= 2^32-1) | 126bh5aa3  254b18owf  255b14640  1023b4cc3  13107bpa0
            | 16383bgwf  21844b9of  21845b960  32765b4oz  32766b4gf
            | 32767b483  65530b1cz  65531b1ao  65532b18f  65533b168
            | 65534b143  65535b120

Nếu bạn không chắc chắn về việc liệu một số đại diện có bằng một số nào đó hay không, bạn có thể sử dụng bất kỳ trình thông dịch J nào, như phiên bản trên Dùng thử trực tuyến . Chỉ cần gõ stdout 0":87brgzptvà J sẽ nhổ ra 1557626714. Lưu ý rằng J chỉ chấp nhận chữ thường, mặc dù vấn đề này không phân biệt chữ hoa chữ thường.

Một số lý thuyết có thể hữu ích

  • Đối với tất cả Nít hơn 10.000.000, biểu diễn thập phân cũng ngắn như mọi phần khác và do đó là đầu ra duy nhất được chấp nhận. Để lưu bất cứ thứ gì bạn cần ngắn hơn ít nhất bốn chữ số trong cơ sở mới và thậm chí nhiều hơn nếu cơ sở lớn hơn 99.
  • Nó đủ để kiểm tra các cơ sở lên đến trần của căn bậc hai của N. Đối với bất kỳ cơ sở lớn hơn B , Nsẽ được nhiều nhất là hai chữ số trong cơ sở B , vì vậy lần đầu tiên bạn sẽ nhận được một cái gì đó bằng một chữ số đầu tiên hợp lệ là vào khoảng BN/ 35. Nhưng với kích thước đó, bạn sẽ luôn có kích thước tối thiểu bằng số thập phân, vì vậy không có điểm nào để thử. Điều đó trong tâm trí, ceil (sqrt (số lớn nhất tôi sẽ yêu cầu bạn giải quyết vấn đề này)) = 65536.
  • Nếu bạn có bất kỳ đại diện nào trong một cơ sở nhỏ hơn 36, thì đại diện cơ sở 36 sẽ ít nhất là ngắn. Vì vậy, bạn không phải lo lắng về các giải pháp vô tình ngắn trong các cơ sở nhỏ hơn 36. Ví dụ: đại diện 35bzzzzzzcho 1.892.332.260 sử dụng một chữ số bất thường cho cơ sở đó, nhưng 36bvan8x0có cùng độ dài.

Lol, 1557626714 = 420blaze ^ _ ^
DrQuarius

Câu trả lời:


9

JavaScript (ES6), 103 101 byte

Đưa đầu vào dưới dạng một chuỗi.

n=>[...Array(7e4)].reduce(p=>p[(r=++b+(g=x=>x?g(x/b|0)+(x%b).toString(36):'b')(n)).length]?r:p,n,b=2)

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

NB: Số lần lặp trong hàm đoạn trích được giới hạn ở mức 600 để các trường hợp kiểm tra hoàn thành nhanh hơn. (Sẽ mất vài giây nếu không.)


Nếu số của tôi quá lớn để làm việc với điều này, tôi sẽ sửa nó như thế nào? Tăng số lần lặp dường như không có ích.
FrownyFrog

N<232

Tra cứu "số độc hại", 2136894800297704.
FrownyFrog

@FrownyFrog Bạn có thể xử lý nó bằng cách tăng số lần lặp sử dụng Math.floor(x/b)thay vì x/b|0. (Nhưng tôi đã không kiểm tra nó.)
Arnauld

1
nó đã làm việc! Cảm ơn bạn.
FrownyFrog

3

Ruby , 118 byte

Điều này đã được liên kết trong một câu hỏi khác và tôi nhận thấy không có nhiều câu trả lời ở đây, vì vậy tôi quyết định cho nó một shot.

Đi qua tất cả các cơ sở lên đến và bao gồm đầu vào để xây dựng tất cả các cấu trúc số J hợp lệ. Mặc dù vậy, nó bỏ qua 1-8, vì không có cách nào những cái đó sẽ ngắn hơn dù sao đại diện cơ sở 10. Đó là một giải pháp khá ngây thơ, tất cả mọi thứ được xem xét, vì nó gọi hàm digitsdựng sẵn để lấy các chữ số, nhưng vì nó bắt đầu bằng chữ số ít quan trọng nhất trước tiên chúng ta phải reverselấy số thực tế, vì vậy nó có thể được cải thiện.

Nó chậm. Vì vậy, rất chậm. TIO lần ra vào 34307000, ví dụ. Chúng ta có thể đi với lựa chọn căn bậc hai hoặc thậm chí là lựa chọn của Arnauld 7e4để tiết kiệm thời gian, nhưng điều đó làm tốn thêm byte, vậy tại sao phải bận tâm?

->n{([n.to_s]+(9..n).map{|b|d=n.digits b;"#{b}b"+d.reverse.map{|i|i.to_s 36}*''if d.all?{|i|i<36}}-[p]).min_by &:size}

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

Hãy thử trực tuyến với w / sqrt để mọi thứ kết thúc đúng giờ


1

05AB1E , 37 byte

[¼35ݾãvtîEyNβQižhA«yèJ'bìNìDgIg@i\}q

10000000ã4

Nếu không có câu lệnh if cuối cùng, DgIg@i\}nó vẫn có thể được kiểm tra các giá trị thấp hơn, để xác minh rằng nó thực sự hoạt động: Hãy thử trực tuyến.

Sẽ xem liệu tôi có thể đưa ra một giải pháp (có thể lâu hơn nhưng hiệu quả hơn sau này).

Giải trình:

[              # Start an infinite loop:
 ¼             #  Increase the counter variable by 1 (0 by default)
 35Ý           #  Push a list in the range [0, 35]
 ¾ã            #  Take the cartesian product of this list with itself,
               #  with chunks-sizes equal to the counter variable
 v             #  Loop `y` over each of these lists:
  t            #   Take the square-root of the (implicit) input-integer
   î           #   Ceil it
  E            #   Loop `N` in the range [1, ceil(square(input))]:
   yNβ         #    Convert list `y` to base-`N`
   Qi          #    If it's equal to the (implicit) input-integer:
     žh        #     Push string "0123456789"
       A«      #     Append the lowercase alphabet
     yè        #     Index each value in list `y` into this string
     J         #     Join the characters to a single string
     'bì      '#     Prepend a "b"
        Nì     #     Prepend the number `N`
     D         #     Duplicate it
      g        #     And pop and push the length of this string
       Ig      #     Also push the length of the input
         @i }  #     If the length of the string is >= the input-length:
           \   #      Discard the duplicated string
     q         #     Stop the program
               #     (after which the result is output implicitly;
               #      or if the string was discarded and the stack is empty, it will
               #      implicitly output the implicit input as result instead)

1
Câu trả lời ấn tượng! Tôi nghĩ rằng bạn đang thiếu một quy tắc, mặc dù: "Nếu độ dài của mỗi đại XbYdiện đại diện lớn hơn hoặc bằng số chữ số của N, thì đầu ra Nthay thế." Mặc dù bạn có 10 triệu số đầu tiên được bảo hiểm, tôi nghi ngờ rằng đầu vào của 10000031sẽ trả lại một cái gì đó như thế nào 26blmoof. Số này hợp lệ, nhưng độ dài giống với đầu vào, vì vậy nó sẽ được trả về đầu vào thay thế.
Mực giá trị

@ValueInk ôi. Cảm ơn đã chú ý! Bây giờ nên được sửa chữa với chi phí của một vài byte.
Kevin Cruijssen
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.