Đơn giản hóa các con số


15

Làm thế nào, bạn không thể nhớ số điện thoại 6 hoặc 7 chữ số xuất hiện trên màn hình TV trong một giây?! Sử dụng kỹ thuật đặc biệt được mô tả dưới đây, bạn sẽ biến thành một danh bạ đi bộ!

Rõ ràng, số 402dễ nhớ hơn số 110010010và số 337377dễ nhớ hơn số 957472. Điều này có nghĩa là số được ghi nhớ, một mặt, nên chứa càng ít chữ số càng tốt và mặt khác, số đó chứa càng nhiều số lặp lại càng tốt.

Là một tiêu chí cho sự khó nhớ, chúng tôi lấy tổng số chữ số trong số và số chữ số khác nhau trong số. Một số ghi nhớ có thể được viết trong một hệ thống số khác, có lẽ sau đó nó sẽ dễ nhớ hơn. Ví dụ, số 65535trong ký hiệu thập lục phân trông như thế nào FFFF.

Bài tập

Bạn cần viết chương trình chọn cơ sở của hệ thống số để giảm thiểu tiêu chí phức tạp. Cơ sở của hệ thống số phải được chọn trong phạm vi từ 2 đến 36, sau đó các số 0-9và chữ cái tiếng Anh A-Zcó thể được sử dụng để thể hiện số.

Đầu vào

Đầu vào chứa số nguyên thập phân từ 1 đến 999999999.

Đầu ra

Đầu ra phải chứa cơ sở của hệ thống số (từ 2 đến 36), giảm thiểu tiêu chí về độ phức tạp ghi nhớ và số trong hệ thống số được chọn, cách nhau bởi một khoảng trắng. Nếu một số cơ sở cho cùng một giá trị cho tiêu chí, thì hãy chọn nhỏ nhất trong số chúng.

Ghi chú

  • Các chữ cái phải viết hoa ( A-Z).

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

Đầu ra đầu vào

1              2 1

2              3 2

65535       16 FFFF

123          12 A3


16
Thách thức lớn, nhưng nó cần nhiều trường hợp thử nghiệm hơn.
Grimmy

7
Ngoài ra, định dạng đầu ra hơi quá nghiêm ngặt, bạn có thể muốn cho phép, ví dụ: một mảng gồm hai phần tử, cơ sở và chuỗi hoặc cho phép chúng theo thứ tự ngược lại hoặc cách nhau bởi một ký tự khác. Ngoài ra, tôi giả sử rằng bạn thêm tổng các chữ số vào số chữ số, nhưng bạn có thể muốn làm rõ điều đó.
Erik the Outgolfer

8
Tôi có thể sử dụng a-zthay vì A-Z?
Neil

5
Chúng ta chỉ có thể sử dụng các số tương ứng thay vì A-Z?
flawr

8
@VerNick Lần tới khi bạn viết một thử thách tương tự tôi sẽ đề nghị cho phép cả hai yêu cầu này, vì chúng chỉ là một sự phức tạp không cần thiết được khuyến khích: xem ví dụ ở đây .
flawr

Câu trả lời:


5

Python 2 , 150 149 127 144 byte

lambda n:min((len(c(n,b))+len(set(c(n,b))),b,c(n,b))for b in range(2,37))[1:]
c=lambda n,b,s='':n and c(n/b,b,chr(n%b+48+7*(n%b>9))+s)or s or'0'

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


Python 3 , 136 byte

lambda n:min((len((*c(n,b),*{*c(n,b)})),b,c(n,b))for b in range(2,37))[1:]
c=lambda n,b,s='':n and c(n//b,b,chr(n%b+48+7*(n%b>9))+s)or s

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


Python 3,8 (tiền phát hành) , 131 byte

lambda n:min((len((*(x:=c(n,b)),*{*x})),b,x)for b in range(2,37))[1:]
c=lambda n,b,s='':n and c(n//b,b,chr(n%b+48+7*(n%b>9))+s)or s

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


c chuyển đổi một số 10 cơ sở thành bất kỳ cơ sở nào (2-36) và hàm đầu tiên (ẩn danh) tìm thấy kết quả nhỏ nhất.


5

05AB1E , 16 14 byte

-1 byte nhờ Kevin Cruijssen

₆LBāøΣнDÙìg}1è

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

Hoặc thêm R) »ở cuối để tuân thủ chính xác định dạng đầu ra được chỉ định, nhưng hầu hết các câu trả lời khác không làm phiền.

Giải trình:

₆L          # range 1..36
  B         # convert the input to each of those bases
   āø       # enumerate (pair each element with its 1-based index)
Σ     }     # sort by
     g      # length
 н          # of the first element
    ì       # concatenated to
  DÙ        # itself, uniquified
