Một số cơ sở nhưng không phải hai lần cùng một chữ số


15

Đầu vào

Một mảng không trống của các số nguyên dương.

Bài tập

Chuyển đổi từng số nguyên thành nhị phân, bát phân, thập phân hoặc thập lục phân theo cách mà mỗi chữ số ( 0 đến F ) được sử dụng nhiều nhất một lần.

Đầu ra

Danh sách các căn cứ đã được sử dụng để giải câu đố.

Ví dụ chi tiết

Đầu ra dự kiến ​​cho [16, 17][bát phân, thập phân] .

Đây là lý do tại sao:

  • Chúng ta không thể đơn giản sử dụng số thập phân cho cả hai số, vì cả hai đều chứa 1 .
  • 16 không thể được chuyển đổi thành nhị phân, vì đại diện của nó trong cơ sở này ( 10000 ) chứa một số 0 .
  • 17 cũng không thể được chuyển đổi thành nhị phân, bởi vì đại diện của nó trong cơ sở này ( 10001 ) chứa một số 0 và vài 1 .
  • 17 không thể được chuyển đổi thành thập lục phân, vì đại diện của nó trong cơ sở này ( 11 ) bao gồm hai 1 's.
  • Hãy xem xét tất cả các khả năng còn lại:

                   +---------+---------+--------+
                   | oct(16) | dec(16) | hex(16)|
                   | = 20    | = 16    | = 10   |
    +--------------+---------+---------+--------+
    | oct(17) = 21 | 20,21   | 16,21   | 10,21  |
    | dec(17) = 17 | 20,17   | 16,17   | 10,17  |
    +--------------+---------+---------+--------+
    

    Giải pháp khả thi duy nhất là chuyển đổi 16 theo số bát phân ( 20 ) và giữ 17 theo số thập phân ( 17 ). Bằng cách này, các chữ số 0 , 1 , 27 được sử dụng chính xác một lần.

Làm rõ và quy tắc

  • Đầu vào được đảm bảo để dẫn đến một giải pháp độc đáo. Mã của bạn không được phép hỗ trợ các mảng cung cấp một số giải pháp hoặc không có giải pháp nào cả.
  • Bạn có thể xuất các cơ sở ở bất kỳ định dạng hợp lý nào, chẳng hạn như ["bin", "oct", "dec", "hex"] , ['b', 'o', 'd', 'h'] , "BODH " , [2,8,10,16] , [0,1,2,3], v.v ... Nhưng nó cần được giải thích rõ ràng trong câu trả lời của bạn.
  • Thứ tự của các cơ sở trong đầu ra phải khớp với thứ tự của các số nguyên đầu vào.
  • Nếu điều đó có ích, bạn có thể cho rằng đầu vào được sắp xếp từ thấp nhất đến cao nhất hoặc từ cao nhất đến thấp nhất.
  • Đây là , vì vậy câu trả lời ngắn nhất bằng byte sẽ thắng!

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

Bạn không phải xuất kết quả chuyển đổi được liệt kê bên dưới. Họ hoàn toàn là thông tin.

Input                                  | Output          | Conversion result
---------------------------------------+-----------------+------------------------
[ 119 ]                                | O               | 167
[ 170 ]                                | D               | 170
[ 64222 ]                              | H               | FADE
[ 16, 17 ]                             | O/D             | 20/17
[ 14, 64, 96 ]                         | H/H/D           | E/40/96
[ 34, 37, 94 ]                         | O/D/H           | 42/37/5E
[ 2, 68, 82 ]                          | B/D/H           | 10/68/52
[ 22, 43, 96 ]                         | O/O/O           | 26/53/140
[ 3639, 19086, 57162 ]                 | H/D/H           | E37/19086/DF4A
[ 190, 229, 771 ]                      | O/H/O           | 276/E5/1403
[ 2, 44, 69, 99 ]                      | B/H/H/H         | 10/2C/45/63
[ 75, 207, 218, 357, 385 ]             | H/H/H/D/O       | 4B/CF/DA/357/601
[ 12, 28, 46, 78, 154, 188, 222, 240 ] | D/O/O/D/H/H/H/H | 12/34/56/78/9A/BC/DE/F0

