Code Golf: Trộn các loại hạt sao cho không có loại nào cùng chạm vào


16

Đầu vào:

Đầu vào là một mảng ngẫu nhiên của các loại hạt (theo ngôn ngữ của bạn), các loại hạt có thể theo sau. Chương trình của bạn phải có cách biểu diễn từng loại hạt, chẳng hạn như mã số nguyên. Chương trình phải có khả năng xử lý bất kỳ mảng kích thước của bất kỳ cấu hình của các loại hạt.

Các loại hạt có thể:

Kola nut
Macadamia
Mamoncillo
Maya nut
Mongongo
Oak acorns
Ogbono nut
Paradise nut
Pili nut
Pistachio
Walnut

Đầu ra:

Đầu ra phải là mảng được sắp xếp theo kiểu sao cho không có các loại hạt liền kề cùng loại. Nếu điều này là không thể, đầu ra sẽ là một mảng trống.

Ví dụ nhập (đơn giản hóa):

["walnut", "walnut", "pistachio"]

Kết quả ví dụ:

["walnut", "pistachio", "walnut"]

Các giải pháp có thể không chỉ đơn giản là xáo trộn mảng cho đến khi nó trở thành duy nhất một cách tình cờ. Các loại được sử dụng phải là một trong tất cả

Hỗn hợp các loại hạt?  Tôi thấy hai quả hạnh nhân chạm nhau!


4
"Chương trình của bạn phải có cách biểu diễn từng loại hạt, chẳng hạn như mã số nguyên" tại sao vậy? - "có thể không chỉ đơn giản là xáo trộn mảng cho đến khi nó trở thành duy nhất một cách tình cờ. Sắp xếp được sử dụng phải là một định thức" một shuffle vẫn có thể là xác định. Bạn chỉ có nghĩa là áp đặt một giới hạn về độ phức tạp thời gian của chương trình?
đã ngừng quay ngược chiều

1
Tôi phải đồng ý với @leftaroundabout cấm một thuật toán cụ thể là ngớ ngẩn mà không có lý do chính đáng. Một trong những điều bổ ích nhất về các trò chơi mã như thế này chính xác là sự đa dạng của các phương pháp được tuyển dụng.
dmckee

@dmckee, tôi nghĩ rằng yêu cầu của thuật toán là xác định là hợp lý - nếu RNG bị lỗi hoặc đầu vào khá dài, một giải pháp không xác định có thể không kết thúc.
gian hàng

@boothby. Meh. Tôi là một nhà vật lý hạt. Monte Carlo là một công cụ quan trọng theo đúng nghĩa của nó. Hơn nữa, nếu tôi chọn một PRNG cố định và một hạt giống cố định thì nó mang tính quyết định.
dmckee

1
Tôi nghĩ rằng tôi đã tìm thấy một ví dụ có một số giải pháp, nhưng có thể khiến một số câu trả lời không tìm thấy bất kỳ giải pháp nào trong số đó. Tôi có thể thêm nó không? (5,4,4,3,3,2) perl6 -e 'my @a="aaaaabbbbccccdddee".comb;my @b = @a.pick(*) while @b.squish !== @a;say [~] @b' baedcbdacdecbabaca(3,3,2) cũng có thể khiến chúng bị hỏng.
Brad Gilbert b2gills

Câu trả lời:


8

GolfScript, 42 41 37 38 ký tự

~.`{\`{=}+%1-,}+$.,)2//zip[]*.2<..&=*p

Mã dự kiến ​​đầu vào trên STDIN và in kết quả thành STDOUT, ví dụ:

> ["walnut" "walnut" "walnut" "macadamia" "pistachio"]
["walnut" "macadamia" "walnut" "pistachio" "walnut"]

> ["walnut" "walnut" "walnut" "macadamia" "walnut"]
[]

Kịch bản trở nên dài hơn dự kiến ​​nhưng tôi cho rằng có chỗ để cải thiện.

Chỉnh sửa: Trường hợp danh sách với một mục có giá 1 ký tự (so sánh tốt nhất tôi có thể đưa ra là giống như của Peter).


1
Tôi chưa ngồi xuống để thực hiện điều này, nhưng đó $.,)2//zipchính xác là những gì tôi đã nghĩ. Giải thích của tôi về thông số kỹ thuật là nó có thể lấy đầu vào trên ngăn xếp và để nó trên ngăn xếp, vì vậy có lẽ chúng ta nên thúc đẩy để làm rõ.
Peter Taylor

@PeterTaylor, mát mẻ. Làm việc cho tôi.
gian hàng

Điều này sập vào đầu vào ["walnut"]trong phần so sánh đầu tiên hai.
Peter Taylor

@PeterTaylor Bạn nói đúng. Tôi sẽ phải làm việc trong trường hợp góc đó.
Howard

6

GolfScript, 32 ký tự

~:x{]x\-,}$.,)2//zip[]*.2<..&=*`

