Tạo số lớn nhất và nhỏ nhất


13

Lấy cảm hứng từ bài đăng này trên Puzzling. Dưới đây là spoilers cho câu đố đó.

Cho ba số nguyên dương làm đầu vào, (x, y, z)xây dựng phạm vi bao gồm [x, y], ghép phạm vi đó lại với nhau, sau đó loại bỏ zcác chữ số không nhất thiết liên tiếp để tạo ra các số nguyên dương lớn nhất và nhỏ nhất có thể. Các số 0 đứng đầu không được phép (nghĩa là các số phải bắt đầu bằng [1-9]). Xuất hai số đó theo thứ tự.

Đối với ví dụ từ bài khó hiểu, cho đầu vào (1, 100, 100), số lượng lớn nhất có thể là 99999785960616263646566676869707172737475767778798081828384858687888990919293949596979899100,
và số nhỏ nhất là 10000012340616263646566676869707172737475767778798081828384858687888990919293949596979899100,
sau khi bên dưới logic từ jafe của câu trả lời đăng ở đó:

  • Chúng tôi không thể ảnh hưởng đến độ dài của số (có một số chữ số cố định), vì vậy để tối đa hóa giá trị, chúng tôi lấy chữ số đầu tiên tối đa, sau đó là chữ số thứ hai, v.v.
  • Xóa 84 số không đầu tiên (còn lại 16 chữ số để xóa): 999995051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100
  • Số lớn nhất trong 17 chữ số tiếp theo là 7, vì vậy từ đây, chữ số tiếp theo trong câu trả lời có thể nhiều nhất là 7 (chúng tôi không thể xóa hơn 16 chữ số). Vì vậy, xóa 15 không 7 ... (còn lại 1 chữ số để xóa):999997585960616263646566676869707172737475767778798081828384858687888990919293949596979899100
  • Từ đây, chữ số tiếp theo có thể nhiều nhất là 8, vì vậy hãy xóa một số không 8 ở giữa: 99999785960616263646566676869707172737475767778798081828384858687888990919293949596979899100
  • Logic tương tự, nhưng đảo ngược (nghĩa là chúng ta muốn dẫn đầu 1thay vì dẫn đầu 9) cho số nhỏ nhất.

Đây là một ví dụ nhỏ hơn : (1, 10, 5).

Chúng tôi xây dựng phạm vi 12345678910và xác định những 5chữ số nào chúng tôi có thể loại bỏ để lại số lớn nhất có thể. Rõ ràng, điều đó có nghĩa là chúng tôi muốn tối đa hóa chữ số hàng đầu, vì chúng tôi không thể ảnh hưởng đến độ dài của đầu ra. Vì vậy, nếu chúng tôi xóa 12345, chúng tôi sẽ rời đi 678910và đó là số tiền lớn nhất chúng tôi có thể thực hiện. Làm cho nhỏ nhất là một chút khó khăn hơn, vì thay vào đó chúng ta có thể nhổ các con số từ giữa, để lại 123410càng nhỏ càng tốt.

Đối với (20, 25, 11), kết quả là khá nhàm chán, như 51.

Cuối cùng, để loại trừ các câu trả lời thử các số 0 đứng đầu, (9, 11, 3)đưa ra 91011lần lượt mang lại 9110là lớn nhất và nhỏ nhất.

I / O và Nội quy

  • Nếu nó dễ hơn / ngắn hơn, bạn có thể mã hai chương trình / hàm - một cho lớn nhất và một cho nhỏ nhất - trong trường hợp điểm của bạn là tổng của cả hai phần.
  • Đầu vào và đầu ra có thể được cung cấp bởi bất kỳ phương pháp thuận tiện .
  • Đầu vào có thể được coi là phù hợp với loại số gốc của ngôn ngữ của bạn, tuy nhiên , cả số được nối và đầu ra đều không thể được giả sử để làm như vậy.
  • Hoặc là một chương trình đầy đủ hoặc một chức năng được chấp nhận. Nếu một chức năng, bạn có thể trả lại đầu ra thay vì in nó.
  • Sơ hở tiêu chuẩn bị cấm.
  • Đây là vì vậy tất cả các quy tắc chơi gôn thông thường đều được áp dụng và mã ngắn nhất (tính bằng byte) sẽ thắng.

một danh sách các chữ số được chấp nhận là đầu ra?
Rod

Một trường hợp thử nghiệm sẽ mang lại mức tối thiểu không có thật khi đánh giá những người có số 0 đứng đầu có thể đáng giá - tôi nghĩ 9, 11, 3sẽ làm được.
Jonathan Allan

@Rod Yep, một danh sách các chữ số là tốt cho đầu ra.
admBorkBork

@Rod Tôi không biết bạn đang nói gì, tôi đã gõ rõ ràng "đầu ra" ở trên. ;-)
admBorkBork

@Jonathan ALLan Cuộc gọi tốt. Thêm.
admBorkBork

Câu trả lời:


5

Haskell , 162 byte