Danh sách đầu vào thô có sẵn ở đây .


chúng ta nên quan tâm đến một số khía cạnh của hiệu quả? (giống như nếu mảng có độ dài 1000 hoặc đại loại như thế)
DanielIndie

3
@DanielIndie Không, bạn không cần phải làm vậy. Ngoài ra, một câu đố gồm 1000 mục sẽ bao gồm rất nhiều chữ số trùng lặp, bất kể các cơ sở được sử dụng, vì vậy nó không thể là một số hợp lệ. (Điều này được đảm bảo không xảy ra theo quy tắc đầu tiên.)
Arnauld

vâng, bạn đúng ... ngu ngốc cho tôi ... :)
DanielIndie

1
Thực sự mong đợi một giải pháp Japt, vì tôi đã thử nó và không thể tìm thấy một giải pháp tốt.
Nit

2
@Scrooble Không. :) Rất vui được thử!
Arnauld

Câu trả lời:


4

JavaScript (Node.js) , 192.155.154.152.151.145.136,113,99,92 90 byte

  • cảm ơn @Arnauld đã nhắc nhở tôi rằng tôi có thể trả lại [0,1,2,3] -> đó là [2,8,10,16] tiết kiệm 8 byte và cho ý tưởng tuyệt vời (giúp giảm 23+ byte)
  • cảm ơn @Kevin Cruijssen vì đã giảm 1 byte
f=([c,...a],t="")=>c?[1,4,5,8].find(b=>T=!/(.).*\1/.test(n=t+c.toString(b*2))&&f(a,n))+T:a

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

Giải trình:

[c,...a]- Thủ thuật @Arnauld để lấy một mục tại một thời điểm c?***:" "-> nếu c không được xác định, chúng tôi đã quản lý để đi đến kết quả cuối cùng- [] - nếu tôi sẽ đặt "" thì kết quả tìm thấy sẽ không được coi là hợp pháp. ([] + 5 = "5" JS FTW) [1,4,5,8].findmỗi khi chúng tôi tìm thấy cơ sở chính xác (đầu ra sẽ là của mảng này (1,4,5,8) -> (2,8,10,16) hợp pháp của nó. bây giờ cách tìm kiếm hoạt động -> nếu nó tìm thấy một cái gì đó, nó trả về phần tử (1-8) và hơn là tôi thêm kết quả của giải pháp bên trong. Nếu không tìm thấy thì nó trả về không xác định + T bây giờ là sai -> NaN mà trong cuộc gọi phụ huynh sẽ được coi là sai

!/(.).*\1/.test(n=t+b) xác định xem chuỗi có trùng lặp hay không, nếu vậy:

f(a,n)) chỉ cần đi số tiếp theo (a bây giờ là mảng.slice (1)) với chuỗi mới (n)

chúng ta gán kết quả cho T (temp) của kết quả vì tìm thấy dừng khi tìm thấy và vì vậy chúng ta biết rằng kết quả cuối cùng sẽ là f () là kết quả B


1
t="",B=""để t="",B=ttiết kiệm một byte.
Kevin Cruijssen

@KevinCruijssen cập nhật giải pháp, cảm ơn :) (và bạn đến Arnauld)
DanielIndie

@Arnauld tôi lấy ý tưởng tuyệt vời của bạn và làm một cái gì đó tương tự. nhìn vào giải pháp ngay bây giờ
DanielIndie

@Arnauld sự tuyệt vời trong sáng
DanielIndie

1
Mát mẻ! Hãy tắt thêm 2 byte nữa (và không cần trim()nữa).
Arnauld


3

Ruby, 72 71 byte

->a{a.map{%w[b o d x]}.inject(&:product).find{|c|/(.).*\1/!~[p,c]*?%%a}}

