Ketika berbicara tentang memakan permen, saya memegang standar yang lebih tinggi daripada orang awam pada umumnya. Ada keseimbangan halus antara "mencampurnya" dan "menyimpan yang terbaik untuk yang terakhir."
Dalam tantangan ini, Anda akan diberi serangkaian karakter di mana setiap karakter mewakili sepotong permen. Karakter yang berbeda (peka huruf besar kecil) mewakili berbagai jenis permen. Program Anda kemudian harus menentukan urutan konsumsi permen yang benar, berdasarkan prosedur di bawah ini. Anda dapat menulis program lengkap (STDIN / STDOUT) atau fungsi yang disebutkan untuk menyelesaikan tugas ini.
Katakanlah simpanan permen saya adalah oroybgrbbyrorypoprr
. Pertama, saya mengurutkan permen menjadi tumpukan dari jenis yang sama, dengan jumlah yang lebih besar di bagian atas, menggunakan nilai karakter ASCII yang lebih rendah sebagai tie-breaker.
rrrrrr
oooo
bbb
yyy
pp
g
Kemudian, saya mengambil setiap baris permen dan menempatkannya dalam jarak yang sama. Misalnya, jika ada 3 potong permen, satu ditempatkan 1/3 dari jalan, 2/3 dari jalan, dan pada akhirnya.
.r.r.r.r.r.r
..o..o..o..o
...b...b...b
...y...y...y
.....p.....p
...........g
Lalu, saya turun setiap kolom untuk membuat pesanan permen terakhir saya rorbyroprbyorrobypg
,.
Memasukkan
Tali yang berisi simpanan permen. Input untuk contoh di atas bisa jadi:
oroybgrbbyrorypoprr
Keluaran
Seutas berisi permen ditata ulang ke dalam urutan konsumsi yang benar.
rorbyroprbyorrobypg
Mencetak gol
Ini kode golf. Jawaban terpendek dalam byte menang. Aturan standar kode-golf berlaku.
Jawaban:
CJam,
78 68 61 45 42 39 3130 byteMengambil string input melalui STDIN
Terinspirasi oleh pendekatan rekursif, tetapi sedikit berbeda. Tidak perlu transpos atau persegi panjang sama sekali !.
Bagaimana itu bekerja:
(Sedih bahwa CJam tidak dapat lagi lengkap dengan Pyth karena membutuhkan begitu banyak mengasapi sintaksis)
Coba di sini
sumber
{_@_@{_@\%}h;/*}
dengan:
.Pyth , 25
Gunakan algoritme baru, yang terinspirasi oleh jawaban ini .
Selangkah demi selangkah:
Pertama, kami mengurutkan karakter berdasarkan kesamaan mereka, ikatan rusak berdasarkan abjad. Ini
o_/zZSz
.o
sama dengan Pythonsorted(<stuff>,key=<stuff>)
, dengan ekspresi lambda untuk kunci, kecuali itu menyimpannya sebagai string.Kemudian kami membuat daftar awalan string itu, dari panjang
len(z)
ke panjang 1.>
sama dengan python<stuff>[<int>:]
.Kemudian, kami menyusun ulang daftar string awalan ini dengan lokasi fraksional, 0 menjadi tepi kiri dan 1 menjadi kanan, dari karakter pertama dari awalan pada tata letak persegi panjang yang terlihat pada pertanyaan.
/NhN
menghitung berapa kali karakter pertama dalam awalan terjadi di awalan, sementara/zhN
memberikan jumlah kemunculan karakter pertama dalam awalan dalam string sebagai lubang. Ini memberikan setiap awalan yang dipimpin oleh masing-masing karakter dalam suatu grup fraksi yang berbeda, dari1/k
untuk yang paling sering terjadi dari karakter itu kek/k
untuk yang paling kiri. Menyusun ulang daftar awalan dengan nomor ini memberikan posisi yang sesuai dalam tata letak. Ikatan rusak menggunakan pemesanan sebelumnya, yang pertama dengan hitungan kemudian alfabet, seperti yang diinginkan.Akhirnya, kita perlu mengekstraksi karakter pertama dari setiap string awalan, menggabungkannya menjadi string tunggal, dan mencetaknya. Mengekstrak karakter pertama adalah
hC
.C
melakukan matriks transpos pada daftar, sebenarnyazip(*x)
dalam Python 3.h
mengekstrak baris pertama dari matriks yang dihasilkan. Ini sebenarnya satu-satunya baris, karena keberadaan awalan 1 karakter mencegah baris lengkap lainnya terbentuk.s
menjumlahkan karakter dalam tuple ini menjadi satu string. Pencetakan tersirat.Uji:
Potongan program tambahan tentang
oroybgrbbyrorypoprr
:Jawaban lama:
Pyth , 34
Program ini berfungsi dengan menghitung berapa kali mereplikasi sublist tertentu. Sub-daftar terlihat seperti
['', '', '', '', ... , 'r']
. Panjang total dari sub-daftar ini adalah produk dari jumlah kemunculan semua permen lainnya, yaituu*G/zHS{-zd1
. Sublist lengkap dibuat dengan mereplikasi daftar string kosong]k
,, yang berkali-kali, kemudian menghapus dan elemen dengant
dan menambahkan nama permen ke akhir+d
.Kemudian, sub-daftar ini direplikasi sebanyak permen yang ditemukan di input
/zd
, memastikan setiap daftar permen memiliki panjang yang sama.Sekarang, dengan fungsi ini dipetakan di atas semua permen unik dalam urutan yang tepat (
o_/zNS{z
), kami memiliki persegi panjang yang mirip dengan yang ada di pernyataan pertanyaan, tetapi dengan string kosong sebagai ganti titik. Melakukan matriks transpos (C
) diikuti oleh dua penjumlahan (ss
) memberikan string terakhir.Verifikasi:
sumber
Perl 5 - 62
61 kode + 1 bendera.
Pertama-tama pisahkan input ke dalam array karakter -
/./g
.Tambahkan indeks kemunculan ke setiap huruf meninggalkan jumlah dalam variabel
$a
..$z
denganmap++$$_.$_
. Sekarang arraynya adalah:Kemudian mengonversinya menjadi semacam kunci gabungan: rasio
$_/$$1
, count tie breaker~$_
dan ASCII value tie breaker$_
. Ini akan menghasilkan (di sini dengan ruang tambahan untuk kejelasan).Ini dapat diurutkan dengan urutan lexicographical (default). Pada akhirnya ekstrak karakter terakhir dan cetak:
print map/(.$)/
sumber
Python 3.x - 124 byte
sumber
Mathematica,
123119118 byteMenentukan fungsi bernama
f
. Tidak Disatukan:Menggunakan tipe rasional bawaan sepertinya ide yang bagus untuk ini. Tentu saja, ini tidak ada di dekat CJam. Pada dasarnya, saya mewakili kotak yang ditampilkan dalam tantangan sebagai daftar pasangan. Hal pertama dalam pasangan adalah kode karakter, yang kedua adalah posisinya sebagai fraksi kurang dari atau sama dengan 1 (kolom terakhir adalah 1). Setelah memastikan bahwa masing-masing karakter sudah dalam urutan yang benar, saya hanya perlu mengurutkan secara stabil dengan fraksi tersebut untuk mendapatkan hasil yang diinginkan.
sumber
Pyth 45
47 48 51Ini juga hampir bisa dipastikan golf;)
Bekerja dengan membangun daftar daftar, di mana setiap daftar bagian dalam adalah deretan string kosong dan nama permen. Daftar ini diubah dan kemudian daftar bagian dalam bergabung diikuti oleh daftar ini yang bergabung.
Terima kasih @isaacg untuk mengingatkan saya tentang jumlah!
sumber
s
pada daftar string berfungsi sebagaij""
.APL: 38
Penjelasan:
Dapat diuji di tryapl.org
sumber
R - 166 karakter
versi tanpa ungolfed
Penjelasan:
order
stabil dalam penyortiran, sehingga akan mempertahankan urutan penamaan paling sering / leksikal ketika dasi dalam indeks, khususnya penting dengan permen terakhir)Sifat matriks dari masalah ini membuat saya berpikir R mungkin bisa melakukan ini, tetapi interpretasi literal terbaik dari algoritma yang bisa saya lakukan adalah 211 karakter:
ungolfed:
sumber
Pyth, 29 byte
Ini adalah terjemahan langsung CJam answe r saya di Pyth
Cobalah online di sini
Ada cerita yang agak panjang di balik solusi ini dan @isaacg banyak membantu saya dalam memahami bahasa baru ini.
Idealnya ini adalah terjemahan kata demi kata yang tepat dari kode CJam saya ( 17 byte ):
yang berarti:
Tapi sayangnya Python tidak mengembalikan apa pun dalam
+=
panggilan, jadi itu bukan kode Python yang valid, sehingga kode Pyth tidak valid juga seperti dalam Pyth, lambda hanya bisa menjadi pernyataan kembali.Kemudian saya melihat ke berbagai metode dan akhirnya menemukan bahwa Python
list.append
mengembalikanNone
nilai, yang dapat saya gunakan. Membuat kode menjadi ( 19 byte ):yang berarti:
Tetapi sayangnya, dukungan
a
(append) telah dihapus dari Pyth dan versi yang memang memiliki dukungan, tidak memiliki dukungan untuko
.Perbarui:
a
dukungan telah ditambahkan kembali dalam Pyth sekarang sehingga kode 19 byte di atas akan berfungsi di kompiler online. Tetapi karena ini adalah fitur baru yang ditambahkan setelah OP, saya tidak meletakkannya sebagai skor saya dan membiarkan kode 29 byte sebagai solusi saya.Karena itu saya harus bergantung pada Python mentah dalam kasus itu, membuat kode menjadi
sumber