Định dạng đầu vào và đầu ra giống như giải pháp của Howard.


Tôi đã có cùng một ý tưởng về phần sắp xếp nhưng chưa mã hóa nó :-) Làm tốt lắm!
Howard

6

Brachylog v2, 10 byte

p.¬{s₂=}∨Ė

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

Giải pháp vũ lực. (Đây là một chức năng, được cho phép vì thử thách không nói "chương trình đầy đủ".) Nó cũng chủ yếu là bản dịch trực tiếp của thông số kỹ thuật (sự tinh tế thực sự duy nhất là tôi quản lý để sắp xếp mọi thứ sao cho tất cả các ràng buộc ngầm định đến chính xác đúng chỗ, do đó không cần thêm bất kỳ ký tự nào để định hướng chúng).

Lưu ý rằng đây là một thuật toán chung để sắp xếp lại bất kỳ loại danh sách nào để nó không có hai yếu tố cảm động; nó có thể xử lý các biểu diễn chuỗi của các phần tử và nó cũng có thể xử lý các mã số nguyên. Vì vậy, nó thực sự không quan trọng bằng cách nào "Chương trình của bạn phải có cách biểu diễn từng loại hạt, chẳng hạn như mã số nguyên." yêu cầu từ câu hỏi được giải thích.

Giải trình

p.¬{s₂=}∨Ė
p            Find a permutation of {the input}
  ¬{   }     which does not have the following property:
    s₂         it contains a pair of adjacent elements
      =        that are equal
        ∨    {no constraint on what value the equal elements can have}
 .           If you find such a permutation, output it.
        ∨    If no permutation is found, ignore the input and
         Ė     {output} an empty list

1

J, 80 ký tự

]`_:@.(0<2&([:+/=/\))({.~-:@#),((],.|.)~>.@-:@#)<"1;(\:#&.>)(</.])[;.1' ',1!:1[1

Không thực sự trong cùng một giải đấu như Golfscript trên cái này. Tôi nghi ngờ sẽ có những lợi ích được tạo ra, nhưng 14 nhân vật cần thiết chỉ để đưa danh sách vào chương trình [;.1' ',1!:1[1là một bất lợi lớn.

Về cơ bản, chương trình sẽ đưa vào danh sách, nhóm các mục tương tự lại với nhau, sắp xếp theo số lượng mục trong mỗi nhóm giảm dần và xen kẽ đầu ra giữa nửa đầu và nửa sau của danh sách. Phần còn lại nếu mã được loại bỏ các mục không liên quan và quyết định xem danh sách đó có phải là đầu ra hợp lệ hay không (xuất ra vô hạn _nếu không).

Thí dụ:

macadamia walnut walnut pistachio walnut

nhóm (</.]):

macadamia walnut walnut walnut pistachio

sắp xếp (\:#&.>):

walnut walnut walnut macadamia pistachio

Ravel ((],.|.)~>.@-:@#):

walnut macadamia walnut pistachio walnut


0

Stax , 10 byte

│éÿ∞å[zàL⌂

Chạy và gỡ lỗi nó

Đây là cùng một chương trình giải nén, không ghi chú và nhận xét.

|T      get all permutations
{       block to filter by
  :g_=  after dropping repeated elements, it's still equal
f       execute filter
|c      terminate and pop if falsy (no match)
hJ      take the first permutation, and join with spaces

Chạy cái này

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.