Định dạng đầu ra là một số loại quái vật biểu hiện S ngược:

f[[12, 28, 46, 78, 154, 188, 222, 240]]
=> [[[[[[["d", "o"], "o"], "d"], "x"], "x"], "x"], "x"]

Thay vào đó, phân tách dấu gạch chéo sẽ tốn thêm 3 byte (nối thêm *?/).

Định dạng này xuất phát từ cấu trúc vòng lặp, ngắn hơn một chút so với thành ngữ hơn repeated_combination(a.size), tạo ra một mảng các ký tự và sau đó giảm nó qua hàm sản phẩm chéo.

Chỉnh sửa: Đã lưu 1 byte nhờ Lynn.


2

Bình thường, 21 20 byte

f{Is.bjYNTQ^[8T2y8)l

Trả về một danh sách tất cả các danh sách cơ sở có thể (luôn có độ dài 1).
Hãy thử nó ở đây

Giải trình

f{Is.bjYNTQ^[8T2y8)l
           ^[8T2y8)lQ  Get the tuples of bases of the same length as the input.
f                      Filter to get those...
    .bjYNTQ            ... where converting bases elementwise...
   s                   ... and joining together...
 {I                    ... has no repeats.


2

Thạch , 17 16 byte

⁴⁽%ʠḃṗL³bF⁼Q$ƲÐf

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

Trả về một danh sách các căn cứ.

 == Giải thích ==
% L³bF⁼Q $ Đf Liên kết chính.
 % ʠ Một số.
    chuyển đổi nó thành cơ sở phỏng đoán ...
16. Kết quả là [2,8,10,16].
     L Công suất Cartesian theo chiều dài đầu vào.
             Filter Bộ lọc, giữ những thứ thỏa mãn ...
       Đầu vào
        b chuyển đổi sang cơ sở đó
         F khi làm phẳng (nối tất cả các chữ số của \
                      số khác nhau với nhau)
          ⁼Q $ bằng với chính nó


2

05AB1E , 17 byte

2žv8T)sgãʒIsв˜DÙQ

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


Tôi không biết 05AB1E, vì vậy có lẽ tôi nên đợi cho đến khi bạn thêm lời giải thích trước khi tôi hỏi điều này, nhưng tại sao kết quả cho 8nhân vật '8'và ba số còn lại là một số nguyên? +1 mặc dù, dường như chỉ hoạt động tốt, bao gồm cả các trường hợp thử nghiệm cuối cùng dài hơn.
Kevin Cruijssen

2
@KevinCruijssen Đó là từ "2žv8T". Các số trong mã nguồn được đẩy dưới dạng các ký tự trong 05AB1E, trong khi žv (16) và T (10) được tích hợp để đẩy các số tương ứng của chúng trên ngăn xếp. Điều này thường không được chú ý vì màn hình ẩn của phần tử cuối cùng trong ngăn xếp của 05AB1E chuyển thành số, nhưng trong trường hợp này, kết quả được hiển thị là một mảng các phần tử, các phần tử đó không được chạm vào, do đó các dấu ngoặc kép. Lệnh ï chẳng hạn có thể được sử dụng sau) để truyền hai phần tử char thành ints.
Kaldo

@KevinCruijssen Ví dụ về lời giải thích của tôi: tio.run/##MzBNTDJM/f/fyPbQDtv//wE Mã: đẩy 2, in, bọc thành một mảng, in.
Kaldo


1

Husk , 19 byte

fȯS=UΣz`B¹πmDd1458L

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

Trả về danh sách các căn cứ

Giải trình

fȯS=UΣz`B¹πmDd1458L  Implicit input
                  L  Length of input
          π          Cartesian power of
             d1458     The digits of 1458  [1,4,5,8]
           mD          Double the digits   [2,8,10,16]
fȯ                   Filter by
      z`B¹             Zip with input by converting to its base
     Σ                 Concatenate
  S=U                  Equal to itself with unique elements
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.