1è          # take the second entry (first will always be base 1)

1
-1 byte bằng cách sử dụng ₆L©B®øthay vì₆LεBy‚}
Kevin Cruijssen

1
@KevinCruijssen Cảm ơn! -1 khác bằng cách sử dụng ā, có vẻ như bạn luôn quên nó.
Grimmy

Lol, tôi thực sự làm .. Tôi đã nhớ nó với thử thách này sớm hôm nay, không phải nó giúp được gì, haha ​​xD
Kevin Cruijssen

@recursive dường như bạn chưa đọc câu trả lời. Tôi liên kết một phiên bản tuân thủ các yêu cầu đầu ra nghiêm ngặt và giải thích lý do tại sao tôi không tạo ra phiên bản chính đó.
Grimmy

@Grimy có tội như bị buộc tội. Xin lỗi đã làm phiền bạn.
đệ quy


4

JavaScript (ES6),  87 85  101 byte

Chỉnh sửa: +16 byte vô dụng để tuân thủ định dạng đầu ra nghiêm ngặt

n=>(g=m=>--b>2?g(m<(v=new Set(s=n.toString(b)).size+s.length)?m:(o=b+' '+s.toUpperCase(),v)):o)(b=37)

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


À, tôi đã bỏ lỡ phần đó
TFeld

4

Japt v2.0a0 -gS, 24 23 byte

Không xinh, nhưng nó làm được việc. +2 byte cho yêu cầu hoàn toàn không cần thiết mà đầu ra là chữ hoa.

37o2@sX u ¸iXÃñÈÌiXÌâ)l

Thử nó

37o2@sX u ¸iXÃñÈÌiXÌâ)l     :Implicit input of integer
37o2                        :Range [2,37)
    @                       :Map each X
     sX                     :  Convert the input to a base-X string
        u                   :  Uppercase
          ¸                 :  Split on spaces (there are none, so this returns a singleton array)
           iX               :  Prepend X
             Ã              :End map
              ñ             :Sort by
               È            :Pass each X through the following function
                Ì           :  Last element of X
                 i          :  Prepend
                  XÌâ       :    Last element of X, deduplicated
                     )      :  End prepend
                      l     :  Length
                            :Implicit output of the first sub-array, joined with spaces

Vâng, nó hoạt động tốt, nhưng các chữ cái phải viết hoa.
Ver Nick nói Phục hồi lại

1
@VerNick, tại sao? Điều đó thêm hoàn toàn không có gì cho thách thức.
Xù xì

... Tôi đoán điều tiếp theo sẽ là "cách nhau một khoảng". Có vẻ như định dạng đầu ra đã được thực hiện rất nghiêm ngặt đối với thử thách này và từ các bình luận không có vẻ như nó sẽ thay đổi.
Jonathan Allan

@Jonathan ALLan, may mắn thay tôi có thể "sửa" cái đó bằng cách thay đổi cờ.
Xù xì

3

PHP ,124 119 byte

for($i=36;$b=strtoupper(base_convert($argn,10,--$i));$o[strlen($b.count_chars($b,3))]="$i $b");krsort($o);echo end($o);

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

Thật xấu hổ về +12 byte trong PHP để viết hoa đầu ra ... nhưng ... dù sao đi nữa.


3

Zsh , 85 byte

