String Hampir Ilegal, Mark II (Cops)
Sunting 2020-11-06: Tantangan ini telah diedit dengan ketentuan baru untuk mendorong partisipasi. Pengeditan telah dicetak tebal untuk penekanan.
Selamat datang di Find an Illegal String versi polisi dan perampok .
Sebuah string yang ilegal adalah "string karakter yang tidak dapat muncul dalam setiap program hukum dalam bahasa pemrograman pilihan Anda" (dari pos terkait).
Untuk tantangan ini, kami akan menentukan string yang hampir ilegal , yang merupakan rangkaian karakter yang sangat sulit, tetapi bukan tidak mungkin, untuk disertakan dalam program yang valid.
Tantangan Polisi
- Pilih bahasa pemrograman, dan pilih 'string yang hampir ilegal' - ini adalah urutan karakter yang sangat sulit untuk dimasukkan dalam program yang valid tanpa menyebabkan kesalahan.
- Tulis program yang berisi 'string hampir ilegal' sebagai substring bersebelahan yang tidak error.
- Secara opsional, Anda juga dapat menentukan sekumpulan karakter yang dilarang. Ini adalah karakter yang tidak muncul di program Anda, kecuali di 'string yang hampir ilegal'. (Karenanya: karakter yang dilarang masih dapat muncul di dalam string yang hampir ilegal)
Itu dia! Anda akan mengungkapkan bahasa pemrograman, string yang hampir ilegal, dan kumpulan karakter yang dilarang , dan menantang perampok untuk menulis program yang berisi string ilegal tetapi tidak error.
Untuk keperluan tantangan ini, kami mendefinisikan 'tidak error' sebagai:
- Program Anda keluar dengan kode keluar 0.
- Program Anda tidak mencetak keluaran apapun dengan kesalahan standar.
- Program Anda dapat mencetak apa pun ke keluaran standar, jika Anda mau, tetapi tidak harus.
- Jika (dan hanya jika) bahasa Anda selalu mencetak output ke kesalahan standar apa pun programnya, seperti debugging atau informasi waktu, Anda dapat merancang program yang hanya menampilkan ini ke kesalahan standar. Jika Anda menggunakan klausul ini, sebutkan di pos polisi Anda.
Tantangan Perampok
Temukan jawaban yang tidak terpecahkan. Menulis program dalam bahasa yang ditentukan yang berisi sebagai substring bersebelahan string yang hampir ilegal ditentukan dan tidak error. Program Anda tidak boleh menggunakan karakter apa pun dalam rangkaian karakter terlarang, kecuali itu adalah bagian dari string yang hampir ilegal. Program Anda tidak harus persis seperti yang ada dalam pikiran polisi. Posting jawaban untuk utas perampok dan berikan komentar pada jawaban polisi untuk memecahkannya.
Klarifikasi
- Jika jawaban polisi Anda memerlukan lingkungan atau versi operasi tertentu, Anda harus menentukan ini dalam jawaban Anda.
- String polisi yang hampir ilegal yang mereka ungkapkan harus ditafsirkan sehubungan dengan pengkodean standar untuk penerjemah bahasa. Untuk sebagian besar program, ini adalah UTF8.
- Solusi tidak boleh mengambil masukan apa pun (melalui masukan standar, argv, atau sumber lain) dan mungkin menganggap tidak ada masukan seperti itu yang diberikan.
- Solusi harus berakhir dalam waktu yang terbatas. Ini berarti memasuki loop tak terbatas dan terbunuh oleh batas waktu 60 detik TIO bukanlah solusi yang valid.
- Polisi harus memastikan jika string mereka yang hampir ilegal berisi baris baru di depan atau di belakang, maka sangat jelas hal itu dilakukan. Perampok harus dengan hati-hati mencatat setiap baris baru di depan atau di belakangnya di pos polisi.
Petunjuk pemformatan
Cara paling jelas untuk memasukkan baris baru di depan atau di belakang adalah dengan menggunakan sintaks backtick untuk posting Anda:
```
foo
```
Ditampilkan sebagai:
foo
Untuk menghilangkan ambiguitas, secara eksplisit sebutkan baris baru di depan / di belakang dalam posting Anda.
Penilaian
Setelah 10 hari tanpa celah, polisi dapat menandai jawaban mereka sebagai aman dan mengungkapkan solusinya. Setelah polisi mengungkapkan solusinya, solusi tersebut tidak lagi dapat dibobol.
Polisi dinilai berdasarkan panjang (dalam byte) dari string mereka yang hampir ilegal dalam jawaban yang aman, dengan yang lebih rendah lebih baik.
Perampok dinilai berdasarkan jumlah jawaban yang mereka pecahkan, dengan semakin tinggi semakin baik.
Contoh
Python 3, 5 byte
String ilegal:
"'1/0
Karakter yang dilarang:
#'
Python 3, jawaban contoh crack
Program:
""" "'1/0 """
Idenya adalah kita bisa mengomentari string, karena "tidak dilarang.
Jawaban
Python 2 , 5 byte ( diretas oleh tsh )
bin()
Dilarang: semua karakter kecuali karakter alfanumerik
abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789
Jadi, Anda diizinkan menggunakan karakter di atas dan tidak ada yang lain (selain karakter itu bin()sendiri).
(Ide ini bukan milik saya, saya ingat dari tantangan sebelumnya, tetapi saya tidak ingat siapa yang pantas mendapatkan pujian untuk itu.)
Jelly , 4 byte, dipecahkan oleh HyperNeutrino
«{
Anda tidak boleh menggunakan baris baru. Karakter / byte lainnya adalah permainan yang adil
Solusi yang saya maksudkan adalah salah satu karakter yang dilarang di sini selain ”. Masing-masing karakter ini menyebabkan penguraian tautan rusak, yang berarti semua yang sebelum mereka diabaikan:
Jelly , 4 byte, dipecahkan oleh Unrelated String
«{
Saya mencoba Jelly lagi, tetapi dengan batasan yang lebih sedikit. Anda tidak dapat menggunakan quƁƘȤ(ƈɦƙɱɲƥʠʂȥ(perintah diimplementasikan di Jelly), ”atau baris baru, seperti make ini itu jauh terlalu sepele untuk retak (terima kasih kepada HyperNeutrino untuk menunjukkan bahwa)
Baik crack HyperNeutrino di komentar, maupun crack Unrelated String adalah solusi yang saya inginkan. Menempatkan Œ(atau salah satu ÐÆØœæ) dengan tidak ada setelahnya di akhir menyebabkan perilaku yang sama seperti salah satu quƁƘȤ(ƈɦƙɱɲƥʠʂȥ, karena mereka selalu berharap memiliki karakter setelahnya. Tanpa karakter apa pun, mereka menyebabkan putusnya rantai program, yang berarti bahwa semua yang sebelumnya diabaikan:
Haskell, 3 byte
#"
(dimulai dengan baris baru)
Karakter terlarang: -
R , 2 byte, dipecahkan oleh Dominic van Essen
'"
Karakter yang dilarang (baris baru dilarang):
'"`#\qel
Ini melarang celah yang jelas dapat saya pikirkan, tetapi saya tidak akan terkejut jika Anda menemukan celah yang sangat berbeda dari yang saya maksudkan.
Dominic van Essen memecahkan versi pertama dari tantangan ini, dan kemudian yang kedua ; kemudian Giuseppe memecahkan versi ketiga. Saya telah menambahkan qelbaris baru ke daftar karakter yang dilarang untuk menghindari celah mereka.
Solusi yang ada dalam pikiran saya adalah
assign(intToUtf8(c(37,39,34,37)), c); 1 %'"% 2
Panggilan menetapkan menciptakan operator biner baru, %'"%; itu setara dengan "%'"%" <- c. Dalam R, Anda dapat membuat operator baru dari bentuk %x%di mana xadalah setiap string yang: %}%, %$@%dan %µ£$%semua nama operator yang berlaku. Di sini, operator baru sama dengan fungsi penggabungan cdan keluarannya adalah vektor 1 2.
Retakan Dominic tidak menentukan operatornya; ia hanya menguburnya dalam trypanggilan, yang juga merupakan kode R yang valid.
Trik yang digunakan di sini berarti bahwa upaya apa pun di masa mendatang pada string yang hampir ilegal mungkin harus melarang %karakter tersebut.
Ruby, 17 byte, diretas oleh Dingus
=end
#{"""'}
=end
(tidak ada baris baru di awal)
Karakter terlarang: N
Julia, 6 byte
?""":
Ada spasi lebar nol sebelum :
Karakter yang tidak diperbolehkan: #
Ruby, 17 byte
=end
#{"""'}
=end
Karakter dianulir: N,%
Kali ini saya membuatnya sedikit lebih sulit.
Ruby, 18 byte
=end
#{/"""'}
=end
Dianulir karakter: N, %,/
variasi terakhir saya, semoga solusi selanjutnya adalah yang diinginkan.
Zsh
#include <cstdlib>
#include <iostream>
int main() {
srand(time(NULL));
hello();
return rand() % 2;
}
/*
main
a=0
\
print "$((1/$a))"
*/
void hello() std::cout << "Hello, World!" << std::endl;
- Karakter yang diizinkan: semua ASCII yang dapat dicetak kecuali
blxy<'`$(huruf kecil B, L, X, dan Y, tanda kutip tunggal, kuburan, tanda dolar) - Harap perhatikan semua spasi kosong di depan dan di belakangnya.
Mungkin tidak terlalu sulit tetapi Anda dapat belajar banyak tentang banyak - harus kita katakan "kebiasaan" - dari zsh.
Desmos, 2 byte, di- crack oleh PkmnQ
Substring:
\
(Perhatikan baris baru di awal)
Karakter yang dilarang: Semua karakter alfanumerik
abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789
Saya berharap kebanyakan orang tidak mengenal Desmos di sini, jadi orang tidak akan tahu harus mencoba apa.
catatan:
Ekspresi di Desmos akan dianggap error jika menunjukkan "tanda bahaya" di sebelah ekspresi, seperti ini: