Dalam sepak bola asosiasi (juga dikenal sebagai sepak bola), adu penalti adalah tindakan kedua yang bisa digunakan dalam pertandingan yang tidak bisa berakhir dengan seri, setelah perpanjangan waktu (yaitu sepak bola asosiasi lembur).
Dalam adu penalti, wasit utama melempar koin untuk menentukan di mana gol adu penalti terjadi, dan kemudian melemparkan koin lain untuk menentukan tim mana yang mulai lebih dulu. Namun, satu-satunya hal yang relevan dengan tantangan ini adalah apa yang terjadi kemudian, dijelaskan di bawah ini.
Setiap tim memiliki 5 penalti yang tersedia di awal, dan skor penalti adalah 0-0. Jika, pada suatu titik, penalti tim yang tersisa tidak cukup untuk mengubah tim yang saat ini menang, adu penalti berhenti.
Jika tidak ada penalti yang tersisa, tetapi poin kedua tim sama, penalti tambahan diberikan untuk kedua tim. Ini diulangi sampai poin tidak sama.
Setelah tembak-menembak berhenti, tim dengan skor penalti terbesar memenangkan permainan.
Tantangan
Tantangan Anda adalah, diberi dua daftar A
dan B
mewakili tim penalti A dan tim B mana yang mencetak skor masing-masing, untuk menentukan apakah mereka mewakili adu penalti yang sah. Adu tembak adalah valid jika keadaan yang diwakili oleh input dapat dicapai, terlepas dari apakah tim pemenang dapat ditentukan. Perhatikan bahwa Anda mungkin harus menguji kedua skenario (awal Tim A, awal Tim B), karena, jika keadaan yang dijelaskan dalam input dapat dijangkau untuk setidaknya satu skenario, input tersebut valid. Jika panjang daftar berbeda, tim yang diwakili oleh yang lebih panjang mulai lebih dulu (hanya dapat memiliki satu elemen lebih banyak dari yang lain, dan tim daftar yang lebih pendek tidak dapat memulai, karena kemudian tim daftar yang lebih panjang akan menembakkan dua penalti berturut-turut, karena daftar yang lebih pendek akan habis sebelum waktunya).
Contoh terperinci
Anda dapat melompat ke bagian Aturan di bawah ini, ini hanya untuk membantu menyelesaikan tantangan.
Misalkan Anda mendapatkan shoot-out ini sebagai input, di mana -
berarti tidak ada gol yang dicetak dan X
berarti gol dicetak (itu tidak valid):
Team A: - X X X X
Team B: - - - - X
Assuming team A starts first:
Team A: - (0 - 0) (max possible score 4 - 5)
Team B: - (0 - 0) (max possible score 4 - 4)
Team A: X (1 - 0) (max possible score 4 - 4)
Team B: - (1 - 0) (max possible score 4 - 3)
Team A: X (2 - 0) (max possible score 4 - 3)
Team B: - (2 - 0) (max possible score 4 - 2)
Team A: X (3 - 0) (max possible score 4 - 2)
Team A already has a higher score than B could ever have, but the input hasn't
ended yet, so it's invalid if team A is first.
Assuming team B starts first:
Team B: - (0 - 0) (max possible score 5 - 4)
Team A: - (0 - 0) (max possible score 4 - 4)
Team B: - (0 - 0) (max possible score 4 - 3)
Team A: X (1 - 0) (max possible score 4 - 3)
Team B: - (1 - 0) (max possible score 4 - 2)
Team A: X (2 - 0) (max possible score 4 - 2)
Team B: - (2 - 0) (max possible score 4 - 1)
Team A already has a higher score than B could ever have, but the input hasn't
ended yet, so it's invalid if team B stars first.
The input is invalid no matter which team starts first, so it's considered
invalid.
Sebaliknya, ini adalah contoh yang valid:
Team A: X X X
Team B: - - -
Assuming team A starts first:
Team A: X (1 - 0) (max possible score 5 - 5)
Team B: - (1 - 0) (max possible score 5 - 4)
Team A: X (2 - 0) (max possible score 5 - 4)
Team B: - (2 - 0) (max possible score 5 - 3)
Team A: X (3 - 0) (max possible score 5 - 3)
Team B: - (3 - 0) (max possible score 5 - 2)
It can be determined that team A wins, however the input has ended, so it's
valid if team A starts first. Therefore, the input is valid.
Contoh lain, kali ini dengan penalti ekstra:
Team A: X - X - - - X -
Team B: - X X - - - X X
Assuming team A starts first:
Team A: X (1 - 0) (max possible score 5 - 5)
Team B: - (1 - 0) (max possible score 5 - 4)
Team A: - (1 - 0) (max possible score 4 - 4)
Team B: X (1 - 1) (max possible score 4 - 4)
Team A: X (2 - 1) (max possible score 4 - 4)
Team B: X (2 - 2) (max possible score 4 - 4)
Team A: - (2 - 2) (max possible score 3 - 4)
Team B: - (2 - 2) (max possible score 3 - 3)
Team A: - (2 - 2) (max possible score 2 - 3)
Team B: - (2 - 2) (max possible score 2 - 2)
First 5 penalties result in a tie, so we move on to extra penalties.
Team A: -, Team B: - (2 - 2)
Team A: X, Team B: X (3 - 3)
Team A: -, Team B: X (3 - 4)
It can be determined that team B wins, however the input has ended, so it's
valid if team A starts first. Therefore, the input is valid.
Berikut adalah input yang valid untuk menentukan pemenang:
Team A: X X - -
Team B: - X - X
Assuming team A starts first:
Team A: X (1 - 0) (max possible score 5 - 5)
Team B: - (1 - 0) (max possible score 5 - 4)
Team A: X (2 - 0) (max possible score 5 - 4)
Team B: X (2 - 1) (max possible score 5 - 4)
Team A: - (2 - 1) (max possible score 4 - 4)
Team B: - (2 - 1) (max possible score 4 - 3)
Team A: - (2 - 1) (max possible score 3 - 3)
Team B: X (2 - 2) (max possible score 3 - 3)
The input has ended before the winner can be determined, so it's valid if team A
starts first. Therefore, the input is valid.
Akhirnya, inilah input di mana panjang daftar berbeda:
Team A: - - -
Team B: X X - X
Since team B shot more penalties, it starts first:
Team B: X (0 - 1) (max possible score 5 - 5)
Team A: - (0 - 1) (max possible score 4 - 5)
Team B: X (0 - 2) (max possible score 4 - 5)
Team A: - (0 - 2) (max possible score 3 - 5)
Team B: - (0 - 2) (max possible score 3 - 4)
Team A: - (0 - 2) (max possible score 2 - 4)
Team B: X (0 - 3) (max possible score 2 - 4)
It can be determined that team B wins, however the input has ended, so it's
valid.
Aturan
- Tim yang menembak pertama kali bisa A atau B, Anda tidak dapat menganggap satu akan selalu menembak terlebih dahulu.
- Daftar tersebut akan memiliki panjang yang sama, atau panjangnya akan berbeda satu.
- Anda dapat memilih dua nilai berbeda dan konsisten untuk mewakili hukuman yang dicetak / tidak dicetak.
- Daftar juga dapat direpresentasikan sebagai bilangan bulat yang dikonversi dari basis 2 kata sifat , string atau format daftar asli bahasa Anda. Jika format bijective base 2 dipilih, aturan input berlaku untuk angka-angka yang dikonversi ke bijective base 2 (jadi digit
1
dan2
dapat berarti masing-masing mencetak gol dan tanpa skor atau tanpa skor dan skor masing-masing). Biner reguler tidak diperbolehkan , karena seseorang tidak dapat menentukan keberadaan nol terkemuka di representasi biner yang dimaksud. - Ini adalah kode-golf , sehingga solusi terpendek menang. Namun, tolong jangan berkecil hati untuk menjawab bahkan jika sepertinya bahasa Anda tidak dapat "mengalahkan yang khusus".
Uji kasus
Dalam kasus-kasus uji ini, a 0
akan mewakili tanpa tujuan, dan 1
akan mewakili suatu tujuan.
Format:
[Team A], [Team B]
Input yang valid:
[], []
[0], [0]
[0], [1]
[1], [1]
[0], []
[1, 1, 1, 1], [0, 0, 1, 1]
[0, 1, 1, 1, 1], [0, 1, 1, 0]
[0, 0, 0, 0, 1], [0, 0, 0, 1, 0]
[0, 0, 0, 0, 1], [0, 0, 0, 1]
[1, 1, 1, 1, 1, 1], [1, 1, 1, 1, 1, 1]
[1, 1, 1, 1, 1, 1], [1, 1, 1, 1, 1]
[0, 1, 1, 1, 1], [0, 1, 1, 0, 1]
[1, 1, 1], [0, 0, 0]
[1, 1, 1, 1], [0, 0, 1]
[0, 0, 0, 0, 0, 0, 0, 0, 0, 1], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
Input tidak valid:
[0, 1, 1, 1, 1], [0, 1, 1, 0, 0]
[0, 0, 0, 0, 0, 1], [0, 0, 0, 0, 1, 0]
[0, 0, 0, 0, 0, 1], [0, 0, 0, 0, 1]
[1, 1, 1, 0], [0, 0, 0]
[1, 1, 1, 1], [0, 0, 0]
[0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1]
[1, 0, 1, 0, 1], [0, 1, 0, 1, 0, 1]
[0, 0, 0, 0, 1], [0, 1, 1, 1, 0]
sumber
[[0,0],[1,1]]
(atau ada test case di mana salah satu dari dua daftar dalam memiliki 2 item) adalah benar, karena permainan masih berlangsung (seperti halnya test case dengan[[0],[1]]
atau[[0],[]]
masih dalam proses)?Jawaban:
JavaScript (ES6),
117 112109 byte(a)(b)
Cobalah online!
Berkomentar
sumber
Python 2 ,
176169171169 byte-2 byte terima kasih kepada @Kevin Cruijssen
Cobalah online! (Termasuk beberapa test case tambahan yang tidak tercantum di atas.)
Menciptakan fungsi
f
yang mengambil dua argumen (dua daftar penalti yang dicetak / tidak dihukum) dan kembaliTrue
jika skor mungkin valid danFalse
sebaliknya.Penjelasan sebagian:
Pertama-tama,exec
konstruksi hanyalah cara untuk menghemat beberapa byte dengan tidak harus mengulangi ekspresilen(a+b)
lebih dari sekali. Sepotong kode di atas setara dengan yang berikut:Pembaruan: jawaban yang baru dan lebih baik adalah jumlah byte yang sama dengan atau tanpaexec
tipu daya, jadi demi kesederhanaan saya telah menghapusnya.Pembaruan 2: Versi bugfixed baru termasuk lebih banyak kompresi string melalui substitusi dan
exec
. Ya, saya menggunakan%
pemformatan dan.replace
pada string yang sama. Kode di atas setara dengan:not len(a+b)>10
h
m
Namun, untuk menjadi set skor yang valid, input tidak harus benar-benar berkelanjutan, tetapi itu harus telah berkelanjutan sebelum tendangan terakhir dilakukan. Kondisi ini setara dengan mengatakan bahwa itu harus 1) telah berkelanjutan saat terakhir kali kedua belah pihak menendang jumlah yang sama kali dan 2) saat ini berada dalam dua setengah poin menjadi berkelanjutan - yang merupakan alasan argumen terakhir
h
:h(a[:~-len(a+b)/2],b[:~-len(a+b)/2],6)
menguji kondisi 1) danh(a,b,7)
(yang7
mewakili dua poin tambahan yang diijinkan dalam margin) menguji kondisi 2).Kasus di mana masing-masing tim telah menendang maksimal lima kali telah diselesaikan. (Penjelasan dilanjutkan untuk kasus lainnya.)
Dalam hal bermain golf tingkat rendah, saya ragu ada terlalu banyak untuk dicukur, tetapi secara algoritmik mungkin bisa dilakukan sedikit lebih sederhana.
sumber
(%s-1)/2
untuk~-%s/2
menyelamatkan 2 byte.Jelly ,
625449 byteCobalah online!
Perhatikan kode footer di tio hanya untuk menangani beberapa test case dan mencetak output terhadap input.
Terima kasih kepada @EriktheOutgolfer untuk bermain golf 8 byte
sumber
Perl 6 , 123 byte
Cobalah online!
Mengembalikan falsey untuk tembak-menembak yang valid, jujur untuk yang tidak valid.
Penjelasan
sumber