l=length
((m,f)%n)s|n>=l s=[]|n>0,(p,c:r)<-span(/=m(f$take(n+1)s))s=c:((m,id)%(n-l p)$r)|1>0=s
(x#y)z=[p%z$show=<<[x..y]|p<-[(maximum,id),(minimum,filter(>'0'))]]

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

Sử dụng thuật toán được mô tả bởi jafe. Có thể ngắn hơn để sử dụng một phương pháp kém hiệu quả hơn, nhưng điều này thú vị hơn để viết :)

Các %hoạt động mất 4 đối số (trên thực tế 3, nhưng bất cứ điều gì): mđó là một chức năng mà lựa chọn "tối ưu" thành viên từ một danh sách (hoặc maximumhoặc minimumtùy thuộc vào những gì chúng ta muốn); fđó là chức năng "lọc"; nsố chữ số còn lại để thả; và schuỗi. Đầu tiên chúng ta kiểm tra xem n có bằng số chữ số còn lại trong chuỗi không (tôi đã sử dụng >=cho an toàn) và bỏ phần còn lại snếu có. Mặt khác, chúng tôi kiểm tra xem chúng tôi có còn cần bỏ các chữ số ( n>0) không, sau đó chúng tôi sử dụng spanđể chia chuỗi của chúng tôi thành ba phần: pcác chữ số để thả, cchữ số tối ưu có thể tiếp cận vàrchuỗi còn lại. Chúng tôi thực hiện điều này bằng cách chuyển qua một vị từ kiểm tra sự bằng nhau so với chữ số tối ưu của chúng tôi. Để tìm chữ số đó, chúng tôi lấy các n+1chữ số đầu tiên của chuỗi, lọc nó, sau đó chuyển nó đến hàm "chooder" của chúng tôi. Bây giờ chúng tôi chỉ mang lại chữ số tối ưu của chúng tôi và lặp lại, trừ đi độ dài của p(số chữ số giảm) từ n. Lưu ý rằng chúng tôi không chuyển chức năng lọc của mình cho cuộc gọi đệ quy và thay vào đó, chúng tôi thay thế nó bằng id. Đó là bởi vì bộ lọc chỉ ở đó để tránh chọn các số 0 đứng đầu trong minimumtrường hợp chỉ liên quan đến lần lặp đầu tiên. Sau đó, chúng tôi không còn cần bất kỳ bộ lọc.

%thực sự chỉ có một hàm helper cho #đó là "thực" chức năng của chúng tôi, tham gia x, yz. Chúng tôi sử dụng một sự hiểu biết danh sách chỉ để tránh một chút lặp lại, lặp đi lặp lại các bộ dữ liệu chức năng của chúng tôi và chuyển chúng đi %cùng với zvà chuỗi kết nối. Chuỗi đó được tạo bằng cách sử dụng toán tử đơn vị ma thuật (=<<), trong bối cảnh này, hoạt động như thế nào concatMap.


3

Thạch , 17 byte

r/VDœcL_¥¥ḷ/ƇVṢ.ị

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

Tính toán tất cả các khả năng sau đó giữ lớn nhất và nhỏ nhất.

Đối số bên trái: x,yđể xây dựng phạm vi. Đối số đúng: zchữ số được loại bỏ.

r/VDœcL_¥¥ḷ/ƇVṢ.ị
r/                 Inclusive range from x to y
  V                Concatenate the digits together
   D               Get the resulting digits
         ¥         Dyad:
        ¥            Dyad:
      L                Length of the list of digits in the concatenated number.
       _               Subtract the number of digits to be removed.
    œc               Combinations without replacement. (remove z digits)
            Ƈ      Keep lists of digits that:
          ḷ/       have a positive first element (no leading zeros).
             V     Combine digits into integers. (vectorizes to ldepth 1)
              Ṣ    Sort the numbers
               .ị  Indexes at value 0.5 which yields the first and last elements.

2

Python 2 , 143 byte

import itertools
s,e,r=input()
l=''.join(map(str,range(s,e+1)))
L=[i for i in itertools.combinations(l,len(l)-r)if'0'<i[0]]
print min(L),max(L)

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

Điều này hoạt động bằng cách tính toán tất cả các kết hợp của kích thước đích (thứ tự phần tử được bảo toàn) và nhận được các số nhỏ nhất / lớn nhất từ ​​nó


Ồ ... tôi đoán là nó hoạt động lol. Tôi đã rất cố gắng để thực hiện một chương trình thực sự tính toán nó một cách xác định.
Don Ngàn

@RushabhMehta Tính toán lực lượng vũ phu vẫn mang tính quyết định, chỉ chậm hơn.
dyl Nam

2

Than , 56 byte hoặc 21 + 46 35 = 67 56 byte

≔⪫…·NNωθFN≔⌈EθΦθ⁻λνθθ

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:

≔⪫…·NNωθ

Nhập xy, tạo một phạm vi bao gồm và nối các số thành một chuỗi.

FN

Lặp lại một lần cho mỗi chữ số được loại bỏ.

≔⌈EθΦθ⁻λνθ

Tạo một danh sách các chuỗi được hình thành bằng cách loại bỏ từng ký tự có thể khỏi chuỗi hiện tại và lấy mức tối đa.

θ

