Beberapa waktu yang lalu saya membeli dompet baru yang dapat menampung 8 kartu (4 di kedua sisi). Namun, saya tampaknya memiliki kartu yang jauh lebih banyak dari itu dan saya harus membuat pilihan kartu mana yang ingin saya bawa. Beberapa kartu yang saya gunakan lebih sering daripada yang lain, tetapi kartu yang saya pilih tidak selalu saya gunakan.
Tantangan
Diberikan setumpuk kartu, kembalikan tata letak dompet saya dengan cara terbaik sesuai preferensi dan batasan saya. Tata letak harus sebagai berikut:
__ __ (row 1)
__ __ (row 2)
__ __ (row 3)
__ __ (row 4)
Saat ini saya memiliki kartu berikut - tumpukan akan selalu terdiri dari pilihan dari ini:
- 1 kartu identitas ( ID )
- 1 SIM ( DL )
- 2 kartu kredit ( CC )
- 5 kartu debit ( DC )
- 1 kartu transportasi umum ( PC )
- 1 kartu akses gym ( GC )
- 9 kartu keanggotaan dari toko dan gudang acak ( MC )
Saya memiliki beberapa preferensi dan batasan:
- Kartu diurutkan berdasarkan prioritas: ID, DL, CC, DC, PC, GC, MC
- Kartu diurutkan berdasarkan frekuensi penggunaan: CC, DC, PC, GC, MC, ID, DL
- Untuk alasan keamanan, jumlah total kartu debit dan kartu kredit di dompet saya bisa paling banyak 1 lebih banyak daripada jumlah semua kartu lain yang masuk ke dompet saya ( N DC + N CC ≤ N ID + N DL + N PC + N GC + N MC +1).
- Jika ada, kartu identitas dan SIM saya harus selalu masuk baris 1. Ini tidak berarti bahwa kartu lain mungkin tidak menempati tempat di baris 1.
- Kartu yang paling sering digunakan dari tumpukan harus selalu masuk baris 4.
Aturan
- Tidak ada 2 kartu yang dapat menempati tempat yang sama.
- Kartu dengan prioritas lebih tinggi selalu lebih disukai daripada kartu dengan prioritas lebih rendah, kecuali jika pembatasan DC / CC masuk.
- ID / DL pada baris 1 mengesampingkan aturan frekuensi: jika hanya ID yang diberikan, ia akan masuk pada baris 1 dan baris 4 akan kosong!
- Pemformatan input dapat dilakukan dengan cara apa pun yang Anda suka, selama urutan tumpukan input dipertahankan. misalnya
ID,CC,PC,MC,MC,MC,DL
dapat juga diberikan sebagai misalnya1ID 1CC 1PC 3MC 1DL 0DC 0GC
atauID CC PC MC MC MC DL
. Pemformatan output memang memiliki beberapa batasan: semua baris harus dimulai pada baris baru, kolom harus dibatasi dengan beberapa cara. Tempat kosong dapat disajikan sesuka Anda, asalkan tidak mengacaukan tata letak 4x2.
Mungkin ada lebih dari satu solusi / pesanan, terserah Anda mana yang Anda berikan sebagai output.
- Anda dapat mengasumsikan bahwa kartu dengan jenis yang sama akan selalu dikelompokkan pada input.
- Terlepas dari hal di atas, aturan dan celah kode golf standar berlaku.
Bonus
Anda diizinkan untuk menghapus 15% dari bytecount Anda jika Anda juga mengembalikan kartu yang tidak masuk dompet. Cetak "Cocok!" jika tidak ada kartu yang tersisa. Output tambahan ini harus dipisahkan dengan jelas dari tata letak returend.
Contohnya
Memasukkan:
ID, DL, CC, GC, MC
2 kemungkinan keluaran:
ID DL DL ID
__ __ or __ MC
MC __ __ __
CC GC GC CC
optional: It fits!
Memasukkan:
ID, CC, DC, PC, GC, MC, MC, MC, MC, MC
2 kemungkinan keluaran:
ID MC GC ID
MC MC or MC PC
PC GC MC MC
CC DC DC CC
optional: e.g. (MC, MC) or (2MC)
Memasukkan:
DC, DC, CC, CC, GC, DL
2 kemungkinan keluaran:
DL __ GC DL
__ __ or DC __
GC DC __ __
CC CC CC CC
optional: e.g. (DC) or (1DC)
Memasukkan:
CC, DC, DC, DC
2 kemungkinan keluaran:
__ __ __ __
__ __ or __ __
__ __ __ __
CC __ __ CC
optional: e.g. (DC, DC, DC) or (3DC)
Memasukkan:
CC, CC, MC, MC, MC, MC, MC, MC, PC, DC, DC, DC, DC, DC, GC
2 kemungkinan keluaran:
MC MC MC DC
PC GC or DC GC
DC DC PC MC
CC CC CC CC
optional: e.g. (DC, DC, DC, MC, MC, MC, MC) or (3DC, 4MC)
Memasukkan:
MC, MC, MC, MC, MC, MC, MC
2 kemungkinan keluaran:
__ MC MC MC
MC MC or MC MC
MC MC MC __
MC MC MC MC
optional: It fits!
Memasukkan:
ID, CC
2 kemungkinan keluaran:
ID __ __ ID
__ __ or __ __
__ __ __ __
CC __ CC __
optional: It fits!
Ini adalah kode-golf , jadi kode terpendek (dalam byte) menang.