Seperti yang Anda ketahui, babak grup Piala Dunia telah berakhir, dan mulai besok 16 tim terbaik akan memulai babak sistem gugur:
- Brazil (BRA)
- Meksiko (MEX)
- Belanda (NED)
- Chili (CHI)
- Kolombia (COL)
- Yunani (GRE)
- Kosta Rika (CRC)
- Uruguay (URU)
- Prancis (FRA)
- Swiss (SUI)
- Argentina (ARG)
- Nigeria (NGA)
- Jerman (APK)
- Amerika Serikat (AS)
- Belgia (BEL)
- Aljazair (ALG)
Di babak sistem gugur, setelah setiap pertandingan, pemenang lolos ke babak berikutnya, dan yang kalah pulang (tidak ada seri). Klik di sini untuk melihat lebih lanjut tentang babak sistem gugur.
Anda telah disewa oleh golfbet.com, situs web taruhan baru karena Anda dikenal pandai pemrograman dan taruhan olahraga. Tugas Anda adalah menulis program atau fungsi yang bisa menebak pemenang pertandingan. Tentu saja, semua orang membuat tebakan yang berbeda, tidak masalah selama tebakan Anda konsisten.
Jika Anda tidak ingin menebak, Anda dapat menggunakan tebakan berikut:
BRA
BRA
CHI
BRA
COL
COL
URU
GER
FRA
FRA
NGA
GER
GER
GER
ALG
GER
NED
NED
MEX
NED
CRC
CRC
GRE
ARG
ARG
ARG
SUI
ARG
BEL
BEL
USA
- Program harus menampilkan pemenang yang sama terlepas dari urutan ke tim (pemenang pertandingan BRA-CHI harus sama dengan pertandingan CHI-BRA)
- Jika tim kalah, itu tidak dapat memainkan pertandingan lagi. Ini berarti untuk pertandingan yang tidak terjadi, Anda harus menunjukkannya. Misalnya jika program Anda menebak Brasil untuk memenangkan pertandingan BRA-CHI, maka CHI-GER harus mengembalikan "tidak ada hasil", karena Chili tidak akan bermain melawan Jerman. Lihat tautan di atas untuk jadwal.
Demi kesederhanaan Anda tidak harus berurusan dengan pertandingan perunggu (tapi tentu saja Anda bisa).
Program atau fungsi Anda mengambil dua string sebagai input: kode negara 3 huruf dari kedua tim dan mengembalikan kode negara dari tim yang menang (Anda dapat menggunakan input / output standar, atau dua parameter fungsi / nilai pengembalian). Jika dua tim yang diberikan tidak akan bermain sesuai dengan tebakan Anda, Anda harus mengembalikan sesuatu yang lain (ini bisa apa saja kecuali kode negara, mis. String kosong, nol, pesan kesalahan). Anda dapat menganggap inputnya benar (dua kode negara berbeda yang ada dalam daftar).
Ini terutama kode-golf, sehingga program terpendek dalam byte menang. Namun, solusi yang bagus dan rumit juga berharga.
Contoh (tentu saja, Anda bisa menebak sendiri):
input: output BRA CHI: BRA
input: CHI BRA output: BRA
input: CHI GER output: tidak ada hasil
BRA BRA
danHAZ CHEEZBURGER
harus ditangani dengan benar?Jawaban:
Python 2.x -
368283Tantangan yang menarik. Tentu saja kita perlu mendapatkan peringkat sekarang dari FIFA . Brasil memiliki apa yang disebut "pemain ke-12" karena mereka memiliki keunggulan di kandang sendiri sehingga menjadi pembobolan 12/11.
Tips untuk mempersingkat di atas dipersilahkan :-).
Perbaikan berkat @TheRare dan @MrLemon
Ini mengarah pada hasil berikut:
Contoh panggilan:
sumber
j
(selalu nol). 2.for k
dapat ditulis dalam satu baris dengan menggunakan;
pembatas. 3. Anda tidak perlu spasi setelah kata kunci sukatry
atauexcept
4. Anda dapat menghapus spasi antara tanda kurung dan kata kunci (a[k]if d[k]>d[k+1]else a[k+1]
valid) 5.for n in 16,8,4,2
6.def f(s):print s in m and m[s]or'no result'
j
, tetapi ada sedikit kesalahan format denganj+=1
. Dan Anda dapat menyimpan banyak karakter dengan memasukkan kembali data FIFA ke[15,6,10,11,4,0,2,14,3,5,1,8,13,12,9,7]
, tentu saja.C,
182 178133 (atau 126)Bukan program terpendek di sini, tetapi ini adalah terpendek di mana prediksi dapat diubah dengan mudah. Sekarang semua semifinalis sudah diketahui, saya memperbarui.
Ada beberapa perubahan pada kode juga. Terlepas dari saran Dennis dalam komentar, program ini telah dikonversi ke fungsi (seperti membaca ulang ini diizinkan oleh aturan) dan hashing telah dipersingkat.
Kode, 133
Bagaimana itu bekerja
input
a
danb
hash dengan ekspresi*a-a[1]%16
ke satu karakter (*a
lebih pendek setara dengana[0]
). Hasil hash untuk tima
danb
disimpan dih
. Misalnya BRA CHI menjadi@;
. Nilai-nilai hasrat adalah sebagai berikut (semifinalis yang dikonfirmasi dan juara prediksi saya ditandai dengan*
.)t[]
menyimpan prediksi saya. Hasil babak 16 dan perempat final sekarang diketahui. Setiap kelompok dari 4 tim diperintahkan sedemikian rupa sehingga yang pertama dan keempat tersingkir, dan yang ketiga adalah semifinalis. Demikian pula dengan semifinalis, saya memprediksi bahwa 1st dan 4th akan dihilangkan dan semifinalis ke-3 akan menjadi pemenang keseluruhan. Jika Anda tidak setuju dengan prediksi saya, cukup pesan ulang tabelnya.Prediksi disimpan dalam blok palindrom untuk mengakomodasi kemungkinan pengguna memasuki tim dalam urutan yang memungkinkan. Urutan menempatkan tim yang menang dari setiap set 4 bersama untuk memainkan pertandingan ketiga. Dengan demikian pada kelompok pertama, GRE
E
hilang dari CRC dan MEXH
hilang dari NED. Ini mengatur CRCA
untuk memainkan NEDI
di perempat final tanpa harus mengulang pengetikan. Tali diisi dengan ruang antara masing-masing kelompok 4 tim / 7 karakter untuk membantu memastikan tidak ada output untuk tim yang tidak akan saling bermain.Pemenang setiap pertandingan mungkin dalam setiap kelompok 8 karakter adalah sebagai berikut:
invalid,b,a,a,b,b,a,invalid
. Dengan demikian pilihan pemenang yang tepat dapat dilakukan dengan mengambil posisih
dit
DAN 2 . Sayangnyastrstr
fungsi ini bukan yang paling straighforward karena mengembalikan pointerp
, jadi kita harus mengurangip
darit
untuk mendapatkan posisi aktual dalamt.
Jika pertandingan tidak valid (tidak dapat ditemukan dalamt
),p
adalah nol dan frasano result
dicetak.Beberapa perbaikan yang meragukan, 126
2 karakter disimpan oleh ekspresi hash yang ditingkatkan. Sayangnya, ini mengharuskan kasus tim seperti yang ditunjukkan dalam program uji di bawah fungsi (misalnya,
Bra
bukanBRA
seperti yang digunakan dalam program di atas.) Saya sudah puas sendiri bahwa tidak ada cara untuk melakukan ini dengan satu operator, jadi 2 operator dan konstanta satu karakter sama baiknya dengan yang didapat. Perhatikan juga bahwaUru
peta untukspace
karakter alternatif|
diperlukan untuk memisahkan kelompok kode tim.5 karakter disimpan dengan menghilangkan
t
dan memperlakukan string prediksi sebagai literal. Ini berarti tidak mungkin untuk mengetahui alamat tempat string disimpan. Namun, asalkan tidak disimpan pada nol, kami hanya tertarikp&2
sehingga kode akan berfungsi jika alamatnya dapat dibagi dengan 4. (Perhatikan bahwa tidak diperbolehkan untuk memperlakukan pointerp
secara langsung sebagai bilangan bulat, harus dikurangi dari pointer lain Saya menggunakan pointera
jadia
juga harus habis dibagi 4.) Orang dapat cukup percaya diri pada kompiler 32/64 bit / arsitektur string akan disimpan dengan cara ini. Ini telah bekerja dengan baik untuk saya di GCC / cygwin, meskipun menolak untuk dikompilasi di visual studio / windows.sumber
char
dan*p
dan menggantia[0]
,b[0]
danh[0]
dengan*a
, b` dan*h
. Juga, pertanyaan mengatakan bahwa * jika diberikan dua tim tidak akan bermain sesuai dengan tebakan Anda, Anda harus kembali sesuatu yang lain (ini bisa apa saja tapi kode negara, misalnya string kosong, null, pesan kesalahan) , sehingga pencetakan tidak ada hasil adalah tidak diperlukan dan Anda bisa menggantinyaputs(...)
dengan(p=strstr(t,h))&&puts(p-t&2?a:b)
.a[0]->*a
! Akan segera diperbarui. Hanya ingin tahu, apakah ada cara untuk mengakses array multidimensi dengan satu nomor? Saya menulis versi baris perintah ini dengan panjang yang identik (dapat menghemat 1 byte dengan a#define
.) Akan lebih baik untuk menghindari subskripsi ganda dalam kasus ini dan yang serupa:char *p,h[2],*t="-LgRrRgL bA9j9Ab hp535ph OKYtYKO KpAgApK";main(int c,char**v){h[0]=v[1][1]*3-v[1][0]*2;h[1]=v[2][1]*3-v[2][0]*2;puts((p=strstr(t,h))?v[1+!(p-t&2)]:"no result");}
h
harus diakhiri null, jadi harus demikianh[3]
. 2. Jika Anda mengaturp=v[1]
, Anda dapat mengaksesv[i][j]
sebagaip[4*(i-1)+j]
. Ini bekerja pada mesin saya, tapi saya tidak tahu apakah itu portabel ... 3. Anda harus dapat menginisialisasih
jika Anda mendeklarasikannya di dalammain
:main(int c,char**v){char*t="-LgRrRgL bA9j9Ab hp535ph OKYtYKO KpAgApK",*p=v[1],h[3]={p[1]*3-*p*2,p[5]*3-p[4]*2};(p=strstr(t,h))&&puts(v[1+!(p-t&2)]);}
for(int i=0;i<1000;i++)printf("%d %c ",i,i[*argv])
menggemakan kembali setiap karakter yang dapat dicetak dari baris perintah pada VS, tetapi pada GCC nama programnya adalah 0, argumen pertama adalah pada 40 dan argumen kedua tidak terlihat (saya naik ke 1000.) Penasaran. Lagi pula, saya mengubah ke fungsi yang ada dalam aturan, selain memperbarui prediksi saya (saya hanya menunggu hasil malam ini untuk mengkonfirmasi mereka sebelum memposting.) Terima kasih lagi dan semoga sukses melawan Brasil pada hari Selasa.JavaScript
215 206 120116Banyak ruang untuk perbaikan:
ES5 - 215
ES6 - 206
Pendekatan Regex - 116
Berkat ɐɔıʇǝɥʇu karena memposting tautan ini , ini membantu saya membuat regex
sumber
split(' ')
kesplit``
danjoin('')
kejoin``
.Python (
179148139 cq terlalu lama)Semua orang tahu negara dengan nama yang muncul pertama dalam alfabet akan menang. (Jawaban ini hanya ada untuk memulai sesuatu)
Berkat amal pria di sini , saya bisa mempersingkat jawaban saya:
Ini memang menganggap tim yang valid, tetapi tidak memerlukan susunan yang valid (
f('BRA','NED')
akan mengembalikan 0 (pertandingan tidak valid), tetapif('XNE')
akan kembali'XNE'
. Saya tidak mendapatkan dari pertanyaan Anda bahwa ini adalah masalah. Jangan ragu untuk kembali menyalahgunakan regex ini sesuai keinginan Anda.Terima kasih @Ventero, saya tidak tahu tentang regex.
sumber
re.search
dalam versi golf, bukanre.match
. Juga, Anda harus bisa menjatuhkan^
dan$
jangkar.Scala (150)
Berikut adalah pertandingan antara "foo" dan "bar" yang mungkin, juga tim yang tidak akan bermain secara nyata satu sama lain di babak pertama akan mendapatkan hasil (misalnya mulai dengan BRA, ARG)
Hanya merekam tim yang kalah.
Disebut dengan:
sumber
PowerShell (
261221)Sebagai pengguna PowerShell yang relatif baru, saya merasa pipeline benar-benar luar biasa. Saya pikir selanjutnya mungkin mencoba dan mengutak-atik array untuk mudah-mudahan menghilangkan semua panggilan substring ini. (Saya harus menambahkan panggilan di akhir atau kalau tidak itu menghasilkan kedua tim)
Asli
sumber
return
tidak perlu dalam banyak kasus.foreach
dan sebagian besar loop eksplisit dinilai berlebihan dan tidak berguna. Metode seperti.Substring
hanya boleh digunakan dalam keadaan ekstrem (dan sementara kegunaan sepak bola bisa diperdebatkan, itu bukan olahraga ekstrem). Umumnya Anda ingin menggunakan pipa sebanyak mungkin.for
loop sepertifor($c=0;$c-lt$x.length-1;$c+=2){$x+=$x[$c].Substring(3)+$x[$c+1].Substring(3)}
Anda hanya dapat menggunakan pipa dengan berbagai danForEach-Object
(alias%
):0..($x.Length/2)|%{$x+=$x[2*$_].Substring(3)+$x[2*$_+1].Substring(3)}
. Dengan hati-hati mempertimbangkan bagaimana data Anda diwakili, Anda kemungkinan besar bisa menyingkirkanSubstring
panggilan. Tanda kurung di sekitar array awal tidak diperlukan. Untuk array yang lebih besar itu juga masuk akal untuk menggunakan karakter pemisah dan penggunaan-split
(unary-split
dalam hal pemisah adalah spasi atau tab).foreach
Loop terakhir misalnya dapat ditulis sebagai pipeline juga (?
isWhere-Object
):$x|?{$_-match$a-and$_-match$b}|%{$_;exit};0
yang pada dasarnya mengatakan »Filter setiap elemen$x
untuk apakah cocok dengan keduanya$a
dan$b
dan output yang pertama, keluar setelah itu. Jika tidak ada yang dapat ditemukan, hasilkan 0. «. Karena Anda tahu format string Anda, Anda juga bisa menggunakannya-match"$a$b|$b$a"
, saya kira. Karena mereka hanya harus tampil dalam urutan dalam string. Yang juga berarti bahwa kita dapat menggunakan sedikit trik di sini:"$a$b","$b$a"-eq$_
untuk golf lagi byte.CJam,
6458 byteDi atas menggunakan tanda sisipan dan notasi, karena kode mengandung karakter yang tidak patut.
Dengan biaya tambahan enam byte, karakter tersebut dapat dihindari:
Cobalah online.
Uji coba
Bagaimana itu bekerja
sumber
CJam,
4948 byteDi atas menggunakan notasi tanda kuret, karena kode mengandung karakter yang tidak patut.
Dengan mengorbankan dua byte tambahan, karakter tersebut dapat dihindari:
Cobalah online.
Uji coba
Latar Belakang
Kami mulai dengan menetapkan dan karakter ASCII untuk setiap tim dengan mempertimbangkan namanya sebagai nomor basis 2, mengambil bilangan bulat modulo 91 yang dihasilkan, menambahkan 12 (untuk menghindari karakter yang tidak diinginkan) dan memilih karakter yang sesuai dengan kode ASCII yang dihasilkan. Dalam kode CJam, ini dicapai oleh
2b91%c
.Misalnya, kode karakter
ALG
are65 76 71
. Sejak(4 × 65 + 2 × 76 + 71) = 483
,483 % 91 + 12 = 40
dan 40 jika kode karakter(
.Ini memberikan pemetaan berikut:
Sekarang, kita dapat menyandikan pertandingan babak 16 sebagai berikut:
Jika kami menganggap bahwa tim pertama dalam urutan abjad selalu menang, pertandingan perempat final adalah sebagai berikut:
Perhatikan bahwa string ini dapat diperoleh dari yang pertama dengan memilih setiap karakter kedua, dimulai dengan yang pertama. Dalam kode CJam, ini dicapai oleh
2%
.Menggunakan ide yang sama, pertandingan semifinal dan pertandingan final adalah sebagai berikut:
Kode
mendorong string yang berisi kecocokan dari babak 16, lalu melakukan tiga kali berikut: duplikat string, ekstrak setiap karakter kedua salinan, digabungkan. Hasilnya adalah string
yang berisi semua kecocokan (beberapa diantaranya lebih dari satu kali).
Bagaimana itu bekerja
sumber
"(=BL2*;74)#%8J[K"{_2%+}3*
sama panjangnya dengan bentuk nonpalindromic dari string prediksi saya"rRgL j9Ab 35ph tYKO gApK"
tetapi jauh lebih mudah untuk ditangani.JavaScript 271
sumber