In kết quả.

≔⪫…·NNωθF⊕N⊞υωΦθ∧⁼ι⌊Φ✂θκLυ¹∨κIλ⊞Oυω

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:

≔⪫…·NNωθ

Nhập xy, tạo một phạm vi bao gồm và nối các số thành một chuỗi.

F⊕N⊞υω

Nhập zvà tăng nó. Sau đó tôi tạo một danh sách có độ dài đó: Tôi cần có thể tăng zbên trong bộ lọc sau, nhưng chỉ các lệnh được phép tăng các biến; có một lỗ hổng trong đó làm PushOperatortăng chiều dài của danh sách.

 θ                      String of digits
Φ                       Filter over characters
         κ              Current index
          Lυ            Length of list i.e. current `z` value
            ¹           Literal 1
       ✂θ               Slice string of digits
      Φ                 Filter over characters
              κ         Outer index
               Iλ       Cast inner character to number
             ∨          Logical OR
     ⌊                  Minimum
   ⁼ι                   Equals the outer character
  ∧              ⊞Oυω   And also push to list i.e. increment `z`
                        Implicitly print

Lọc các ký tự mong muốn bằng cách kiểm tra rằng không có ký tự thấp hơn trong vùng có thể cắt được. Vùng bắt đầu bằng các z+1ký tự đầu tiên (vì có thể cắt đi phần đầu tiên znếu cần) và điểm cuối tăng cho mỗi ký tự được giữ. Cẩn thận không chọn số 0 cho ký tự đầu tiên.

Thuật toán nhanh hơn là 30 byte khi được sử dụng để tính số lớn nhất có thể:

≔⪫…·NNωθF⊕N⊞υωΦθ∧⁼ι⌈✂θκLυ¹⊞Oυω

Hãy thử trực tuyến! Liên kết là phiên bản dài dòng của mã. Chỉnh sửa: Kể từ đó tôi đã có thể kết hợp hai yếu tố trên thành một giải pháp 56 byte thứ hai, tạo ra cả hai kết quả:

≔⪫…·NNωθF⊕N⊞υω≔⮌υη⟦Φθ∧⁼ι⌈✂θκLυ¹⊞OυωΦθ∧⁼ι⌊Φ✂θκLη¹∨κIλ⊞Oηω

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:

≔⪫…·NNωθ

Tạo chuỗi ban đầu.

F⊕N⊞υω

Đại diện z+1là chiều dài của danh sách.

≔⮌υη

Đảo ngược danh sách do đó nhân bản nó và lưu kết quả.

In hai kết quả trên các dòng riêng biệt. (Một cách khác để làm điều này là phân tách kết quả với một \rký tự theo nghĩa đen .)

Φθ∧⁼ι⌈✂θκLυ¹⊞Oυω

Tạo số lượng lớn nhất có thể.

Φθ∧⁼ι⌊Φ✂θκLη¹∨κIλ⊞Oηω

Tạo số nhỏ nhất có thể bằng cách sử dụng danh sách nhân bản để theo dõi z.


1

Thạch ,  19  18 byte

rDẎœcL_⁵Ɗ$ị@Ƈ1ḌṢ.ị

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

1, 100, 100(19292)= =305812874887035355118559193163641366325011573739419723360


1

05AB1E , 16 byte

ŸSDg³-.Æʒ¬Ā}{Ć`‚

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

Chương trình đầy đủ, đọc đầu vào theo thứ tự này: y, x, z . Xuất ra một danh sách hai danh sách các ký tự.

Giải trình

ŸSDg³-.Æʒ¬Ā}{Ć`‚    Full program. Inputs: y, x, z.
Ÿ                   Inclusive binary range from x to y. Push [x ... y].
 S                  Dump the digits separately in a list.
  Dg                Duplicate, and use the second copy to get its length.
    ³-              Subtract z from the length.
      .Æ            Retrieve all combinations of length - z elements from the digits.
        ʒ  }        Keep only those that...
         ¬Ā         Don't start with a 0 (head, then Python-style boolean).
            {       Sort the remaining elements.
             Ć      Enclose. Pushes list + list[0] (appends its tail to itself)
              `     Dump all elements separately on the stack.
               ,    Pair, to get the last two, min and max (after enclosing)

Oh, Ć`‚là khá thông minh, câu trả lời tốt đẹp!
Kevin Cruijssen

0

Matlab, 95 byte

function[m]=f(s,e,c),a=sprintf('%d',s:e);x=str2num(combnk(a,length(a)-c));m=[min(x),max(x)];end

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

Trả về ma trận 1x2 với min và max.

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

% Full code
function[m]=f(s,e,c),a=sprintf('%d',s:e);x=str2num(combnk(a,length(a)-c));m=[min(x),max(x)];end

% The function
function[m]=f(s,e,c),                                                                       end

                     % Creates the range in a single string
                     a=sprintf('%d',s:e);

                                                   % Gets all the combinations
                                                   combnk(a,length(a)-c)

                                         % Converts the string combinations to integers
                                         x=str2num(                     );

                                                                          % Finds min and max
                                                                          m=[min(x),max(x)];
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.