body{font-family:'Helvetica Neue',Arial,sans-serif;color:#444;font-size:13px;width:500px;line-height:1.3}h3{font-size:16px!important;line-height:1.2em!important;margin-bottom:1.2em}code{white-space:pre-wrap;padding:1px 5px;font-family:'Droid Sans Mono',Consolas,Menlo,Monaco,Lucida Console,Liberation Mono,DejaVu Sans Mono,Bitstream Vera Sans Mono,Courier New,monospace,serif;color:#222;background:#eee}p code{padding:1px 5px}pre{overflow:auto;width:auto;width:480px !ie7;max-height:600px;font-family:'Droid Sans Mono',Consolas,Menlo,Monaco,Lucida Console,Liberation Mono,DejaVu Sans Mono,Bitstream Vera Sans Mono,Courier New,monospace,serif;margin-bottom:10px;padding:5px;background:#eee;border-left:2px dotted #ccc;font-size:12px}pre code{white-space:inherit;padding:0;background:0 0}
<h3>Problem 1 - Finding Chessboards</h3><p>Match any rectangular subregion, at least 3 columns wide and 3 rows tall, which consists of alternating <code>#</code> and <code>_</code>. The top left corner may be either of those two characters.</p><p><strong>Match</strong></p><pre><code>~______~ ~##_#_#~ ~#_#_##~ ~##_#_#~ ~______~ </code></pre><p>(There's an alternating 4x3 region in the centre. The match could be either that or either of its two 3x3 subregions.)</p><p><strong>No match</strong></p><pre><code>#_## _#_# __#_ #_#_ #_#_ </code></pre><p>(Contains two 3x2 regions, but no alternating 3x3 region.)</p><h3>Problem 2 - Verifying Chessboards</h3><p>Match the entire input, provided all of it consists of alternating <code>#</code> and <code>_</code>. It may start with either of those two characters.</p><p><strong>Match</strong></p><pre><code>_#_#_#_# #_#_#_#_ _#_#_#_# </code></pre><p><strong>No match</strong></p><pre><code>_#_#_#__ __#_#_#_ _#_#_#__ </code></pre><h3>Problem 3 - Detect a Rectangle of Digits</h3><p>Match a rectangle (at least 2x2) consisting only of digits and no other characters.</p><p><strong>Match</strong></p><pre><code>hbrewvgr 18774gwe 84502vgv 19844f22 crfegc77 </code></pre><p>You should match either the 5 wide by 3 tall rectangle (or any subset thereof) or the 2 by 2 rectangle.</p><p><strong>No Match</strong></p><pre><code>uv88wn000 vgr88vg0w v888wrvg7 vvg88wv77 </code></pre><p>There are no rectangles of digits.</p><h3>Problem 4 - Finding a Word in a Word Search</h3><p>Match the smallest rectangular region containing containing the word "GOLF" in any orientation (horizontal, vertical, diagonal, forwards or backwards). If your language supports non-rectangular matches, you may also match diagonal words without the surrounding rectangle.</p><p><strong>Match</strong></p><pre><code>INOWCEF IFWNOPH VULUHGY GUYOIGI YTFUGYG FTGYIOO </code></pre><p>"GOLF" is found backwards along an upper-left to bottom-right diagonal. This is the region containing it:</p><pre><code>FWNO ULUH UYOI TFUG </code></pre><p><strong>No Match</strong></p><pre><code>BHTGIVUHSR BWEVYWHBWB BHTWBYTWYB </code></pre><p>("GOLF" cannot be found anywhere.)</p><h3>Problem 5 - Detect Square Inputs</h3><p>Match the entire input if it is a square block of characters.</p><p><strong>Match</strong></p><pre><code>qwerty asdfgh zx vbn uiop[] `1234 67890- </code></pre><p>There are six lines, each of which contains six characters, even though two characters are spaces.</p><p><strong>No Match</strong></p><pre><code> hello world </code></pre><p>The two lines don't each contain two characters.</p><h3>Problem 6 - Find Gliders in a Game of Life</h3><p>In Conway's <a href=http://en.wikipedia.org/wiki/Conway%27s_Game_of_Life rel=nofollow>Game of Life</a> one of the most popular and simple patterns is the <a href=http://www.conwaylife.com/wiki/Glider rel=nofollow>glider</a>. There are two different stages in a glider's life cycle:</p><pre><code>## ## # # and ## # # </code></pre><p>Of course, the Game of Life is invariant under rotation and reflection, so in total there are 16 different shapes which resemble a glider at some stage.</p><p>Given input consisting only of <code>#</code> and spaces, match a 3x3 block containing a glider in any orientation. Spaces are significant! (Due to the conditions in the surrounding 5x5 layer, these matches might not be actual gliders, but don't worry about that.)</p><p><strong>Match</strong></p><pre><code>## # # ## # # # # # ## ### # # # # </code></pre><p>This contains three gliders - top right corner, bottom right corner and left centre.</p><p><strong>No match</strong></p><pre><code>## # # ### ## # # # # ## ### </code></pre><h3>Problem 7 - Match Nether Portals</h3><p>Based on <a href=http://codegolf.stackexchange.com/questions/45488/nether-portal-detection>this challenge</a> by Calvin's Hobbies.</p><p>In the game of Minecraft, players can construct inter-dimensional portals using blocks of obsidian arranged into a rectangular frame. Given a 2D slice of the world, match a Nether portal. A valid Nether portal is a rectangle of empty space (<code>.</code>) surrounded on all sides by obsidian (<code>X</code>). The rectangle of space can be from 2 wide by 3 tall to 22 wide by 22 tall. Corners don't matter.</p><p><strong>Match</strong></p><pre><code>....X...... .XXXXXX.XX. ...X...X... .X.X...XXX. ...X...X.X. .XXX...X.X. X..XXXXX.X. </code></pre><p>This is a 3 wide by 4 tall portal.</p><p><strong>No Match</strong></p><pre><code>XX..XXXX XX..X..X XX..X..X ..X.X..X .X..X.XX </code></pre><p>This is almost a 2 wide by 3 tall portal, but one obsidian block is missing from the bottom.</p><h3>Problem 8 - Minecraft Chest Placement</h3><p>Based on <a href=http://codegolf.stackexchange.com/q/45720/8478>this challenge</a> by Calvin's Hobbies.</p><p>For this problem, returning the position of the match might be more useful than returning the actual match. "Adjacent" refers only to neighbours in four orthogonal directions. You're given a grid of <code>.</code> (empty cell) and <code>C</code> (chest). Two adjacent chests are considered a "double chest". You should match valid positions for placing additional chests. An empty cell is valid as long as it not adjacent to a double chest or two normal chests. Taking the example from the linked challenge, if the input is</p><pre><code>.......C.. ...C..C... .........C .CC...CC.. .......... </code></pre><p>the pattern should match the cell marked by <code>*</code> in the following grid:</p><pre><code>******.C** ***C**C.** *..***..*C .CC.*.CC.* *..***..** </code></pre><h3>Problem 9 - Horizontal and Vertical Alignment</h3><p>Match a part of a column or row if it contains two or more <code>#</code> characters. As an extension, you could return the index of the column or row. If your language supports non-contiguous matches, match <em>only</em> the two <code>#</code>, not the row/column in between.</p><p><strong>Match</strong></p><pre><code>.,.,.,.#., ,.,#,.,.,. .,.,.,.,., ,.,.,.,.,. .,.#.,##., ,.,.,.,.,. </code></pre><p>There are 5 possible matches, three horizontal or two vertical. The horizontal matches are <code>#.,#</code>, <code>##</code>, and <code>#.,##</code>. The vertical matches are <code>#,.#</code> and <code>#.,.#</code>. The language can match any one or more of those.</p><p><strong>No Match</strong></p><pre><code>.,.#.,., ,.,.,.#. .,#,.,., ,.,.,.,# .#.,.,., ,.,.#.,. #,.,.,., ,.,.,#,. </code></pre><p>This is also a solution to the Eight Queens problem.</p><h3>Problem 10 - Collinear Points</h3><p>Match a set of three <code>#</code>s that are in a straight line, which can have any orientation, not necessarily horizontal or vertical (i.e. it could be diagonal are long knight's move steps). If your language supports non-contiguous matches, match <em>only</em> the three <code>#</code>, not the characters in between.</p><p><strong>Match</strong></p><pre><code>........ #..#..#. ...#.... #....... ...#.... </code></pre><p>There are three possible matches. They are: the second row, the fourth column, and a diagonal line across 7 columns and 3 rows.</p><p><strong>No Match</strong></p><pre><code>.#..# #..#. #.... ..#.# </code></pre><p>There are no collinear <code>#</code>s in this input.</p><h3>Problem 11 - Verify Prelude Syntax</h3><p><a href=http://esolangs.org/wiki/Prelude rel=nofollow>Prelude</a> is an esoteric language, which has very few, but unusual, restrictions on what constitutes a valid program. Any block of printable ASCII text is valid provided that:</p><ul><li>Every column of text contains at most one of <code>(</code> and <code>)</code>.</li><li>Ignoring their vertical position, the <code>(</code> and <code>)</code> are balanced. Each <code>(</code> and be paired with exactly one <code>)</code> to the right of it, and vice-versa.</li></ul><p>The pattern should match any valid Prelude program and fail to match invalid programs.</p><p><strong>Match</strong></p><pre><code>?1-(v #1)- 1 0v ^(# 0)(1+0)#)! (#) ^#1-(0 # </code></pre><p><strong>No match</strong></p><pre><code>#(#(##)##)##( )##(##(##)#)# </code></pre><p>For more examples, see <a href=http://codegolf.stackexchange.com/q/47239/8478>this challenge</a>.</p><h3>Problem 12 - Avoid the Letter Q</h3><p>Match any 4x4 square of characters that does not contain the letter <code>Q</code> or <code>q</code>.</p><p><strong>Match</strong></p><pre><code>bhtklkwt qlwQklqw vtvlwktv kQtwkvkl vtwlkvQk vnvevwvx </code></pre><p>There is one 4x4 square that does not contain any Qs. This is</p><pre><code>vlwk twkv wlkv vevw </code></pre><p><strong>No Match</strong></p><pre><code>zxvcmn xcvncn mnQxcv xcvmnx azvmne </code></pre><p>The single <code>Q</code> in the center prevents any matches from being formed.</p><h3>Problem 13 - Diamond Mining</h3><p>Locate a diamond in a field of characters. Diamonds are rotated squares formed by the characters <code>/\X</code>. Each corner of the diamond is formed by an <code>X</code>, and the corners are connected in lines formed by <code>\</code> or <code>/</code>, where each side is the same length. A diamond of size 0 has no <code>/\</code> sides. As an extension, you can return all of the diamonds in the field, return only the diamond's characters, and/or return the size of the diamond found.</p><p><strong>Match</strong></p><pre><code>...X......X.... ../.\..../.\... ./.X.\..X...X.. X.X.X.XX.\./.\. .\.X.//.\.X...X ..\./X...X.\./. .X.X..\./...X.. X.X....X....... .X............. </code></pre><p>There are 6 different diamonds in this field. Two are size 0, three are size 1, and one is size 2. Notice how diamonds can overlap parts or nest. You should be able to match diamonds of any size up to a reasonably high limit.</p><p><strong>No Match</strong></p><pre><code>.X......./.... .\....X....... ...X.\.\...X.. ..X.\...\.X.\. ...X.X...X.\.X ../X\...\...X. .X...\.\..X... ..\./.X....X.. ...X..../..... </code></pre><p>No diamonds are found here.</p><h3>Problem 14 - Matching Crosses</h3><p>We'll define a cross as a rectangular region, which has been sliced into a (not necessarily regular) grid of 3x3 subregions. The four corner regions are filled with <code>.</code> whereas the other five regions are filled with <code>#</code>.</p><p><strong>Match</strong></p><pre><code>....... .###... ######. ######. .###... .###... .###.#. ....### .....#. </code></pre><p>There is the small cross in the lower right corner, and the large cross yields 5 potential matches: the top and left arms will always have length 1, but the right and bottom arms can each either have length 1 or 2 - in addition the bottom arm can have length 3 if the right arm has length 1. Note that the full large cross cannot be matched because the top of the small cross would protrude into the lower right region.</p><p><strong>No Match</strong></p><pre><code>.######. ...##... ...##... ........ </code></pre><p>Each arm must have length of at least 1.</p><h3>Problem 15 - Match a Word in a Boggle Board</h3><p><a href=http://en.wikipedia.org/wiki/Boggle rel=nofollow>Boggle</a> is a bit like a word search, except that you change direction after each letter. Given a block of text, if it contains the word <code>panama</code> (<em>case-insensitive!</em>) according to the Boggle rules, match the smallest rectangle containing it. You may decide whether single letters can be reused or not. If your language can handle both, show it off! If you allow letters to be reused you can also choose if a letter can be used twice in a row (i.e. whether staying on the same cell is a valid move). If your language supports non-rectangular matches, match <em>only</em> the word.</p><p><strong>Match without reusing letters</strong></p><pre><code>EmYPhNuy AaaKVsjL onlGviCw DdOgFrRn ISeHZmqc zMUkBGJQ </code></pre><p>(There's a snaking <code>panamA</code> or <code>panAma</code> towards the upper left corner, depending on the order it's matched in.)</p><p><strong>Match with reusing letters</strong></p><pre><code>ExYPhNuy AfEKVsjL oblGviCw DdOgArRn ISepnmqc zMUkBGJQ </code></pre><p>(There's a <code>pAnAmA</code> towards the lower right corner, where all three <code>A</code> are the same.)</p><p><strong>No Match</strong></p><pre><code>BpbrzTHY mAJVRLuF jyXSPknK hoeGcsEl QCZagNMI dvUOqixt </code></pre><h3>Problem 16 - Wrap around the Edges</h3><p>Match a rectangle of <code>#</code>, at 3x3 in size, which may wrap around the edges of the input.</p><p><strong>Match</strong></p><pre><code>#..## #..## ..... #..## </code></pre><p>(The 9 <code>#</code> form exactly one 3x3 region if you consider the edges to be adjacent.)</p><p><strong>No Match</strong></p><pre><code>...## #..## #..## #..#. </code></pre>
Jawaban:
SnakeEx
Memecahkan masalah 15/16 sejauh ini!
Penerjemah Online ! - Spesifikasi Bahasa Lengkap - Sumber Javascript
Gagasan di balik bahasa ini adalah untuk mendefinisikan 'ular' yang bergerak di sekitar karakter memeriksa teks menggunakan sintaks seperti regex.
Sebuah program di SnakeEx terdiri dari daftar definisi untuk ular menggunakan urutan perintah yang berbeda. Ular dapat memunculkan ular lain menggunakan definisi ini, yang merupakan tempat SnakeEx mendapatkan sebagian besar kekuatannya - kita dapat mencocokkan struktur percabangan dan bahkan melakukan rekursi (lihat contoh Pencocokan Paren).
Setiap program pada dasarnya akan terlihat seperti seperangkat regex, tetapi dengan penambahan perintah arah dari bentuk
<dir>
yang mengubah arah ular, dan memanggil perintah dari bentuk{label<dir>params}
yang menelurkan lebih banyak ular.Untuk titik masuk, juru bahasa menelurkan satu ular menggunakan definisi pertama, bergerak ke kanan.
Ini tidak terlalu ringkas, tetapi sangat kuat dan (saya pikir) cukup mudah dibaca.
Pembaruan
<!>
untuk menyelesaikan colinear%{min,max}
Solusi
15 diselesaikan, 1 sedang berlangsung
Anda dapat dengan mudah mencoba program-program ini menggunakan Penerjemah Online yang ditautkan di atas!
Masalah 1 - Menemukan Papan Catur
Untuk pengantar terperinci, mulai dari Masalah 3.
Masalah 2 - Memverifikasi Papan Catur
Mengakhiri ular yang sesuai dengan simbol di luar batas
$
adalah salah satu cara untuk membuat program mencocokkan hanya seluruh input.Masalah 3 - Mendeteksi Rectangle of Digit
The
m
ular gerakan yang benar, pemijahan minimal 2 ular (%{2,}
adalah penutupan yang berarti "2 hingga tak terbatas") menggunakan definisi c (c
) dan bergerak kanan (<R>
), atau lebih tepatnya bawah dalam hal ini, karena semua arah yang relatif terhadap ular saat ini. TheA
param adalah gula yang hanya menetapkan bahwa ular pemijahan harus bergerak setelah panggilan. The1
parameter adalah bagaimana kita membatasi pertandingan persegi panjang - jumlah parameter menempatkan ular di "kelompok". Kecocokan tidak dihitung kecuali semua ular dalam kelompok yang sama menempuh jarak yang sama persis.Masalah 4 - Menemukan Kata dalam Pencarian Kata
Perintah arah
<*>
menentukan bahwa ular harus berputar ke arah diagonal atau ortogonal. Kemudian, ia mencari regex sederhana.Masalah 5 - Mendeteksi Input Kuadrat
Kuncinya di sini adalah karakter khusus
$
, yang hanya cocok jika ular itu di luar batas. Kami menelurkan ular horizontal dan vertikal; masing-masing memunculkan lebih banyak ular saat berjalan di sepanjang tepi, dan semua itu berada dalam kelompok yang sama dan harus memiliki panjang yang sama.Masalah 6 - Temukan Glider dalam Game of Life
m
dimulai di salah satu dari empat arah ortogonal (<+>
), mencapai rotasi. Kemudian, tampak kiri atau kanan untuk tiga baris secara berurutan, mencapai refleksi.(Perhatikan bahwa saya telah mengganti spasi dengan titik hanya karena area teks HTML yang digunakan dalam penerjemah saya tampaknya melakukan hal-hal bodoh jika mereka memiliki beberapa spasi berturut-turut)
Masalah 7 - Match Nether Portal
The
m
bergerak ular yang tepat, pemijahan ular untuk memeriksa tepi kiri, 2-22 ular untuk memeriksa kolom tengah, dan akhirnya ular untuk memeriksa tepi kanan. The~
Operator menunjukkan bahwa apa pun yang berikut harus diperiksa tetapi tidak harus ditandai sebagai bagian dari solusi.Penutupan terikat sekarang memungkinkan kita untuk menyelesaikan masalah ini dengan sepenuhnya dan benar!
Masalah 8 - Penempatan Dada Minecraft
Di sini kami menggunakan logika not (
!
), yang cocok jika dan hanya jika token berikut tidak cocok dengan apa pun. Deklarasid
mendeteksi dada ganda di arah tertentu, jadi!{d<+>}
pastikan tidak ada dada ganda di arah ortogonal mana pun.s
bergerak dalam berlian kecil di sekitar alun-alun saat ini, memverifikasi setidaknya 3 dari ruang tersebut kosong atau tidak terpasang. Trailing\.
akhirnya cocok dengan alun-alun, dengan asumsi semua kondisi sebelumnya berhasil.Masalah 9 - Alignment Horisontal dan Vertikal
Ular
m
berbelok ke kanan (<R>?
) sebelum mencocokkan urutannya..
adalah wildcard, seperti di regex.Soal 10 - Poin Colinear
Dengan penambahan
<!>
arah, kita bisa menyelesaikan ini sekarang!<!>
seperti<+>
tetapi bukannya bercabang di empat arah, itu bercabang di setiap arah yang memungkinkan.Masalah 12 - Hindari huruf Q
Hanya memunculkan 4 ular yang masing-masing mencari empat karakter yang bukan huruf Q.
Masalah 13 - Penambangan Intan
Yang ini cukup rapi.
m
memunculkan dua ular, satu pergi ke kanan belakang, dan satu ke kanan ke depan. Masing-masing mengikuti garis miring ke X, kemudian memunculkan ular lain pada sudut kanan ke arah saat ini, yang mengikuti garis miring ke X.Masalah 14 - Mencocokkan Salib
Inilah pertama kalinya saya menggunakan
P
parameter iggyback. Biasanya ular itu independen, tetapi jika Anda melakukan panggilan dengan parameter ini, ular panggilan akan dipindahkan dengan callee. Jadie2
dapat memeriksa urutan '.', Lalu urutan '#', lalu urutan lain dari '.', Dan meminta mereka semua menjadi panggilan terpisah sehingga kita dapat mengelompokkannya dengan '1,' 2 ', dan' 3 ' , memaksa mereka untuk mencocokkan.Masalah 15 - Cocokkan Kata di Papan Perundingan
Sederhana, jika bertele-tele.
I
parameter menentukan ketidakpekaan huruf (kita dapat menentukan parameter pada definisi serta panggilan). Ular itu berputar ke segala arah, cocok dengan karakternya, berputar lagi, dan sebagainya.Ini adalah versi tanpa-penggunaan-karakter. The
E
parameter Xclusive melarang ular dari pencocokan karakter yang telah ditandai, seperti jalan lendir feersum ini.Masalah 16 - Bungkus Tepian
The
W
parameter memungkinkan ular untuk membungkus ketika berjalan out-of-batas. Kami juga memilikiH
danV
hanya mengizinkan pembungkus horizontal atau vertikal.Extra - Maze Solver
Memecahkan labirin ASCII di mana lantai yang bisa dilewati adalah titik. The
<P>
berarti arah depan, kiri, atau kanan (gula untuk[<F><L><R>]
).Pencocokan Ekstra - Paren
Belum tahu bagaimana melakukan Prelude, tapi inilah langkah pertama! Di sini saya menggunakan
r
ular secara rekursif untuk mencocokkan tanda kurung yang sesuai dengan memeriksa bahwa tidak ada tanda kurung yang tidak cocok di antara mereka.Ekstra - Topologi ASCII: Menghitung Loop
sumber
m:{a<>}
a:[({n<R>A})({n<R>A}*{l<R>A}{a<>P}{r<R>A})]*{n<R>A}*
l:$[^\(\)]*\([^\(\)]*$
r:$[^\(\)]*\)[^\(\)]*$
n:$[^\(\)]+$
Slip, Python 3.4 ( Github wiki , juru bahasa online )
Seperti pengajuan feersum ini juga didasarkan pada melintasi grid, tetapi seperti pengajuan CarpetPython ini didasarkan pada regex. Entah bagaimana sepertinya aku berhasil mengambil jalan tengah.
Ada cukup banyak fitur yang tidak diterapkan yang ingin saya tambahkan, jadi di mana relevan saya mencatat apa yang ingin saya lakukan ketika saya punya waktu.
Pembaruan
(Lihat halaman Github untuk berita detail)
5 Apr 2015 : Slip sekarang memiliki juru bahasa online ! Ini masih dalam tahap awal, jadi mungkin ada beberapa bug.
5 Apr 2015 : Pembaruan efisiensi! Sekarang apakah portal input besar jauh lebih cepat (2s). Juga ada sejumlah perubahan sintaks, jadi pastikan untuk memeriksa wiki. Penomoran grup juga diperbaiki.
Slip memiliki pointer pertandingan yang dimulai pada kotak tertentu dan pada awalnya menghadap ke kanan. Ketika char dicocokkan, pointer bergerak maju ke arah saat ini (meskipun implementasi tidak melakukan hal-hal tepat dalam urutan itu).
Arah pertandingan pointer dapat diatur ke arah tertentu dengan
^<digit>
, di mana^0
,^1
,^2
, ...,^7
mengatur pointer ke N, NE, E, ..., NW masing-masing (akan searah jarum jam).Cara pintas berikut juga tersedia:
^*
memeriksa semua 8 arah orthogonal atau diagonal,^+
memeriksa semua 4 arah ortogonal.(Rencana di masa depan: Izinkan pengaturan arah yang sewenang-wenang, misalnya
(1, 2)
untuk langkah knight)Misalnya ( Masalah 4 - Menemukan kata dalam pencarian kata ),
mencoba semua 8 arah orthogonal atau diagonal, mencari kata "GOLF". Secara default, Slip mencoba semua kotak awal yang mungkin dan mengembalikan satu hasil dari masing-masing, memfilter duplikat, jadi seperti grid
mengembalikan hanya baris atas dan baris bawah sebagai pasangan (karena baris atas dan kolom kiri "GOLF" dimulai dari kotak yang sama). Untuk mendapatkan semua kecocokan,
o
mode kecocokan yang tumpang tindih dapat digunakan.Demikian pula ( Masalah 15 - Cocokkan kata di papan Boggle ),
cocok
panama
dengan mencoba arah yang berbeda setiap kali. Gunakani
bendera untuk ketidaksensitifan kasus. Slip menggunakan ulang karakter secara default, tetapi ini dapat diaktifkan denganr
bendera tanpa-ulangi.(Rencana mendatang: pengubah mode pencarian yang secara otomatis memeriksa set arah setelah setiap gerakan sehingga pengulangan
^*
tidak perlu)Arah match pointer juga dapat diputar 90 derajat ke kiri atau ke kanan dengan
<
atau>
masing - masing. Misalnya,mencari polanya
dengan melihat dalam urutan sebagai berikut:
Ini memungkinkan kami untuk menyelesaikan Masalah 6 - Menemukan glider bersama
di mana bagian 1 dan 2 mengkodekan bentuk glider, dan bagian 3 dan 4 mengkodekan rekan-rekan tercermin mereka.
Perhatikan bahwa Slip menggunakan backtick
`
untuk melarikan diri. Ini karena Slip memiliki bentuk gerakan lain yang memberikan bahasa namanya - perintah slip./
tergelincir pointer pertandingan ortogonal ke kiri, sedangkan\
tergelincir pointer pertandingan ortogonal ke kanan.Sebagai contoh,
dapat dicocokkan dengan
abc\def/ghi
.Meskipun tidak terlalu berguna dengan sendirinya, tergelincir menjadi lebih penting ketika dikombinasikan dengan
(?| <regex> )
kelompok stasioner, yang bertindak seperti mencari yang cocok. Regex di dalam dicocokkan, kemudian pada akhir itu posisi dan arah pointer pertandingan diatur ulang ke keadaan sebelum kelompok stasioner.Sebagai contoh,
dapat dicocokkan dengan
(?|abc)\(?|def)\(?|ghi)
.Demikian pula, Masalah 12 - Hindari huruf Q dapat diselesaikan dengan
di mana
%
ada perintah no-slip untuk menghentikan yang pertama\
dari pengaktifan.Slip juga memiliki penegasan panjang
(?_(<group num>) <regex> )
, yang hanya cocok dengan regex di dalamnya jika panjang kecocokannya sama dengan panjang dari jumlah grup yang diberikan.Misalnya, Masalah 13 - Penambangan berlian dapat dengan mudah diselesaikan
yang mencoba untuk mencocokkan sisi kiri atas berlian terlebih dahulu, kemudian menegaskan bahwa ketiga sisi lainnya memiliki panjang yang sama.
(Jalankan dengan
v
flag untuk output verbose)Alternatif pegolf adalah
yang cocok dengan sisi pertama dua kali.
Banyak masalah lain dapat diselesaikan dengan menggunakan slip, kelompok stasioner dan panjang menegaskan:
Masalah 14 - Mencocokkan salib:
Setelah Anda menangkap lebar
.
s dan#
s di baris pertama, itu hanya tergelincir ke bawah.Keluaran:
Yang ini mungkin bisa golf dengan sedikit rekursi, setelah saya menyelesaikan beberapa bug.
Masalah 3 - Mendeteksi persegi panjang angka:
Cocokkan satu baris teratas dari dua digit atau lebih, lalu pastikan setiap baris di bawah ini memiliki panjang yang sama.
`d
adalah kelas karakter standar yang setara dengan[0-9]
.Perhatikan bahwa ini menemukan semua kecocokan .
Masalah 7 - Mencocokkan portal bawah:
yang menghasilkan, untuk contoh teratas di utas asli :
Akhirnya, beberapa fitur Slip lainnya termasuk:
$0, $1, $2, ..., $7
jangkar tepi utara, sudut timur laut, tepi timur, dll.$+
jangkar setiap tepi dan$*
jangkar setiap sudut.$
diikuti oleh karakter huruf kecil menetapkan jangkar di posisi saat ini, yang nantinya dapat dicocokkan dengan$
diikuti oleh karakter huruf besar yang sesuai, misalnya$a
dan$A
.#
matikan flag no-move, yang menghentikan pointer pertandingan untuk bergerak maju setelah pertandingan berikutnya.,
cocok dengan karakter suka.
, tetapi tidak menambahkannya ke output, memungkinkan untuk pertandingan non-berdekatan sambil dapat dikenali oleh(?_())
.... dan banyak lagi. Ada terlalu banyak untuk dicantumkan di halaman ini.
Masalah lainnya
Masalah 1 - Menemukan papan catur:
Dua masalah papan catur jelas bukan keahlian Slip. Kami mencocokkan baris atas kemudian memastikan paling tidak panjangnya 3 dan berganti-ganti di antara ,
#
dan_
kemudian terpeleset dan cocok dengan baris berikutnya. Pada akhirnya,$a
jangkar harus berada di kanan bawah papan catur.Kami kemudian belok kiri dan ulangi untuk kolom, memastikan kami cocok
$A
di akhir.Masalah 2 - Memverifikasi papan catur:
Seperti masalah sebelumnya, kami memeriksa bahwa setiap baris sudah benar, lalu putar ke kiri dan lakukan hal yang sama untuk kolom. Jangkar digunakan untuk memastikan hanya seluruh papan yang cocok.
Masalah 9 - Penyelarasan horizontal dan vertikal:
Kami menerapkan opsional? kuantifier ke
>
perintah rotate sehingga kita dapat mencocokkan ke kanan atau ke bawah. Kami menemukan semua 5 dalam contoh dengano
mode tumpang tindih, tetapi hanya 4 tanpa itu sejak#.,##
dan#.,#
mulai dari posisi yang sama.Soal 10 - Titik kolinear
Cocokkan
#
beberapa karakter horisontal kemudian dan beberapa karakter vertikal, lalu ulangi sampai yang kedua#
, dan ulangi sampai yang ketiga#
.Masalah 5 - Mendeteksi input persegi:
Jangkar sudut kiri atas, dan periksa bahwa tepi atas sama panjang dengan tepi kanan, sebelum menjangkar sudut kanan bawah. Jika input melewati ini, maka kita naik mundur untuk mencocokkan seluruh input.
Masalah 8 - Penempatan dada Minecraft:
Jalankan dengan
p
bendera untuk mendapatkan posisi setiap pertandingan.$^
adalah jangkar yang cocok jika langkah selanjutnya akan membuat pointer pertandingan keluar dari batas.Pertama kita mencocokkan
.
, kemudian memeriksa bahwa kita dikelilingi oleh tiga.
s / batas, maka memastikan bahwa persegi sekitarnya keempat juga.
/ batas atau dada tunggal (dengan memeriksa nya kotak sekitarnya).Masalah 11 - Verifikasi Prelude syntax :
Butuh beberapa percobaan, tetapi saya pikir yang ini benar. Di sini kita menggunakan rekursi, yang memiliki sintaksis yang sama dengan PCRE.
Pendekatan ini mensyaratkan bahwa input berbentuk persegi panjang, tetapi setelah saya menyelesaikan pencocokan non-persegi panjang, asumsi tersebut tidak diperlukan.
Inilah pendekatan yang sama, bermain golf dengan lebih banyak rekursi:
Masalah 16 - Bungkus di sekitar tepi:
(Catatan: Pembungkus belum didorong ke penerjemah online)
Ini membutuhkan bendera pembungkus
w
. Secara teknis inisial%
untuk tidak ada slip tidak perlu, tetapi kemudian pertandingan akan dihitung sebagai mulai dari satu kotak lebih tinggi.Masalah EX 1 - Pemecah labirin:
Masalah dari komentar BMac dalam obrolan . Gunakan
r
bendera tanpa mode ulang sehingga pointer pertandingan tidak macet bolak-balik.Masalah EX 2 - Pengenalan wajah :
Perhatikan bahwa saya hanya mencocokkan wajah, tidak melakukan pembersihan. Perhatikan bahwa pertanyaan berisi simbol euro, yang perlu diganti oleh beberapa ASCII yang dapat dicetak agar berfungsi.
sumber
PMA / Siput (C ++)
Saya membayangkan bahasa sebagai siput bergerak di sekitar kotak dan menjalankan perintah. Siput meninggalkan jejak lendir pada setiap kotak tempat mereka bergerak, yang secara default menyebabkan kotak menjadi tidak tertandingi. Kecocokan berhasil jika akhir daftar perintah tercapai.
Ada cukup banyak operator sekarang sehingga kita akan memerlukan daftar prioritas untuk melacak mereka. Operasi diselesaikan dengan urutan sebagai berikut:
( ) [ ]
|
`
sebagai grup[m],[n]
dann
= !
Penerjemah ditulis dalam bahasa C ++. Kode sumber buruk dapat ditemukan di sini .
Masalah 4: Pencarian Kata
Program
cukup untuk mendapatkan nilai truey atau falsey untuk apakah kata itu ditemukan.
z
(salah satu dari 15 perintah arah absolut atau relatif) cocok dengan arah oktilinear apa pun. Beberapa perintah arah berurutan diurutkan secara bersamaan. Misalnyaruldy
akan hampir setara denganz
, karena itu adalah perintah untuk kanan, atas, kiri, bawah, dan setiap arah diagonal. Namun, arah akan diuji dalam urutan yang berbeda. Karakter pertama yang cocok selalu karakter siput dimulai, terlepas dari arah.\
<character> cocok dengan satu karakter literal.Strategi default adalah mencoba pola di setiap kotak di kotak pembatas dari input kiri-dibenarkan, dan output jumlah kecocokan. Jika nilai boolean
1
atau0
diperlukan, program berikut dapat digunakan:Jika setidaknya ada satu baris baru di file sumber, baris pertama diperlakukan sebagai opsi untuk konversi awal input ke bentuk persegi panjang. The
?
pilihan mencetak 0 atau 1 tergantung pada apakah ada di mana saja pertandingan.Masalah 15: Kericuhan
Setelah menerapkan pergantian, sekarang mungkin untuk menyelesaikan Boggle. Akan lebih baik menggunakan pencocokan case-insensitive untuk yang satu ini, tetapi menerapkan itu bukan prioritas tertinggi saya.
|
bekerja persis sama dengan regex 1 dimensi. Ada dua pasangan pembatas yang cocok untuk pengelompokan, yaitu()
dan{}
. Braket penutup akan menutup semua grup terbuka dari tipe berlawanan yang berdiri di antara itu dan yang terdekat dari tipe yang sama. Misalnya, mengikuti{({{)
, hanya grup paling kiri tetap terbuka. Seperti yang Anda lihat, simbol pengelompokan yang tak tertandingi di tepi secara implisit ditutup. Ada perintah pengelompokan lain`
yang tidak akan saya bahas sekarang.Masalah 8: Peti Minecraft
Program ini mencetak jumlah penempatan dada yang valid. Ini adalah yang pertama saya benar-benar harus bermain golf, dan mengurangi hitungan byte saya (17) beberapa kali.
\.
cocok dengan titik, pada titik awal pertandingan.!(o\C)2
setara dengan!((o\C)2)
kuantifikasi lebih diutamakan daripada asersi.<atom> <number>
berarti mengulang<atom>
tepat<number>
waktu.o
mengubah siput ke arah ortogonal.!
adalah pernyataan negatif. Dengan demikian bagian ini memeriksa tidak adanya dada ganda yang berdekatan.o
berbelok ke beberapa arah ortogonal.(!\Cw)3
menegaskan bahwa tidak adaC
di depan siput, dan kemudian berbalik berlawanan arah jarum jam, 3 kali.Masalah 2: Memverifikasi papan catur
The
&
pilihan set output program seperti1
jika pertandingan berhasil di semua posisi, dan0
sebaliknya.^c
cocok dengan karakter yang tidakc
sama dengan[^c]
di regex. Secara keseluruhan, program ini berarti: Mencetak 1 jika pada setiap posisi dalam persegi panjang pembatas dari input, ada salah satu#
yang tidak berdekatan secara orthogonal dengan karakter yang tidak_
, atau_
yang tidak berdekatan secara orthogonal dengan karakter yang tidak#
; jika tidak 0.sumber
Kelas Re2d, Python 2
Pembaruan: menambahkan masalah "9. Alignment".
Pendekatan saya adalah menggunakan modul Python re untuk melakukan pencarian dan pencocokan. Kelas Re2d menyiapkan teks untuk diproses, menjalankan fungsi kembali, dan memformat hasil untuk output.
Perhatikan bahwa ini bukan bahasa yang sama sekali baru - ini adalah bahasa ekspresi reguler standar yang diproyeksikan menjadi 2 dimensi dengan tanda tambahan untuk mode 2D tambahan.
Kelas memiliki penggunaan sebagai berikut:
Kedua pola tersebut adalah pola RE teks standar linier. Jika pola vertikal tidak disediakan, kelas akan menggunakan pola horizontal untuk mencocokkan secara vertikal juga. Bendera adalah bendera RE standar dengan beberapa ekstensi 2D.
Pengujian
Metode pencarian menemukan pola papan catur dan mengembalikan posisi 4-tupel. Tuple memiliki
x,y
posisi karakter pertama dari pertandingan, danwidth, height
area cocok. Hanya satu pola yang diberikan sehingga akan digunakan untuk pencocokan horizontal dan vertikal.Papan catur telah diverifikasi dengan metode pertandingan yang mengembalikan boolean. Perhatikan bahwa
^
dan$
mulai dan karakter akhir yang diperlukan untuk mencocokkan seluruh teks.Kami sekarang menggunakan
MULTIFIND
bendera untuk mengembalikan semua kecocokan yang mungkin untuk blok 2+ digit. Metode ini menemukan 9 kemungkinan kecocokan. Perhatikan bahwa mereka bisa tumpang tindih.Tes ini menunjukkan penggunaan flipping vertikal dan horizontal. Ini memungkinkan kata-kata yang cocok yang terbalik. Kata-kata diagonal tidak didukung. The
MULTIFIND
Bendera memungkinkan beberapa pertandingan yang tumpang tindih di semua 4 arah. Metode findall menggunakan pencarian untuk menemukan kotak yang cocok kemudian mengekstrak blok teks yang cocok. Perhatikan bagaimana pencarian menggunakan lebar dan / atau tinggi negatif untuk kecocokan dalam arah sebaliknya. Kata-kata dalam arah vertikal memiliki karakter garis baru - ini konsisten dengan konsep blok karakter 2D.Pencarian ini membutuhkan pola terpisah untuk setiap dimensi karena ukuran minimum berbeda untuk masing-masing dimensi.
Set 2 pencarian ini menemukan 2 kecocokan vertikal dan horizontal, tetapi tidak dapat menemukan
#.,#
string yang disematkan .Di sini kami menggunakan 2 pencarian untuk menemukan kecocokan di kedua arah. Ia dapat menemukan beberapa kecocokan ortogonal tetapi pendekatan ini tidak mendukung kecocokan diagonal.
Pencarian ini menemukan kecocokan pertama.
Masalah berlian lebih sulit. Tiga objek pencarian diperlukan untuk tiga ukuran. Ini dapat menemukan enam berlian dalam set tes, tetapi tidak skala untuk berlian berukuran variabel. Ini hanya solusi parsial untuk masalah berlian.
Kode Python 2
sumber
Grime , Haskell
pengantar
Grime didasarkan pada tata bahasa Boolean . Ide dasarnya adalah membangun pola persegi panjang dari komponen yang lebih kecil, dan memeriksa apakah mereka ditemukan dalam matriks input. Sejauh ini, Grime hanya mendukung pertandingan persegi panjang, dan menyelesaikan setidaknya 11 masalah kurang lebih elegan.
EDIT: Memperbaiki salib (terima kasih kepada DLosc untuk melihat bug), dan menambahkan penambangan berlian.
EDIT2: Menambahkan kelas karakter, terinspirasi oleh orang-orang dari Slip. Juga mengubah sintaks dari flag opsi, meningkatkan parser ekspresi, dan menambahkan masalah no-Q.
EDIT3: Diimplementasikan kendala ukuran, dan menambahkan masalah Nether portal.
Pemakaian
Program Grime disebut tata bahasa , dan ekstensi file yang benar untuk tata bahasa adalah
.gr
, meskipun ini tidak diberlakukan. Tata bahasa dievaluasi sebagaidi mana
matrixfile
file yang berisi matriks karakter. Sebagai contoh, tata bahasa digit akan dievaluasi sebagaiUntuk kecepatan ekstra, saya sarankan kompilasi file dengan optimisasi:
Secara default, juru bahasa mencetak kecocokan pertama yang ditemukannya, tetapi ini dapat dikontrol menggunakan flag opsi:
-e
: cocokkan hanya seluruh matriks, cetak1
untuk kecocokan dan0
tanpa kecocokan.-n
: cetak jumlah kecocokan, atau seluruh matriks jika-e
juga diberikan.-a
: cetak semua kecocokan.-p
: cetak juga posisi pertandingan, dalam format(x,y,w,h)
.-s
: jangan cetak yang cocok sendiri.-d
: cetak informasi debug.Opsi juga dapat ditentukan dalam tata bahasa, dengan memasukkannya sebelum baris apa pun dan menambahkan koma
,
(lihat contoh di bawah).Sintaks dan Semantik
Tata bahasa Grime terdiri dari satu atau lebih definisi , masing-masing pada baris terpisah. Masing-masing dari mereka mendefinisikan nilai nonterminal , dan salah satunya harus mendefinisikan nonterminal tingkat atas anonim . Sintaks definisi adalah baik
N=E
atauE
, di manaN
adalah huruf besar danE
merupakan ekspresi .Ekspresi dikonstruksi sebagai berikut.
\
cocok dengan1x1
persegi panjang yang berisi karakter itu..
cocok dengan satu karakter.$
cocok dengan1x1
persegi panjang di luar matriks karakter._
cocok dengan persegi panjang nol lebar atau tinggi.d
igit,u
ppercase,l
owercase,a
lphabetic, alphan
umeric, dans
ymbol.[a-prt-w,d-gu]
. Huruf di sebelah kiri disertakan, dan yang di sebelah kanan dikecualikan, jadi ini cocok dengan hurufnyaabchijklmnoprtvw
. Jika sisi kiri kosong, ini diambil untuk berisi semua karakter. Koma dapat dihilangkan jika sisi kanan kosong. Karakter[],-\
harus diloloskan dengan\
.P
danQ
adalah ekspresi, makaPQ
itu hanyalah gabungan horizontalnya, danP/Q
merupakan gabungan vertikalnya, denganP
di atasnya.P+
adalah satu atau lebihP
s sejajar secara horizontal, danP/+
sama sejajar secara vertikal.P|Q
,P&Q
danP!
.P?
adalah singkatan untukP|_
,P*
untukP+|_
, danP/*
untukP/+|_
.P#
cocok dengan persegi panjang yang berisi kecocokan dariP
.P{a-b,c-d}
, Di manaabcd
adalah bilangan bulat non-negatif, adalah kendala ukuran diP
. JikaP
adalah kelas karakter, maka ekspresi cocok denganmxn
persegi panjang yang hanya berisi karakter tersebut, asalkanm
ada di antara keduanyaa
danb
inklusif, dann
antarac
dand
inklusif. Dalam kasus lain, ekspresi cocok dengan persegi panjang yang memiliki ukuran yang benar dan yangP
juga cocok. Jikaa
atauc
dihilangkan, mereka dianggap sebagai0
, dan jikab
ataud
dihilangkan, mereka tidak terbatas. Jika tanda hubung antaraa
danb
dihilangkan, maka kami menggunakan angka yang sama untuk kedua ujung interval. Jika semuanyac-d
bagian dihilangkan, kedua sumbu dibatasi. Untuk memperjelas,{-b}
sama dengan{0-b,0-b}
, dan{a-,c}
setara dengan{a-infinity,c-c}
.Catatan
Grime memungkinkan definisi paradoks seperti
A=A!
dengan perilaku yang tidak terdefinisi. Namun, mereka tidak akan menyebabkan crash atau loop tak terbatas.Grime mendukung input non-persegi panjang; baris hanya disejajarkan ke kiri, dan celahnya bisa dicocokkan dengan menggunakan
$
.Di masa depan, saya ingin menerapkan yang berikut:
.
hanya bisa cocok dengan1x1
persegi panjang. Sampai menemukan kecocokan, ia mencoba semua persegi panjang dari semua ukuran secara berurutan, langsung gagal untuk masing-masing.Pertandingan non-persegi panjang menggunakan konteks , yang akan membantu dalam tantangan papan Boggle. Misalnya,
Pv(Q>R)
berartiP
dengan konteks bawah (Q
dengan konteks kananR
). Itu akan cocok dengan pola berbentuk LTugas
Diberikan kira-kira dalam urutan kompleksitas.
Persegi panjang digit
Ini sederhana: setidaknya persegi panjang digit
2x2
.Tidak ada q atau Q
Ini hampir sesederhana yang pertama; sekarang kami memiliki ukuran yang lebih terbatas dan kelas karakter khusus.
Penjajaran horizontal dan vertikal
Sekarang kami memiliki beberapa karakter yang lolos. Pada dasarnya, ini cocok dengan satu
#
, lalu sejumlah karakter apa pun, kemudian#
, baik secara horizontal maupun vertikal.Deteksi input persegi
Tata bahasa ini sangat sederhana, pada dasarnya mendefinisikan bahwa kuadrat adalah a
1x1
panjang, atau persegi yang lebih kecil dengan satu kolom ditempelkan di tepi kanannya, dan satu baris ditempelkan di bagian bawah itu. Perhatikan jugae
opsi sebelum level atas nonterminal, yang mengubah verifikasi seluruh input.Menemukan kata dalam pencarian kata
Yang ini mengerikan, karena Grime tidak memiliki operasi untuk rotasi atau refleksi. Ini juga sangat lambat, karena Grime tidak tahu bahwa pertandingan hanya dapat berukuran
4x1
,1x4
atau4x4
.Masalah glider dapat diselesaikan dengan cara yang sama, tetapi saya terlalu malas untuk menuliskannya.
Nether Portal
Dengan operator pembatasan ukuran, yang ini tidak terlalu sulit. Bagian tengah
\.{2-22,3-22}
cocok dengan persegi panjang.
dengan ukuran yang benar, dan kemudian kita tambahkan kolomX
s di kedua sisi, dan paku baris dariX
s dengan ujung yang diabaikan di bagian atas dan bawah itu.Salib yang cocok
Apa yang kita miliki di sini adalah gabungan (logis DAN) dari dua ekspresi. Nonterminal
E
cocok dengan persegi panjang kosong.
s, danF
persegi panjang kosong#
s. Sisi kiri konjungsi cocok dengan persegi panjang dari tipe tersebutdi mana kita memiliki
EFE
di atas, laluF
, dan kemudianEFE
lagi. Sisi kanan cocok dengan transposes ini, jadi kami mendapatkan persilangannya.Penambangan intan
Nonterminal
C
adalah singkatan untuk setiap1xn
kolom. Setengah bagian atas berlian cocok denganT
: itu adalah satuX
, atau yang lainT
dikelilingi oleh kolom di kedua sisi, dan baris di/[something]\
bawahnya.B
cocok dengan bagian bawah berlian dengan cara yang sama, dan tingkat atas nonterminal hanyalah deretan bentukX[something]X
antara setengah bagian atas dan bagian bawah bagian bawah.Menemukan papan catur
Sisi kanan
[#_]{3-}
cocok dengan3x3
persegi panjang#
s dan_
s yang lebih besar, sedangkan sisi kiri menjamin tidak ada dua#
s atau s yang berdekatan_
.Memverifikasi papan catur
Ini pada dasarnya sama dengan di atas, kecuali bahwa kita dapat mencocokkan dengan persegi panjang yang tidak kosong, tetapi perlu menggunakan
e
bendera untuk seluruh verifikasi input.Verifikasi sintaks Prelude
Ini mungkin tata bahasa yang paling menarik sejauh ini. Nonterminal
A
cocok dengan kolom mana pun yang tidak mengandung(
atau)
, danP
cocok dengan sejumlahA
s, atau dua tanda kurung yang cocok, antara dan di luar yang ada lebih banyakP
s.sumber
\#(.*|./*)\#
bekerja#
di sebelah kiri, lalu baris atau kolom apa pun, lalu satu#
di sebelah kanan". Saya perlu menentukan bahwa#
s secara vertikal digabungkan ke kolom menggunakan garis miring/
.TMARL
Pencocokan Templat dan Bahasa Pengakuan
Deskripsi
Penerjemah saya membutuhkan 24K karakter ( potongan kode mengambil karakter? ), Sehingga uraian lengkap dapat ditemukan di sini .
Bagian terbaik: penerjemahnya dalam Javascript, artinya Anda bisa mencobanya di sini!
Tampilkan cuplikan kode
Dan untuk masalah:
# 1 - Menemukan Papan Catur
&
menambahkan pencarian. G2 pada akhirnya mendapatkan elemen ke-3 dalam elemen kecocokan, kecocokan sebenarnya. 2 elemen pertama adalah koordinat x dan y (1 berbasis, bukan 0).# 3 - Mendeteksi Rectangle of Digit
Saya pikir ini cukup mudah.
# 4 - Menemukan Kata dalam Pencarian Kata
The
S
Argumen ini bahkan sehingga akan mencari semua rotasi. Ini lebih besar dari 4 karena kemudian dapat ditambahkan ke pencarian berikutnya (pertandingan individu tidak dapat ditambahkan).# 5 - Mendeteksi Input Kuadrat
Tidak yakin apakah ini sepenuhnya legal, karena hanya menentukan kuadrat dengan benar jika inputnya adalah persegi panjang. Ini membandingkan panjang input
IL
dengan panjang baris pertamaIG0L
dan membalikkannya.# 6 - Temukan Glider dalam Game of Life
Akhirnya, gunakan untuk cermin!
# 12 - Hindari Surat Q
S1 karena hanya 1 pertandingan diperlukan.
Saya akan melakukan beberapa yang lebih sulit nanti.
sumber