for b ({36..2})x=$[[#$b]$1]&&x=${x#*\#}&&a[$#x+${#${(us::)x}}]=$b\ $x
a=($a)
<<<$a[1]

Đối với số lượng câu lệnh bên trong vòng lặp for, việc sử dụng ...&&...&&...ngắn hơn {...;...;...;}.

for b ({36..2})                   # order decreasing: smaller bases overwrite larger ones
    x=$[[#$b]$1] && \             # set x to [base]#[num] 
    x=${x#*\#} && \               # strip leading [base]#
    a[$#x+${#${(us::)x}}]=$b\ $x  # use score as index to store "[base] [number]"
#            ${(us::) }           # (s::)plit into characters, take (u)nique
a=($a)                            # remove empty elements from array
<<<$a[1]                          # print out the first element (smallest score)

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

Đây là một giải pháp 81 byte in dưới dạng [base]#[num]thay thế:

for b ({36..2})x=$[[#$b]$1]&&y=${x#*\#}&&a[$#y+${#${(us::)y}}]=$x
a=($a)
<<<$a[1]

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



2

Than , 38 byte

Nθ≔EE³⁴↨θ⁺²ιL⁺ιΦι⁼λ⌕ικη≔⁺²⌕η⌊ηηIη ↥⍘θη

Hãy thử trực tuyến! Liên kết là phiên bản dài dòng của mã. Giải trình:

Nθ

Nhập số nguyên.

≔EE³⁴↨θ⁺²ι

Chuyển đổi nó từ cơ sở 2 sang cơ sở 36 ...

L⁺ιΦι⁼λ⌕ικη

... lặp lại, ghép và lấy chiều dài.

≔⁺²⌕η⌊ηη

Lấy chỉ số về độ phức tạp tối thiểu và thêm 2 để có được cơ sở.

Iη ↥⍘θη

In cơ sở và số nguyên được chuyển đổi sang cơ sở đó trong trường hợp in hoa.



2

Thạch , 25 byte

bⱮ36µQL+LN)Mḟ1Ḣ,ị‘ịØBʋ¥⁸K

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

Một liên kết đơn âm lấy một số nguyên làm đối số của nó và trả về một chuỗi Jelly có định dạng mong muốn. Nếu danh sách hai mục là đầu ra chấp nhận được (theo hầu hết các thử thách), có thể lưu 2 byte. Nếu cơ sở 1 được chấp nhận cho trường hợp cạnh 1 làm đầu vào, có thể tiết kiệm thêm 2 byte.






1

Ngôn ngữ Wolfram (Mathicala) , 109 111 byte

Print[a=OrderingBy[#~IntegerDigits~Range@36,Tr[1^#]+Tr[1^Union@#]&,1][[1]]," ",ToUpperCase[#~IntegerString~a]]&

+2: cố định. Cảm ơn bạn đã bắt @Roman

OrderingBy đã được giới thiệu trong Mathicala 12.0, mà TIO dường như chưa cập nhật.


"Nếu một số cơ sở đưa ra cùng một giá trị cho tiêu chí, thì hãy chọn giá trị nhỏ nhất trong số chúng.": OrderingByKhông phù hợp với yêu cầu này.
La Mã

Có lẽ một cái gì đó với MinimalBy, như thế này ?
La Mã

@Roman phải không? Theo như tôi có thể nói, nó bảo toàn thứ tự tương đối của hai chỉ số có cùng giá trị ..
attinat

2
Với đối số 123, giải pháp của bạn in 36 3Fthay vì yêu cầu 12 A3. Từ OrderingBy[123~IntegerDigits~Range@36, Tr[1^#] + Tr[1^Union@#] &]tôi nhận được câu trả lời {36, 35, 34, 33, 32, 31, 30, 29, 28, 27, 26, 25, 24, 23, 22, 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, 6, 5, 11, 10, 9, 8, 7, 4, 3, 2, 1}, vì vậy, giả định thông thường về việc không đặt hàng lại các mục tương đương dường như bị bỏ qua ở đây. My $Versionlà "12.0.0 cho Mac OS X x86 (64-bit) (ngày 7 tháng 4 năm 2019)".
La Mã

À, bạn nói đúng. Xấu của tôi vì đã không nhận ra điều đó
attinat

1

C (tiếng kêu) , 165 byte

n,i=2,j,p=99,r,m,x;char*g,*_,b[74][37];t(n){for(;g=b[i],i<37;r=j<p?_=g,p=j,i:r,++i)for(j=0,m=n;m;m/=i,*--g=x+=x>9?87:48)j+=b[i+36][x=m%i]++?1:2;printf("%i,%s",r,_);}

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

n // đầu vào

, i = 2 // iterator từ cơ sở 2 đến 36

, j // độ phức tạp hiện tại

, p = 99 // độ phức tạp tốt nhất

, r // result = iterator

, m // bản sao tạm thời của n

, x; // m% i

char * g // chuỗi hiện tại ptr

, * _ // ptr tốt nhất

, b [74] [37]; // bộ đệm

/ * [37 + 37] = [chuỗi thu được + kiểm tra các ký tự được sử dụng] * /

t (n) {

for (; g = b [i], // di chuyển ptr

   i<37 ; 
   r=j<p?_=g,p=j,i:r, // save best solution

   ++i){//for every base

for (j = 0, m = n; m; m / = i, // trích xuất chữ số

   *--g=x+=x>9?87:48)
   // move ptr backward for printf use and transform to ascii value

j + = b [i + 36] [x = m% i] ++? 1: 2; // tăng byte liên quan đến ký tự

// và nếu nó là 0 gia số j tăng 2: 1 cho ký tự mới được sử dụng và 1 cho số lượng chữ số

// khác chỉ tăng số chữ số + di chuyển con trỏ

// printf ("% s -", ​​g); // kiểm tra

// printf ("r% ip% ij% i \ n", r, p, j); // kiểm tra

}

printf ("% i,% s", r, _); // đầu ra

}


1
163 byte có thể được gọi nhiều lần.
trần mèo

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.