Golf Kode: Campur kacang sehingga tidak ada yang sama menyentuh

16

Memasukkan:

Input adalah susunan mur yang acak (dalam bahasa Anda), kemungkinan mur mengikuti. Program Anda harus memiliki cara untuk mewakili setiap jenis kacang, seperti kode integer. Program harus mampu menangani berbagai ukuran konfigurasi kacang.

Kemungkinan Kacang:

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

Keluaran:

Output harus berupa array yang diurutkan sedemikian rupa sehingga tidak ada mur yang berdekatan dari jenis yang sama. Jika ini tidak mungkin, output harus berupa array kosong.

Input Contoh (disederhanakan):

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

Contoh Output:

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

Solusi mungkin tidak hanya mengocok array sampai menjadi unik karena kebetulan. Jenis yang digunakan harus yang deterministik

Kacang campuran?  Saya melihat dua almond menyentuh!

Thomas Dignan
sumber
4
"Program Anda harus memiliki cara untuk mewakili setiap jenis kacang, seperti kode integer" mengapa begitu? - "mungkin tidak hanya mengocok array sampai menjadi unik karena kebetulan. Jenis yang digunakan harus yang deterministik" sebuah shuffle masih bisa bersifat deterministik. Apakah Anda bermaksud memaksakan batasan pada kompleksitas waktu program?
lagi mengaktifkan counterclock
1
Saya harus setuju dengan @leftaroundabout melarang algoritma tertentu konyol tanpa alasan yang sangat bagus. Salah satu hal yang paling bermanfaat tentang permainan kode seperti ini adalah beragam metode yang digunakan.
dmckee
@ Dmckee, saya pikir persyaratan bahwa algoritma menjadi deterministik adalah wajar - jika RNG rusak atau input cukup panjang, solusi nondeterministic mungkin gagal untuk dihentikan.
Stanby
@ bbyby. Meh Saya seorang fisikawan partikel. Monte Carlo adalah alat penting dalam dirinya sendiri. Selain itu, Jika saya memilih PRNG tetap dan benih tetap itu adalah deterministik.
dmckee
1
Saya pikir saya menemukan contoh yang memiliki beberapa solusi, tetapi mungkin menyebabkan beberapa jawaban gagal menemukan salah satu dari mereka. Bisakah saya menambahkannya? (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) dapat menyebabkan mereka gagal juga.
Brad Gilbert b2gills

Jawaban:

8

GolfScript, 42 41 37 38 karakter

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

Kode mengharapkan input pada STDIN dan mencetak hasilnya ke STDOUT, misalnya:

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

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

Script menjadi lebih lama dari yang diharapkan tetapi saya kira ada ruang untuk perbaikan.

Sunting: Kasus daftar dengan satu item biaya saya 1 karakter (perbandingan terbaik yang bisa saya buat adalah sama dengan Peter).

Howard
sumber
1
Saya belum duduk untuk mengimplementasikan ini, tetapi $.,)2//zippersis apa yang ada dalam pikiran saya. Interpretasi saya terhadap spec adalah bahwa ia bisa mengambil input pada stack dan meninggalkannya di stack, jadi mungkin kita harus mendorong klarifikasi.
Peter Taylor
@PeterTaylor, keren. Bekerja untukku.
Stanby
Ini macet saat input ["walnut"]di bagian bandingkan-dua-pertama.
Peter Taylor
@PeterTaylor Anda benar. Saya harus bekerja di kasing sudut itu.
Howard
6

GolfScript, 32 karakter

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

Input dan format output yang sama dengan solusi Howard.

Peter Taylor
sumber
Saya punya ide yang sama pada bagian semacam tetapi belum kode itu :-) Kerja bagus!
Howard
6

Brachylog v2, 10 byte

p.¬{s₂=}∨Ė

Cobalah online!

Solusi brute-force. (Ini adalah fungsi, diizinkan karena tantangannya tidak mengatakan "program penuh".) Ini juga sebagian besar merupakan terjemahan langsung dari spec (satu-satunya kehalusan nyata adalah bahwa saya berhasil mengatur hal-hal sehingga semua kendala implisit tiba tepat di tempat yang tepat, sehingga tidak memerlukan karakter tambahan untuk mendamaikan mereka).

Perhatikan bahwa ini adalah algoritme umum untuk mengatur ulang segala jenis daftar sehingga tidak memiliki dua elemen yang menyentuh; ia dapat menangani representasi string dari elemen-elemen, dan ia dapat menangani kode integer juga. Jadi tidak masalah bagaimana "Program Anda harus memiliki cara untuk mewakili setiap jenis kacang, seperti kode integer." persyaratan dari pertanyaan ditafsirkan.

Penjelasan

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
ais523
sumber
1

J, 80 karakter

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

Tidak benar-benar di liga yang sama dengan Golfscript yang satu ini. Saya curiga ada keuntungan yang harus dibuat, tetapi 14 karakter yang dibutuhkan hanya untuk memasukkan daftar ke dalam program [;.1' ',1!:1[1adalah cacat utama.

Pada dasarnya program mengambil dalam daftar, mengelompokkan item yang sama bersama-sama, mengurutkan berdasarkan jumlah item dalam setiap kelompok turun, dan bergantian output antara paruh pertama dan paruh kedua daftar. Sisanya jika kode menghilangkan item asing dan memutuskan apakah daftar tersebut adalah output yang valid (menghasilkan infinity_ jika tidak).

Contoh:

macadamia walnut walnut pistachio walnut

grup (</.]):

macadamia walnut walnut walnut pistachio

sortir (\:#&.>):

walnut walnut walnut macadamia pistachio

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

walnut macadamia walnut pistachio walnut
Gareth
sumber
0

Jelly , 14 byte

Ġz0UẎḟ0ịµẋ⁻ƝẠ$

Cobalah online!

6 byte terakhir dapat dihapus jika kita dapat memiliki perilaku tidak terdefinisi untuk input yang tidak valid.

Erik the Outgolfer
sumber
0

Stax , 10 byte

│éÿ∞å[zàL⌂

Jalankan dan debug itu

Inilah program yang sama dibongkar, tidak diserang, dan dikomentari.

|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

Jalankan yang ini

rekursif
sumber