pengantar
Kakek saya adalah penggemar James Bond, tetapi dia selalu tidak yakin tentang bagaimana menentukan peringkat aktor favoritnya. Karena itu, ia selalu membuat daftar, yang banyak pekerjaannya. Dia meminta saya untuk membuat program yang akan membuat hidupnya lebih mudah, tetapi saya tidak punya waktu untuk itu, saya harus bekerja! Jadi saya akan mengandalkan kalian.
Tantangan
Tantangannya sederhana. Input akan terdiri dari daftar, dalam format berikut:
<number> <space> <actor's name> <newline>
Tugas Anda adalah mengurutkannya berdasarkan nomor di awal baris, mulai dari yang terakhir, dan berakhir dengan yang pertama. Semua nomor harus dihapus.
Namun, kakek saya terkadang membuat kesalahan. Karena itu, Anda perlu memvalidasi data. Jika salah satu nama dalam daftar tidak merujuk ke salah satu aktor yang bermain Bond, Anda harus membuangnya. Dalam hal pengulangan, pengulangan harus dihapus, dan nama harus mempertahankan bobot terendah yang dikaitkan dengan (contoh # 3).
Tidak ada batasan berapa banyak garis yang mungkin ada.
Output hanya perlu daftar semacam, apakah itu array, string yang dipisahkan koma, hanya nilai yang dipisahkan oleh spasi, atau sesuatu yang lain sama sekali, yaitu
Pierce Brosnan, Sean Connery, David Niven
Baris atau spasi tambahan baru diperbolehkan.
Contoh Input dan Output
Memasukkan:
1 Sean Connery
2 Emma Watson
5 Timothy Dalton
4 Roger Moore
3 Daniel Craig
Keluaran:
Timothy Dalton, Roger Moore, Daniel Craig, Sean Connery
Memasukkan:
2 Timothy Dalton
4 George Lazenby
5 George Lazenby
3 Bob Simmons
Keluaran:
George Lazenby, Bob Simmons, Timothy Dalton
Memasukkan:
3 Sean Connery
2 Pierce Brosnan
1 Sean Connery
Keluaran:
Pierce Brosnan, Sean Connery
Karena ini adalah kode golf, kode terpendek (dalam byte) menang!
Lampiran
Daftar aktor yang memainkan peran Bond:
- Barry Nelson
- Bob Simmons
- Sean Connery
- Roger Moore
- David Niven
- George Lazenby
- Timothy Dalton
- Pierce Brosnan
- Daniel Craig
echo Sean Connery
karena semua orang tahu, hanya ada satu ikatanJawaban:
Pyth,
136132 byteCoba di sini!
Penjelasan
sumber
Retina ,
201 197191Cobalah online!
6 byte disimpan berkat Martin!
Wah, semacam gelembung dengan regex. Perhatikan bahwa sepuluh byte dihabiskan untuk melakukan konversi desimal ke unary di awal, jika input unary OK maka itu tidak diperlukan. Juga, jika angka tidak bisa atas nama orang, maka beberapa byte lagi dapat disimpan dengan memindahkan garis yang menghapus aktor non-Bond ke ujung dan menghapus
1+
(belum teruji dengan\D
versi).Penjelasan:
Program Retina terdiri dari beberapa tahap, jadi saya akan menjelaskan setiap tahap secara terpisah.
Tahap 1:
Mengganti angka dalam input dengan unary. Ini menggunakan token pengganti khusus Retina:
$*
yang mengulang karakter setelah beberapa kali sama dengan nilai basis 10 token sebelumnya.Tahap 2:
Hal-hal sebelum
`
dalam tahap mengubah mode yang digunakan. Ini mengaktifkan mode grep, yang berarti bahwa setiap baris yang tidak cocok dengan regex dibuang. Jangkar diperlukan untuk mencegah agar korek dekat tidak tergelincir.Tahap 3:
Ini adalah tahap penyortiran. Dalam
+
mode menandakan bahwa tahap ini harus diulang sampai penggantian tidak membuat perubahan ketika diterapkan (yaitu kita mencapai titik tetap). Regex menemukan batas kata, diikuti oleh beberapa1
s dan kemudian semua sisa baris hingga baris baru. Kemudian, jika baris berikutnya memiliki lebih1
dari itu, regex akan cocok dan kami menukar garis.Tahap 4:
Tahap ini menggunakan
+
mode lagi, tetapi juga digunakans
untuk membuat.
meta-karakter juga cocok dengan baris baru. Ini menghapus garis duplikat, dengan mencocokkan duplikat yang tepat setelah1
dan mengambil barang-barang setelah duplikat pertama untuk menggantikan seluruh pertandingan dengan itu. Ini akan bekerja tanpa perlu mempertimbangkan urutan pemecahan dasi, karena nama-nama sudah diurutkan dengan tepat, dengan angka yang lebih besar di atas, oleh karena itu kami akan selalu menjaga nilai yang lebih kecil.Tahap 5:
Sangat sederhana di sini, semuanya beres, kecuali kita memiliki banyak
1
di depan Obligasi kita, jadi kita ganti mereka dan ruang setelah mereka tanpa apa-apa.sumber
TSQL 426 byte (termasuk data + input)
Solusi golf:
Coba di sini
SQL unggul (tidak ada permainan kata-kata yang dimaksudkan) dalam jenis tugas ini: menghubungkan set, memesan, memotong duplikat dll.
Yang Anda butuhkan hanyalah membuat dan mengisi tabel Aktor seperti ini:
Sekarang jika kita menggunakan variabel tabel sebagai input, kita hanya perlu mendapatkan persimpangan dari kedua set. Menghapus duplikat dan pemesanan di SQL sangat mudah.
Contoh 1:
Contoh 2:
Versi golf hanya lengkap misalnya input 3
Sebagai nilai tambah, SQL ini dapat berfungsi untuk versi DBMS yang lebih lama (bahkan ditulis ulang menjadi ANSI SQL) dan berjalan tanpa masalah di komputer yang lebih lama daripada kebanyakan bahasa.
sumber
order by min(R) desc
dengan pilih dalam dan menghapusmin(R)
dari pilih. Itu seharusnya menghemat 21 byte.char
bukannyavarchar
akan menghemat 6 byte lagi.Perl,
242179217 byteVersi berformat lebih bagus, dengan komentar:
Sebagian besar ukurannya adalah daftar Obligasi; Saya tidak dapat menemukan cara yang bagus untuk mengompresi regex itu tanpa membiarkan positif palsu.
sumber
eval
di Perl, dan sistem kompresiPython 2, 250 byte:
Demo:
sumber
PowerShell v3 +,
227219 byte121 byte itu hanya daftar aktor ...
Mengambil input
$args
dan-split
s pada baris baru dengan`n
. Pipa itu untuksort
, yang akan mengurutkan entri naik secara numerik, yang OK untuk saat ini. Kami menyalurkannya ke loop foreach|%{...}
, setiap iterasi mengambil entri,-split
pada spasi, lalu-join
babak kedua kembali bersama dengan spasi (yaitu, menghilangkan nomor dari awal). Nama-nama (naik) yang disortir sekarang tersisa di pipa. Kami menyalurkan mereka melalui mana dengan?
yang memastikan mereka adalah-in
daftar aktor yang disetujui. Akhirnya, kamiselect
hanya-u
entri unik, yang untuk duplikat akan memilih yang pertama ditemui (yaitu, yang berbobot terendah) dan membuang sisanya. Kami menyimpan array nama yang dihasilkan ke dalam$a
.Jadi, sekarang kita punya daftar aktor yang naik. Karena tantangan membutuhkan penurunan, kami melakukan operasi pembalikan di tempat
$a
dengan mengindeks dari$a.count
bawah ke0
.Contoh
Edit - tidak perlu menggunakan [array] :: Reverse () saat pengindeksan akan dilakukan
sumber
sort -Des
daripada pembalikan array? Memang, ini bisa dipecahkan di versi PowerShell nanti, tapi saya rasa itu tidak mungkin atau masalah nyata;)select -u
akan mengambil dan mempertahankan pemesanan bernilai tinggi , bukan yang terendah, jadi untuk contoh saya posisi Daniel Craig dan Roger Moore akan bertukar. Upaya saya untuk memperbaikinya menghasilkan kode yang lebih panjang daripada pembalikan array.Python
309286 bytesumber
print
atau setelah)
atau]
JavaScript (ES6), 232 byte
Penjelasan
sumber