Jadikan bahasa Anda * sebagian besar * tidak dapat digunakan! (Utas polisi)

61

Terinspirasi oleh komentar ini ...

Terima kasih kepada pengguna, Step Hen , Wheat-Wizard , dan Dennis yang telah membantu saya memperkuat spesifikasi tantangan ini sebelum mempostingnya!

Ini adalah utas Polisi. Untuk utas Perampok, buka di sini


Dalam tantangan ini , Anda bertugas menjalankan beberapa kode yang membuatnya sehingga bahasa Anda tidak lagi memenuhi kriteria kami sebagai bahasa pemrograman. Dalam tantangan itu, itu berarti membuatnya agar bahasa tidak bisa lagi ...

  • Ambil input dan output numerik

  • Tambahkan dua angka bersamaan

  • Uji apakah angka tertentu prima atau tidak.

Ini adalah tantangan , di mana ada dua tantangan yang berbeda dengan dua tujuan yang berbeda: Polisi akan mencoba menulis beberapa kode yang membuat bahasa sebagian besar tidak dapat digunakan, dan perampok akan mencoba menemukan solusi tersembunyi yang memungkinkan polisi untuk memulihkan bahasa mereka.

Sebagai seorang polisi, Anda harus menulis dua cuplikan kode:

  1. Salah satu yang membuat bahasa Anda sebagian besar tidak dapat digunakan, misalnya dengan menghapus fungsi bawaan untuk mengambil operasi input / output dan numerik. Semakin banyak fitur yang Anda hapus, semakin baik. Kode ini tidak diizinkan mogok atau keluar. Seharusnya mungkin untuk menambahkan kode ke akhir cuplikan ini, dan kode itu akan dievaluasi . Dan...

  2. ... potongan kode yang mengambil dua bilangan bulat non-negatif sebagai input, menambahkannya bersama-sama, dan mengeluarkan jumlah mereka. Cuplikan ini harus tetap berfungsi dengan benar bahkan setelah menjalankan cuplikan pertama. Saat kedua snippet digabungkan bersama, mereka harus membentuk program lengkap yang menambahkan dua angka, atau mendefinisikan fungsi yang menambahkan dua angka. Idealnya, cuplikan ini harus mengandalkan perilaku yang sangat tidak jelas, sehingga lebih sulit ditemukan.

Anda dapat memilih metode input dan output standar apa pun . Namun, Anda harus mengungkapkan dengan tepat format (input dan output) yang Anda gunakan. Perampok tidak dapat memecahkan jawaban Anda kecuali mereka menggunakan format yang sama dengan Anda.

Setelah menulis kedua cuplikan ini, Anda harus memposting yang pertama sebagai jawaban, tanpa mengungkapkan yang kedua. Jawaban Anda harus mengandung semua informasi berikut:

  • The pertama potongan (jelas tidak yang kedua).

  • Bahasa (termasuk versi minor, karena sebagian besar pengiriman mungkin bergantung pada kasus tepi yang aneh)

  • Format IO, termasuk apakah itu fungsi atau program penuh. Perampok harus menggunakan format yang sama agar crack mereka valid.

  • Semua kasus tepi aneh diperlukan untuk jawaban Anda untuk bekerja. Misalnya, hanya berjalan di linux , atau membutuhkan koneksi internet . Jelas, ini sedikit subjektif, tetapi jika seorang polisi memiliki beberapa kasus tepi ekstrem yang mencegahnya dari retak, dan kemudian hanya mengungkapkan ini setelah aman, saya menganggap sportif ini buruk. Perampok potensial harus memiliki semua informasi yang diperlukan untuk memecahkan jawaban Anda sebelum retak.

Anda tidak perlu mengungkapkan jumlah byte Anda sampai jawaban Anda aman.

Ini sebuah contoh. Untuk cuplikan pertama, Anda bisa mengirimkan program Python 3 berikut:

Python 3

print=None

Mengambil input dari STDIN dan output ke STDOUT

Dan sebagai cuplikan kedua, Anda dapat menulis:

import sys
a,b=int(input()),int(input())
sys.stdout.write(a+b)

Ini valid karena akan mengambil dua angka sebagai input, dan mengeluarkan jumlah mereka meskipun Anda menggabungkan kedua snippet bersama, misalnya

print=None
import sys
a,b=int(input()),int(input())
sys.stdout.write(a+b)

Namun, ini akan sangat mudah bagi perampok untuk menemukan solusi. Karena ini akan sangat mudah retak, Anda dapat mencoba menambal pendekatan khusus ini seperti:

import sys
sys.stdout=None
print=None

Namun, bahkan ini memiliki solusi yang sangat mudah:

del print
a,b=int(input()),int(input())
print(a+b)

Sebagai seorang polisi, tujuan Anda adalah membuat solusi tersembunyi menjadi tidak jelas, untuk mencegah perampok menemukannya.

The perampok akan melihat salah satu jawaban Anda, dan berusaha untuk memecahkannya. Mereka mungkin retak itu dengan menulis setiap potongan valid yang bisa bekerja sebagai potongan 2 (menambahkan dua angka bersama setelah bahasa dibuat sebagian besar tidak dapat digunakan). Ini tidak harus potongan yang sama seperti yang Anda maksudkan semula. Jika seorang perampok memecahkan jawaban Anda, mereka akan meninggalkan komentar pada jawaban Anda, dan kemudian Anda harus mengeditnya untuk menunjukkan bahwa jawaban itu telah di-crack. Jika kiriman Anda retak, Anda harus mengedit jawaban Anda untuk menunjukkan solusi (cuplikan 2) yang Anda maksudkan semula. Ini bukan aturan semata , hanya saran yang bersahabat untuk membuat permainan tetap menyenangkan. Anda tidak perlu.

Jika jawaban tetap tidak terpecahkan selama satu minggu penuh, Anda dapat mengedit cuplikan kedua Anda, dan mengindikasikan bahwa jawaban Anda sekarang aman . Jika Anda tidak mengeditnya setelah seminggu berlalu, pengguna lain masih dapat memecahkannya sampai Anda melakukannya. Jika Anda tidak mengungkapkan cuplikan kedua, Anda tidak dapat mengklaim poin untuk jawaban Anda, atau menyebutnya aman.

Pemenang utas polisi adalah jawaban aman terpendek termasuk kedua cuplikan , dihitung dalam byte, dan jawaban ini akan diterima setelah waktu yang cukup berlalu. Anda tidak perlu mengungkapkan jumlah byte Anda sampai jawaban Anda aman, karena jumlah byte tidak relevan dengan skor Anda sampai jawaban Anda aman. Dalam hal waktu yang cukup telah berlalu dan tidak ada jawaban yang tetap, pemenang akan menjadi jawaban yang tetap tidak terpecahkan untuk periode waktu terlama.

Selamat bersenang-senang!

Klarifikasi aturan

  • Cuplikan pertama harus berjalan dengan benar tanpa mengambil input apa pun . Mungkin output apa pun yang Anda suka, dan output ini akan diabaikan - selama setelah potongan selesai, potongan kedua berjalan dengan benar.

  • Cuplikan kedua harus benar-benar dieksekusi agar jawaban Anda valid. Ini berarti jawaban seperti

    import sys
    sys.exit()
    

    tidak valid karena tidak melanggar bahasa. Itu hanya berhenti. Demikian pula, memasukkan infinite loop tidak valid, karena snippet kedua tidak akan pernah dieksekusi.

  • Setelah aman, skor Anda adalah jumlah byte dari kedua cuplikan .

  • Ini kembali ke Harap mengungkapkan kasus tepi aneh yang diperlukan untuk jawaban Anda untuk bekerja ... Kiriman Anda harus berisi informasi yang cukup sebelum diturunkan untuk dapat direproduksi setelah diungkapkan. Ini berarti bahwa jika jawaban Anda menjadi aman, dan kemudian Anda edit di: Inilah jawaban saya. Oh ya, BTW ini hanya berfungsi jika Anda menjalankannya pada Solaris, lelucon ada pada Anda! jawaban Anda tidak valid dan akan dihapus dan tidak dianggap memenuhi syarat untuk menang.

  • Cuplikan kedua dibolehkan mogok setelah mengeluarkan jumlah - asalkan keluaran masih benar (misalnya, jika Anda memilih untuk menampilkan ke STDERR, dan kemudian Anda mendapatkan banyak informasi kerusakan, ini tidak valid).

  • Anda tidak boleh mengedit kode setelah mengirim jawaban.

  • Anda mungkin tidak mengandalkan fungsi kriptografi seperti enkripsi, fungsi hash, CSPRNGs dll.

Cuplikan untuk menemukan kiriman yang tidak retak:

DJMcMayhem
sumber
3
Apa yang harus dilakukan untuk bahasa seperti C? Penggabungan hanya memungkinkan satu "cuplikan utama", dan logika apa pun harus masuk ke sana. Misalnya, jika saya memiliki ke int main(){ do_evil_stuff(); }mana harus pergi kode pengguna? Dalam suatu fungsi? Setelah semua pernyataan di main?
Conor O'Brien
1
Dapatkah cuplikan kedua ditempatkan di mana saja di cuplikan pertama?
LegionMammal978
1
Saya tidak tahu apa-apa tentang pengkodean, tetapi tantangan ini terlihat luar biasa,
Pritt Balagopal
2
Saya mengedit cuplikan mengagumkan jimmy23013 . Merasa bebas untuk kembali, tetapi saya tetap menggunakannya untuk mencari kiriman dan berpikir itu mungkin membantu orang lain.
Dom Hastings
2
@HomHastings Itu sangat membantu! Terima kasih banyak :)
DJMcMayhem

Jawaban:

2

Gforth 0.7.3 (TIO) , 231 byte [SAFE]

Kode ini mendefinisikan kembali sebagai tidak berguna beberapa metode output yang diperlukan, serta penambahan dan sesuatu yang penting untuk mendeklarasikan fungsi. Semoga berhasil!

: . ;
: dec. ;
: u. ;
: .r ;
: u.r ;
: d. ;
: ud. ;
: d.r ;
: ud.r ;
: emit ;
: type ;
: + postpone 2drop ;
: ; + + + postpone exit reveal postpone [ ;

Input akan berupa dua bilangan bulat bertanda yang diambil dari bagian atas tumpukan sebagai parameter fungsi. Output ke STDOUT.

Jadi, Anda harus memperbaiki kerusakan yang terjadi, dan menetapkan fungsi yang mengambil dua nilai teratas dari tumpukan dan mencetak hasilnya sebagai integer (bukan float) ke STDOUT tanpa output tambahan (tanpa spasi tambahan).

Inilah templat , jika fungsi sasaran Anda dinamai f.

Larutan:

79 byte,

saya benar-benar menghapus immediatekata kunci dari akhir redefinisi ;, jadi perlu jawaban untuk memasukkannya di awal. Fungsi yang saya definisikan sebagian besar setara dengan definisi internal ., tetapi tidak mencetak spasi di bagian akhir, dan penambahan dilakukan terlebih dahulu, dengan memindahkan angka ke tumpukan floating point dan kembali.

immediate : f s>f s>f f+ f>d swap over dabs <<# #s rot sign #> (type) #>> 0 0 ;

Cobalah online

mbomb007
sumber
1
Ini jawaban yang sangat bagus. Pada tingkat ini, sepertinya itu mungkin menjadi satu-satunya jawaban yang tidak terpecahkan!
DJMcMayhem
:) Saya menggabungkan beberapa kendala yang berbeda. Pada titik ini, saya bertanya-tanya apakah saya bisa melakukan satu saja untuk membuat skor saya lebih baik. Tetapi ada kemungkinan bahwa memiliki lebih dari satu adalah mengapa itu belum retak.
mbomb007
21

Haskell, dipecahkan oleh Christian Sievers

import Prelude(getLine,print)
a=a

Program lengkap, membaca dua bilangan bulat (termasuk yang negatif) dari stdin dan menulis ke stdout.

Saya baru saja menonaktifkan Prelude sehingga hampir tidak ada dalam ruang lingkup, dan kemudian menambahkan definisi; impor lebih lanjut tidak valid secara sintaksis. Saya memberi Anda getLinedan printmeskipun.


Diedit untuk menambahkan solusi asli saya. Retak Christian berbeda, tetapi mengeksploitasi fitur dasar yang sama (Anda bisa mendapatkan jumlah perhitungan yang mengejutkan dengan mengakses fungsi yang memiliki gula sintaksis, bahkan ketika Anda tidak dapat memanggil apa pun yang dibangun secara langsung atau bahkan menyebutkan jenis yang terlibat).

import Prelude(getLine,print)
a=a
(x:l)!0=x
(x:l)!n=l!d[0..n]
d[x,y]=x
d(x:l)=d l
x^y=[x..]!y
x+y=f[0..y](x^y)(-((-x)^(-y)))
f[]x y=y
f _ x y=x
f.g= \x->f(g x)
f&0= \x->x
f&n=f.(f&d[0..n])
x*y=((+x)&y)0
x%[]=x
x%('-':s)= -(x%s)
x%(c:s)=x*10+i c%s
i c=l['1'..c]
l[]=0
l(x:s)=1+l s
main=do
 x<-getLine
 y<-getLine
 print((0%x)+(0%y))

Yang mungkin bukan golf super, tapi di sini lebih tepat:

import Prelude(getLine,print)
a=a

-- List indexing
(x : _) !! 0 = x
(_ : xs) !! n = xs !! (sndLast [0..n])

-- sndLast [0..n] lets us decrement a positive integer
sndLast [x, _] = x
sndLast (_ : xs) = sndLast xs

-- Pseudo-addition: right-operator must be non-negative
x +~ y = [x..] !! y

-- Generalised addition by sign-flipping if y is negative
x + y = switch [0..y] (x +~ y) (-((-x) +~ (-y)))
  where switch [] _ empty = empty   -- [0..y] is null if y is negative
        switch _ nonempty _ = nonempty

f . g = \x -> f (g x)

-- compose a function with itself N times
composeN f 0 = \x -> x
composeN f n = f . (composeN f (sndLast [0..n]))

-- multiplication is chained addition
x * y = composeN (+x) y 0

strToNat acc [] = acc
strToNat acc ('-' : cs) = -(strToNat acc cs)
strToNat acc (c : cs) = strToNat (acc * 10 + charToDigit c) cs

charToDigit c = length ['1'..c]

length [] = 0
length (_ : xs) = 1 + length xs

main = do
  x <- getLine
  y <- getLine
  print (strToNat 0 x + strToNat 0 y)
Ben
sumber
2
retak
Christian Sievers
17

Python 2 , Retak

Menerapkan penambahan sebagai fungsi bernama

import sys
c="".join(open(__file__).read().split('\n')[4:])
if set(c)-set(' &)(,.:[]a`cdfijmonrt~')or"import"in c:sys.setrecursionlimit(1)
f=lambda\

Cobalah online!

Apa fungsinya?

Untuk membantu Anda sedikit, saya akan menjelaskan apa yang dilakukannya. Kode ini membuka file sumber dan memeriksa apakah sisa kode sesuai dengan kriteria berikut:

  • Tidak mengandung string import
  • Dibuat sepenuhnya dari karakter &)(,.:[]a`cdfijmonrt~

Jika gagal salah satu kriteria batas rekursi diatur ke 1berarti bahwa setiap kode yang Anda tulis akan mencapai batas rekursi.

Tidak ada trik di sini, saya telah menulis solusi yang hanya menggunakan karakter ini dan tidak ada impor, saya tidak melakukan apa pun yang subversif, tetapi saya akan mengatakan bahwa saya pikir ini akan sangat sulit untuk dipecahkan.

Untuk menghemat waktu Anda di sini adalah daftar singkat hal-hal berguna yang tidak dapat Anda lakukan dengan batasan ini

  • + yah,

  • eval/ execTidak akan membiarkanmu lolos begitu saja

  • Bilangan, Mereka mungkin lebih berguna daripada yang Anda pikirkan

  • Literal string

  • len

  • =, Tidak ada variabel penetapan

  • >, <, ==. . . Saya telah meninggalkan Anda tanpa perbandingan

  • *, -, /, %, ^, |, >>, << Satu-satunya operator yang tersedia adalah ~dan&

  • __foo__, Tidak ada satu pun dari metode garis bawah mewah yang diizinkan.

Wisaya Gandum
sumber
1
Wow ini cukup jahat. Bagus!
HyperNeutrino
Jawaban yang fantastis untuk memulai segalanya :)
DJMcMayhem
Hehe, ini mungkin saja terinspirasi oleh tantangan raja-dari-bukit bodoh yang saya coba utarakan dalam obrolan suatu saat
Stephen
4
Saya pikir ini adalah celah yang valid: codegolf.stackexchange.com/a/133209/68942
HyperNeutrino
RE snippet pertama: This code is not allowed to crash or exit.(lihat obrolan untuk diskusi tentang hal itu)
Stephen
12

Python 2 , Retak

Ini adalah iterasi keempat dari jawaban ini. Setiap jawaban terakhir telah di-crack dengan cara mereset kedalaman rekursi.

Menerapkan penambahan sebagai fungsi bernama

import sys
if set("".join(open(__file__).read().split('\n')[4:]))-set(' &)(,.:[]a`cdfijmonrt~'):sys.setrecursionlimit(1)
for m in sys.modules:sys.modules[m]=None
del sys;f=lambda\

Cobalah online!

Apa fungsinya?

Untuk membantu Anda sedikit, saya akan menjelaskan apa yang dilakukannya. Kode ini membuka file sumber dan memeriksa apakah sisa kode dibuat hanya dari karakter &)(,.:[]a`cdfijmonrt~

Jika gagal batas rekursi diatur ke 1artinya setiap kode yang Anda tulis akan mencapai batas rekursi.

Saya juga telah menonaktifkan semua modul, sehingga Anda tidak dapat mengimpor apa pun.

Tidak ada trik di sini, saya telah menulis solusi yang hanya menggunakan karakter ini dan tidak ada impor, saya tidak melakukan apa pun yang subversif, tetapi saya akan mengatakan bahwa saya pikir ini akan sangat sulit untuk dipecahkan.

Untuk menghemat waktu Anda di sini adalah daftar singkat hal-hal berguna yang tidak dapat Anda lakukan dengan batasan ini

  • + yah,

  • eval/ execTidak akan membiarkanmu lolos begitu saja

  • Bilangan, Mereka mungkin lebih berguna daripada yang Anda pikirkan

  • Literal string

  • len

  • =, Tidak ada variabel penetapan

  • >, <, ==. . . Saya telah meninggalkan Anda tanpa perbandingan

  • *, -, /, %, ^, |, >>, << Satu-satunya operator yang tersedia adalah ~dan&

  • __foo__, Tidak ada satu pun dari metode garis bawah mewah yang diizinkan.

Solusi saya

Jadi sekarang xnor telah memecahkannya dengan cara saya cukup puas dengan saya akan mengungkapkan solusi saya

r,o:(o and f(~(~r&~o)&~(r&o),int(`r`[:r&~r].join([`dict()`[r&~r],`r&~r`,`dict([(r&~r,r&~r)])`[int(`~([]in[[]])`[[]in[[]]:])],`min`[[]in[[]]],`dict()`[~(r&~r)],`r&~r`]).format(r&o),int(`~([]in[[]])`[[]in[[]]:]))))or r

Kejutan, kejutan itu omong kosong omong kosong. Daripada memecah ini saya akan pergi melalui proses bagaimana saya membuat ini.

Saya mulai dengan algoritma penambahan yang cukup standar

r,o:(o and f(r^o,r&o<<1))or r

Kemudian saya menggunakan trik bitwise untuk mewakili ^dengan |, &, ~.

r,o:(o and f((r|o)&~(r&o),r&o<<1))or r

Saya menggunakan trik bitwise lain untuk menyingkirkan |

r,o:(o and f(~(~r&~o)&~(r&o),r&o<<1))or r

Sekarang yang tersisa hanyalah <<, tidak boleh terlalu sulit, bukan? Nah bersiap-siap untuk perjalanan yang bergelombang. Untuk mengganti bitshift, saya menggunakan string untuk menambahkan nol ke akhir representasi binernya

r,o:(o and f(~(~r&~o)&~(r&o),int(bin(r&o)[2:]+"0",2)))or r

Ini memiliki beberapa masalah tetapi yang utama menggunakan penambahan , jadi saya mengatasinya dengan menggunakan format sebagai gantinya

r,o:(o and f(~(~r&~o)&~(r&o),int("{}0".format(bin(r&o)[2:]),2)))or r

Kami tidak diizinkan menggunakan bin, jadi saya menggunakan pemformatan string untuk mengkonversi ke biner.

r,o:(o and f(~(~r&~o)&~(r&o),int("{0:b}0".format(r&o),2)))or r

Karena string string dilarang, saya harus membuat string {0:b}0dari bagian yang dibuat dengan kutu belakang dan joinmereka bersama-sama.

r,o:(o and f(~(~r&~o)&~(r&o),int("".join(["{","0",":","b","}","0"]).format(r&o),2)))or r

String kosong cukup mudah, Anda bisa melakukannya

`r`[:0]

Nolnya adalah

`0`

dan {:}semuanya diambil dari kamus.

r,o:(o and f(~(~r&~o)&~(r&o),int("".join([`dict()`[0],`0`,`dict([(0,0)])`[2],"b",`dict()`[-1],`0`]).format(r&o),2)))or r

btampaknya cukup sulit untuk didapatkan, itu tidak ada dalam rangkaian karakter kita, jadi bagaimana kita bisa mendapatkan objek yang memiliki objek bdi dalamnya repr? Nah begini caranya: Ketika Anda menggunakan reprpada fungsi builtin Anda mendapatkan sesuatu yang terlihat seperti

<built-in function name>

Dan itu dari mana kita akan mendapatkan milik kita b.

r,o:(o and f(~(~r&~o)&~(r&o),int("".join([`dict()`[0],`0`,`dict([(0,0)])`[2],`min`[1],`dict()`[-1],`0`]).format(r&o),2)))or r

Sekarang yang tersisa hanyalah angka, saya hanya perlu -1, 0, 1, dan 2 jadi inilah cara saya menggambarkannya:

-1 = ~(r&~r)
 0 = r&~r
 1 = []in[[]]
 2 = `~([]in[[]])`[[]in[[]]:]

2 sebenarnya bisa lebih pendek satu byte

```r&~r```.find(`r&~r`)

berdasarkan saran @ Blender di komentar, tapi saya tidak memikirkan ini sampai setelah fakta.

Jadi kami mengganti angka-angka ini di

r,o:(o and f(~(~r&~o)&~(r&o),int(`r`[:r&~r].join([`dict()`[r&~r],`r&~r`,`dict([(r&~r,r&~r)])`[int(`~([]in[[]])`[[]in[[]]:])],`min`[[]in[[]]],`dict()`[~(r&~r)],`r&~r`]).format(r&o),int(`~([]in[[]])`[[]in[[]]:]))))or r

Dan itulah celahnya.

Wisaya Gandum
sumber
Cuplikan ini sepertinya salah sendiri.
ATaco
@ATaco Saya percaya ini sudah dibahas dalam obrolan dan diputuskan bahwa ini tidak masalah.
Wheat Wizard
Aturan secara eksplisit menyatakan sebaliknya. "Kode ini tidak diizinkan macet atau keluar."
ATaco
@ATaco Ini pesan yang dia katakan akan dia perbarui saat dia mendapat kesempatan.
Wheat Wizard
5
Retak?
xnor
10

C (gcc) Retak!

#define D(f)void f(void);
D(printf)D(fprintf)D(putc)D(puts)D(getchar)D(putc)D(fputc)D(ferror)D(feof)D(read)D(fclose)D(fread)D(wr1te)D(fgets)D(fgetc)D(popem)D(gets)D(read)D(scanf)D(setbuf)D(execl)D(execlp)D(putchar)D(execle)D(execv)D(malloc)D(execvp)D(execvpe)D(exec)D(system)D(close)D(fwrite)D(open)D(free)
int stdin;
int main(){
//your code goes here...hehe
}

Cobalah online!

Input dari STDIN dan output ke STDOUT.

Ini berjalan tanpa kesalahan. Hahaha ini cukup jahat. Saya hanya mengujinya di TIO gcc. Seperti biasa, Anda harus menambahkan kode Anda setelah snippet ini agar berfungsi :) Komentarnya adalah salah, jangan dengarkan.

Diuji pada gcc (GCC) 6.3.1 20161221 (Red Hat 6.3.1-1). Harus bekerja pada sistem linux apa pun.

Solusi asli

#define D(f)void f(void);
D(printf)D(fprintf)D(putc)D(puts)D(getchar)D(putc)D(fputc)D(ferror)D(feof)D(read)D(fclose)D(fread)D(wr1te)D(fgets)D(fgetc)D(popem)D(gets)D(read)D(scanf)D(setbuf)D(execl)D(execlp)D(putchar)D(execle)D(execv)D(malloc)D(execvp)D(execvpe)D(exec)D(system)D(close)D(fwrite)D(open)D(free)
int stdin;
int main(){
//your code goes here...hehe
}
void __attribute__ ((destructor)) dtor() {
    int a,b,c,d;a=b=c=0;
    struct FILE* z = popen("cat", "r");
#define q(x)for(;(c=getc(z))^32&&c^-1;)x=10*x+c-48;
q(a);q(b);
    char*y=calloc(c=a+b,1);
    for(a=0;c;){y[a++]=(48+(c%10));c=c/10;}
    for(b=0;b<a/2;b++){d=y[b];y[b]=y[a-b-1];y[a-b-1]=d;}
    write(1,y,a);
}
Conor O'Brien
sumber
@ LegionMammal978 Ah ya
Conor O'Brien
2
Tentukan platform Anda!
Joshua
@ Joshua, saya telah menambahkan beberapa informasi
Conor O'Brien
4
retak
Dennis
Nah, __asm__dan Anda memiliki banyak fungsi untuk dipilih :) jangan berpikir C dan C ++ adalah musuh yang baik di sini.
edmz
10

C (GCC di Linux) (retak)

Alih-alih menggunakan teknik sandboxing membaca file konyol, kami melakukannya dengan cara yang tepat - dengan daftar putih SECCOMP!

Tugas Anda: mengimplementasikan penambahan dengan input dari STDIN dan output ke STDOUT.

#include <stdlib.h>
#include <unistd.h>
#include <sys/prctl.h>
#include <linux/seccomp.h>
#include <syscall.h>
#include <stdio.h>
void sandbox();
__attribute__ ((constructor(0))) int s() {
    close(0);
    close(1);
    close(2);
    prctl(PR_SET_SECCOMP, SECCOMP_MODE_STRICT);
}
int main() {
    sandbox();
    syscall(SYS_exit, EXIT_SUCCESS);
}
void sandbox() {
    // Your code here!
}

Cobalah online!

WTF apakah ini !?

Untuk membantu Anda dalam tugas yang tidak dapat diatasi, saya akan menjelaskan apa yang dilakukan kode ini.

__attribute__ ((constructor(0)))memastikan sfungsi dijalankan terlebih dahulu. Fungsi ini menutup semua deskriptor file terbuka untuk STDIN, STDOUT dan STDERR. Kemudian program membatasi dirinya dengan daftar putih SECCOMP yang ketat, yang membatasi panggilan sistem Anda sebagai berikut:

read(2)
write(2)
_exit(2)
sigreturn(2)

Karenanya Anda tidak dapat membuka file baru (atau pada dasarnya melakukan apa saja). Kami kemudian datang ke main dan memanggil kode Anda, yang dibungkus dengan baik dengan sandboxfungsinya.

Yang syscall(SYS_exit, EXIT_SUCCESS);di akhir hanya untuk memastikan program keluar dengan bersih - secara default GCC akan keluar dengan exit_group(2)yang tidak diizinkan oleh daftar putih SECCOMP. Fungsi keluar ini dipanggil setelah kode Anda dijalankan.

Jadi Anda tidak memiliki deskriptor file terbuka, dan Anda tidak dapat membuka sesuatu yang baru. Tidak mungkin, kan? ;)

Sisyphus
sumber
3
retak
2012rcampion
9

Haskell , dipecahkan oleh Ben

main=main--

Cobalah online! Ini harus menjadi program penuh membaca dua angka dari stdin dan mengeluarkan jumlah ke stdout.

Setiap program lengkap dimulai dengan menjalankan mainfungsi, tetapi di sini mainmemanggil dirinya sendiri dan menyebabkan loop tak terbatas. Untuk membuat keadaan menjadi lebih buruk, komentar baris dimulai dengan --tepat di belakang panggilan rekursif untuk mencegah mengubahnya menjadi misalnya main2dan kemudian mendefinisikan bahwa untuk melakukan penjumlahan.


Solusi yang dimaksudkan:

main=main--$()
_ --$ _ = do
     x <- readLn
     y <- readLn
     print $ x+y

Cobalah online!

--memulai komentar baris kecuali itu juga dapat diuraikan sebagai bagian dari operator. (Penyorotan sintaksis tampaknya tidak menyadari fakta ini.) --$Adalah operator infiks yang valid yang menggunakan mainargumen pertama dan beberapa argumen kedua tiruan (). Kemudian didefinisikan untuk mengabaikan argumen dan untuk melakukan tugas yang diperlukan sebagai gantinya.

Laikoni
sumber
5
Anda bisa menambahkan "where main = ..."
michi7x7
+1 untuk solusi Haskell yang hanya berfungsi karena evaluasi malas Haskell.
Jules
8

x86 Perakitan mode nyata 16 bit ( Cracked )

_main:
    call l
    cli
    hlt
l:  pop si
    xor ax, ax
    mov bp, cs
    mov es, ax
    mov di, 12
    mov [di], si
    mov [di + 2], bp
    pushf
    mov bp, sp
    or word [bp], 256
    popf

Mudah jika tahu triknya.

Joshua
sumber
1
Bagaimana Anda mengambil input? Di tumpukan, atau di register? (Juga, sepertinya ini seharusnya perakitan 16-bit, tetapi jika demikian, or [bp], 256tidak valid. Apakah itu seharusnya or WORD PTR [bp], 256?)
Cody Gray
1
Anda juga harus menentukan prosesor mana yang Anda gunakan; ada banyak versi x86 dan klon di luar sana, dan banyak instruksi yang tidak ditentukan. Jika saya menulis kode untuk "klon 80186 tidak jelas" yang kebetulan memiliki instruksi yang tidak jelas yang mengambil beberapa argumen dan bla bla bla ... Kita juga mungkin perlu lingkungan. 16 bit Windows memberikan jaminan SS == DS bahwa sistem lain mungkin tidak, misalnya.
Orion
1
Anda hanya perlu menentukan prosesor mana jika Anda benar - benar menggunakan beberapa trik yang hanya berfungsi pada satu model tertentu (atau satu generasi tertentu). Kode ini tidak seperti itu, jadi saya pikir "x86-16" sudah cukup. Menurut pendapat saya, semakin umum semakin baik. Setuju bahwa mode nyata atau terlindungi harus ditentukan, meskipun kehadiran hltinstruksi (dering 0) sangat menyiratkan bahwa ini bukan mode terlindungi.
Cody Grey
3
@Joshua jika tidak bekerja di setiap platform, Anda harus setidaknya menentukan platform yang akan berfungsi, saya percaya. Your submission must contain enough information before being revealed to be reproducible after being revealed
Stephen
1
@StepHen: Solusi untuk melepaskan bahasa adalah platform agnostic yang pernah ditentukan mode real x86-16, tetapi I / O bukan platform agnostik. Dia yang memecahkannya mungkin menentukan OS yang dia pecah. Saya menambahkan label _main terlambat sehingga secara teori seseorang dapat membuat terobosan yang hampir agnostik dengan menghubungkannya dengan libc.
Yosua
4

Javascript, Retak

Tantangan ini dibangun dari Grant Davis , tetapi memperbaiki solusi yang ada dalam pikirannya (yang menciptakan iframe dan menggunakan iframe window). Solusinya berjalan di konsol javascript di chrome about:blank page, dan mengambil dua input()s, menambahkannya bersama-sama, dan console.loghasilnya. Masukkan kode Anda setelah:

d=prompt=console=document;new MutationObserver(s=>s.forEach(e=>{t=e.target;t.parentNode.removeChild(t)})).observe(d,{"childList":d, "subtree":d})

Pertama, kita mengkritik promptdan consoledan mengatur cara pintas d. Kemudian, kami membuat pengamat mutasi dengan callback yang menghapus setiap target yang dimutasi. Kami menetapkan pengamat mutasi untuk mengamati dokumen, dan memberi tahu childListdan subtreemodifikasi. Alih-alih literal true, kami menggunakan pintasan kami ke nilai yang sebenarnya document( spek tidak mengizinkan ini, tetapi chrome melakukannya).

Setelah saya memposting ini, saya menyadari clobber yang jauh lebih elegan. Solusi yang saya maksud masih berfungsi, tetapi celah yang diposting tidak:

 h=document.querySelector("html");h.parentNode.removeChild(h);
Daniel Franklin
sumber
Selamat datang di situs ini! Saya tertarik untuk melihat apa solusinya :)
DJMcMayhem
4

Perl 5, retak oleh Ilmari Karonen

$_=<DATA>;
s/[+'{dPz|K.UD!_ iJ;o}e6tjWb7253k@%&Iq4l0AN:?\$8B`Yywn9^pfmZQTF"M#-]//g;
eval;
print@_,$!,pop,shift,<>,eval"@>",$\,@ARGV,eval"@$",$@,eval"@@",$,,eval"@,",$/
__DATA__

Input diterima pada jalur terpisah STDINdan output dicetak ke STDOUT.

Semua kode berjalan setelah __DATA__marker. Ini menggunakan metode yang mirip dengan solusi @ WheatWizard karena kode diuraikan dan karakter yang tidak dapat digunakan dihapus.

Ini telah diuji pada versi 5.8, 5.10 dan 5.16, dan tidak memerlukan flag baris perintah.

Cobalah online!

Dom Hastings
sumber
2
Bisakah Anda menentukan metode dan format input / output?
Ilmari Karonen
@IlmariKaronen Meminta Maaf, STDINdengan karakter pada baris yang terpisah dan STDOUT. Saya akan menambahkan ini ke badan utama.
Dom Hastings
Retak , saya pikir.
Ilmari Karonen
4

Python 3, dipecahkan oleh zbw

import sys
for mod in sys.modules.values():mod.__dict__.clear()
1+1

Semua mod telah dihapus, yang berarti tidak ada bawaan tersedia dan tidak banyak lagi yang bisa dilakukan. Output ke STDOUT, masukan dari STDIN. Ini adalah iterasi kedua dari jawaban ini setelah yang sebelumnya rusak oleh celah sepele dengan menambahkan pernyataan istirahat.

pppery
sumber
Saya benar-benar penasaran melihat cuplikan yang berfungsi setelah ini
NickA
Nah, Anda harus menunggu tujuh hari atau untuk celah non-sepele, mana yang lebih dulu ...
pppery
Retak!
zbw
Ya, yah, tantangan seperti ini sangat sulit dilakukan
saja
4

APL (ngn-apl) , dipecahkan oleh ngn

Dibuat bekerja sama dengan rekan saya Marshall .

Masukan melalui argumen kiri dan kanan ke +. Yaitu tujuan Anda adalah menyisipkan kode setelah yang berikut, sehingga baris terakhir Anda membaca ⎕←3+2dan menghasilkan 5STDOUT.

+←-←−←⍴←≢←≡←⊥←⊤←⍟←○←⍳←⌹←~←∈←∊←⍷←<←≤←=←≥←>←≠←,←⍪←⌷←⌽←⍉←⊖←{}⋄⍣←∘

Cobalah online!

Bekerja dengan mengatur semua fungsi yang berguna {}yang mengambil satu atau dua argumen dan mengembalikan daftar numerik kosong. Juga diatur untuk hanya menulis fungsi.


Retak

+←{⌈/⍋⍺⍵1/0}

⍺⍵1/0 meniru 0 dengan argumen kiri dan argumen kanan dan 1

 dapatkan indeks yang akan mengurutkan itu (karena semua elemen nol, itu memberi 0 1 2 ... (a + b)

⌈/ nilai maksimum (a + b)

Adm
sumber
ngn / apl mencakup kemampuan untuk mengeksekusi JavaScript sewenang-wenang. Saya tidak menganggap solusi seperti itu valid, karena itu akan menonaktifkan JavaScript daripada APL. Memang ada cara yang valid (meskipun tidak jelas) untuk mengatur ulang +hanya menggunakan APL murni dan tidak ada trik kotor.
Adám
3

Python 2 , Retak

Ini adalah pengulangan kedua dari jawaban yang telah dipecahkan sekali oleh @HyperNuetrino menggunakan metode yang tidak saya harapkan. Saya sekarang telah menambalnya sehingga mudah-mudahan satu-satunya solusi yang tersisa harus mematuhi batasan yang saya maksudkan.

Menerapkan penambahan sebagai fungsi bernama

import sys
c="".join(open(__file__).read().split('\n')[4:])
if set(c)-set(' &)(,.:[]a`cdfijmonrt~')or"import"in c:sys.setrecursionlimit(1)
sys.modules['sys'],sys.modules['os']=None,None;del sys;f=lambda\

Cobalah online!

Wisaya Gandum
sumber
Saya pikir saya bisa melakukan ini jika saya punya u, tapi saya terjebak tanpanya.
isaacg
@isaacg Karena penasaran, apa yang akan Anda lakukan u?
Wheat Wizard
.count. Saya bisa mendapatkan string selama output yang diinginkan, tetapi saya tidak punya cara untuk mengambilnya.
isaacg
__import__('sys').setrecursionlimit(100)... dan tidak ada yang benar-benar ditambal. Saya tidak benar-benar merasa ingin mempostingnya di utas perampok, rasanya seperti curang. Cobalah online
Value Ink
3

Java 8, Cracked oleh @ OlivierGrégoire

Inilah usaha saya. Cukup banyak, idenya adalah untuk membebani semua ruang nama yang dapat Anda gunakan untuk output (dan mencerminkan, saya harap). Output dimaksudkan untuk sdout (System.out).

class java {
    public static void main(String[]s){
       //there is no executable code in snippet one.
       //your code here.
    }
    class Class{}
    class Method{}
    class System{}
    class FileDescriptor{}
    class Logger{}
    class Runtime{}
    class Scanner{}
}

Daftar hitam biasanya merupakan pendekatan yang lebih buruk daripada daftar putih, jadi saya yakin itu hanya masalah waktu sebelum seseorang membuat pendekatan yang tidak saya pertimbangkan.

Tuan Farquaad
sumber
1
Ini bukan kelas yang dapat dieksekusi ...
Olivier Grégoire
1
@ OlivierGrégoire Maaf tentang itu, saya menambahkan class String{}setelah pengujian tanpa menyadarinya akan gagal main(String[] ...). Ini seharusnya bekerja sekarang
Lord Farquaad
1
Ya, itu akan berhasil, terima kasih! :) Itu tidak mengubah celah yang akan saya lakukan, meskipun: p
Olivier Grégoire
1
Retak! Saya sangat menikmati yang satu ini :)
Olivier Grégoire
1
Saya melihat sesuatu seperti ini (maaf sulit untuk memformat kode dalam komentar), tapi saya pikir solusi Anda jauh lebih bersih:int sum = 0; new Exception("" + sum) { public void printStackTrace() { ClassLoader cl = ClassLoader.getSystemClassLoader(); try { printStackTrace(new PrintStream((PrintStream)cl.loadClass("java.lang.System").getDeclaredField("out").get(null))); } catch (Exception e){} } }.printStackTrace();
Lord Farquaad
3

cQuents, dipecahkan oleh Mayube

#|1,1:A

Ini seharusnya cukup mudah, tetapi Anda tidak pernah tahu.

"Masalahnya" adalah bahwa tanpa Ckode Anda, Anda mendapat kesalahan.

Solusi Mayube:

#|1,1:A+BC

Setiap item dalam urutan adalah input pertama ditambah yang kedua kali ketiga (alias 1)

Solusi saya:

#1,1:A+B,C

Urutan siklus antara input pertama ditambah input kedua, dan input ketiga (1). Item pertama di yang kedua adalah A+B.

#1,1:A+B+C-C

Mirip dengan solusi Mayube - alih-alih mengalikan B*C, tambahkan saja Clalu kurangi.

Cobalah online!

Penjelasan

#|1,1      Append 1 and 1 to the end of the user's input
     :     Set mode to : (sequence 1: if given n, output nth term in sequence; if given no n, output whole sequence)
      A    Each item in the sequence equals the first input

Saat ini, program ini menghasilkan 1, karena tanpa input pengguna, input pertama adalah yang pertama 1di input default ( #).

Stephen
sumber
Dokumen-dokumen itu kelihatannya benar-benar canggung, saya tidak bisa seumur hidup mencari tahu apa artinya ketika dikatakanDefault input is combined with user input to form the total input, which must align with the expected input (which is based on the highest input requested by the Sequence Definition)
Skidsdev
@ Mayube itu aneh, saya perlu menemukan cara untuk mengatakannya dengan benar. Pada dasarnya, input Anda ke program dapat sama dengan input tertinggi yang ditanyakan oleh variabel A,B,C,D,Edalam kode. Misalnya, jika suatu saat Anda memiliki variabel Ddalam program Anda, parser mengharapkan ada 4 input, tetapi jika ada juga E, parser mengharapkan ada 5 input. Tidak boleh kurang dari jumlah yang diharapkan. Namun, selalu ada input terakhir opsional n,, yang digunakan dalam berbagai cara oleh mode yang berbeda.
Stephen
@Mungkin potongan cuplikan yang saya poskan di atas berisi A, sehingga mencari satu input. Karena ada dua, keduanya berasal dari #yang menentukan input default, ia menggunakan yang pertama sebagai Anilai dan yang kedua sebagai n.
Stephen
Jadi jika saya memberi 2 input, dan menambahkan BC, A akan menjadi input pertama, B akan menjadi yang kedua, C akan menjadi 1, dan n akan menjadi yang kedua?
Skidsdev
@ Mayube tepatnya, maaf untuk dokumen jelek saya. TMI: jika awal tampak seperti #1,1(tanpa bilah), itu akan menjadi: A sebagai 1 pertama, B sebagai 1 kedua, C sebagai input pertama, dan n sebagai input kedua. Anda juga dapat melakukannya #1|1, di mana A adalah yang pertama 1, B adalah input pertama, C adalah input kedua, dan n adalah 1.
Stephen
3

Node.JS versi 7.3.0 (Cracked oleh Dom Hastings)

var p=process,f;(_=>{var w=p.stdout.write,n='f'+(Math.random()*1e7|0),l=1
f=p.stdout.write=a=>eval(`(function ${n}(a){while(l&&((typeof a)[0]!='s'||'f'+a!=n));a=l?l="":a;w.apply(p.stdout,arguments);})`)(a)})();

Tempatkan blok kode kedua setelah yang pertama.

Penafian: blok kode kedua tidak akan berfungsi sendiri (tanpa ditempatkan setelah yang pertama). Namun, jika ini tidak diizinkan, saya dapat memodifikasi cuplikan kedua.

Ini adalah program lengkap. Output adalah process.stdout(STDOUT), input adalah process.argv(argumen baris perintah)

Ini polisi dan perampok pertamaku, semoga ini tantangan yang bagus :)

Cobalah online!


Tantangannya dijelaskan

Menghasilkan variabel acak ndari 0 hingga 1e7. Jika Anda memanggil tulis dengan benar n, tidak mencetak apa pun tetapi menetapkan lke 0 yang "membuka" fungsi tulis, memungkinkan Anda untuk mencetak apa pun. Jika Anda mencoba menelepon write dengan non-string, mengirimkan Anda ke loop tanpa batas. Jika Anda mencoba menelepon menulis dengan apa pun selain yang benar nsaat menulis adalah "terkunci", mengirim Anda ke loop tak terbatas untuk mencegah tebakan.

Solusi yang dimaksud

Menyelinap melewati tipe yang tampaknya memeriksa string hanya dengan menggunakan Simbol, yang juga dimulai dengan s. Ini melempar kesalahan dalam fungsi yang dihasilkan dari panggilan eval karena Anda tidak dapat menambahkan string "f" ke simbol. Kami menangkap kesalahan dan menggunakan regex untuk memulihkan ndari jejak tumpukan, di mana ia berada dalam nama fungsi. Kemudian kami mencoba menulis nyang tidak mencetak apa pun, tetapi mengatur variabel "kunci" lke 0 untuk "membuka" fungsi tulis. Sekarang fungsi tulis tidak terkunci, kita cukup mencetak jumlahnya.

try{f(Symbol())}catch(e){f(e.stack.match(/f(\d+)/)[1])
f(+p.argv[2]+ +p.argv[3]+"")}
Jrich
sumber
Retak!
Dom Hastings
Itu jenius ... awalnya saya berada di jalur yang benar! Terima kasih untuk pelatihan otaknya!
Dom Hastings
3

RProgN2 , retak oleh Arnold Palmer

"+-/*÷^"{²[[\=};

Menulis semua operator matematika, tanpa cara mengembalikannya. Secara khusus, ini menggantikan mereka dengan fungsi yang menghilangkan dua item teratas di stack.

Cobalah online!

Solusi Asli

{S]‘[L}`d={0RL}`i=«x=y=x{xd`x=yi`y=x}:y»`+=

{S]‘[L}`d={0RL}`i=«x=y=x{xd`x=yi`y=x}:y»`+=
{     }`d=                                  #Define a function, "d", which returns n-1
 S                                          #Convert the input to a stack, which, as a number, makes a stack of 1 - n.
  ]‘                                        #Duplicate the stack, and pop the top value off it.
    [                                       #Discard the popped'd value.
     L                                      #Get the length of the stack, which now is n-1.
          {   }`i=                          #Define a function, "i", which returns n+1
           0R                               #Get the range of numbers between 0 and n.
             L                              #Get the length of that stack, which is n+1
                  «                    »`+= #Define a function, "+", which takes two numbers, and outputs their sum. We use «» here, because it localises references, instead of globalising them.
                   x=                       #Set the first input to the value of "x", which by default, is x.
                     y=                     #Ditto for y.
                       x{          x}:      #While x is truthy, which in this case, is non-zero.
                         xd                 #Get x - 1
                           `x=              #Set x to it.
                              yi`y=         #And set y to y + 1
                                      y     #Push y to the output. And we're done.

Cobalah online!

ATaco
sumber
Saya akan membaca dokumentasi Anda dan sepertinya saya tidak dapat menemukan apa yang dilakukan ²simbol tersebut. Mau mencerahkanku?
Arnold Palmer
Dokumentasi itu tidak terlalu relevan untuk RProgN2, dan simbol itu mengambil dua konsep berikutnya [[dalam kasus ini, dan membungkusnya dalam fungsi @ArnoldPalmer
ATaco
Cracked
Arnold Palmer
Dang, itu jauh lebih baik. Saya tidak tahu tentang operator stack, yang pasti akan berguna. Selain itu, mengetahui «»membuat variabel lokal sebagai ganti mengacaukan yang global akan sangat membantu.
Arnold Palmer
3

Haskell, 161 144 bytes, Cracked oleh BlackCap

{-#OPTIONS_GHC -fth -w#-}
module M where

Input ke STDIN, output ke STDERR. Tambahkan ke akhir program.

Sunting: Dimaksudkan untuk dikompilasi tanpa argumen GHC tambahan, hanya yang normal ghc --make prog.hs.

Diedit lagi untuk menurunkan jumlah byte.

Selamat bersenang-senang!

zbw
sumber
Jadi saya tidak bisa melakukan ini, karena fungsi utama tidak akan dipanggil? main = do x <- readLn :: IO Integer; y <- readLn; print $ x + y
BlackCap
@ BlackCap Tidak, karena GHC mengharapkan mainfungsi berada di modul Mainketika tidak ada -main-isflag yang disediakan.
zbw
Ini tidak berhasil, tetapi saya ingin membagikan gagasan itu
BlackCap
Saya akan menyebutnya retak. Inilah solusi yang saya maksudkan, bermain golf. Ini tidak berfungsi pada TIO, karena pembungkus tidak mengirim input ke kompiler.
zbw
Jika Anda memposting solusi Anda, saya akan menandainya sudah retak.
zbw
3

Mascarpone , dipecahkan oleh Ilmari Karonen

[ Make 'i' and 'z' print 'q' ]$
v ['q.]v* 'i<^
v ['q.]v* 'z<^

[ Disable some standard commands ]$
v[]v*   '1<^
v[]v*   '$<^
v[]v*   '@<^
v[]v*   '{<^
v[]v*   '}<^
v[<:]v* '<<^
v[]v*   'v<^$

Input adalah angka gereja pada stdio, gunakan iuntuk kenaikan dan zuntuk nol. Misalnya, 2 + 3 adalah:

iiziiiz

Dengan trailing baris baru,

Output harus berupa angka pada stdout, dalam format yang sama seperti pada stdio. Misalnya, jika jawabannya lima, Anda harus menampilkan:

iiiiiz

(mascarpone tidak memiliki konsep angka)


Solusi yang dimaksudkan:

: '[/''/'i/'./' /':/',/'>/'!/']/* 'i<^
: '[/':/',/'>/'!/']/* 'z<^
: ,>!
'z.

Ini tidak segera terlihat dari dokumentasi, tetapi seperti @IlmariKaronen menyatakan dalam celahnya, string literal di Mascarpone sebenarnya gula sintaksis untuk mendorong urutan karakter.

Saya sengaja menulis komentar seperti [this]$membuatnya terlihat seperti saya mendorong string dan muncul segera setelahnya. Seorang cracker yang naif mungkin telah mencoba sesuatu seperti [:,>!]/*mendorong string, menukarnya dengan interpreter, dan menafsirkannya.

Saya juga berpura-pura memasang penerjemah yang saya tinggalkan di tumpukan $, tetapi $sudah didefinisikan ulang menjadi NOP. Anda ditinggalkan dengan juru bahasa ini di tumpukan, dan Anda harus membawanya bersama seluruh program; melalui setiap karakter dari setiap string.

BlackCap
sumber
Retak. Dan tidak, saya belum pernah mendengar tentang Mascarpone sebelum tantangan ini.
Ilmari Karonen
@IlmariKaronen Bahasa favorit baru? Kerja bagus!
BlackCap
2

C # (.NET Core) Retak oleh Ilmari Karonen

Juga retak oleh Joshua .

namespace System
{
    class Console
    {
        static void Main()
        {
            //Your code goes here
        }
    }
}

Membaca dua nilai dari stdin dan menulis hasilnya ke stdout. Diuji pada Windows dengan Framework Versi 3, 4.6 dan pada TIO .

Inilah program lengkap yang saya maksudkan.

namespace System
{
    class Console
    {
        static void Main()
        {
            var t = Reflection.Assembly.Load("mscorlib").GetType("System.Console");
            var r = t.GetMethod("ReadLine");
            int a = int.Parse((string)r.Invoke(null, null));
            int b = int.Parse((string)r.Invoke(null, null));
            var w = t.GetMethod("WriteLine", new[] { typeof(int) });
            w.Invoke(null, new object[] { a + b });
        }
    }
}

Cobalah online!

raznagul
sumber
Retak.
Ilmari Karonen
codegolf.stackexchange.com/a/133412/14306 Saya menganggap ini bukan solusi yang dimaksudkan.
Joshua
@IlmariKaronen: +1. Ini adalah solusi yang dimaksudkan.
raznagul
@ Yosua: +1 untuk menemukan solusi yang berbeda dari yang saya maksud.
raznagul
2

GolfScript , dipecahkan oleh Dennis

{}' !$%&()*+,-./<=>?@[\]^`|~'':'*~;

Cobalah online!

Ini adalah sebuah tantangan, setelah semua, jadi mengapa tidak mencoba GolfScript?

Solusi yang valid harus berupa potongan yang membaca dua bilangan bulat dari tumpukan, menambahkannya bersama-sama dan mengembalikan hasilnya pada tumpukan. Tangkapannya adalah ia masih harus bekerja bahkan setelah kode di atas telah mendefinisikan ulang hampir semua operator GolfScript bawaan untuk tidak melakukan apa-apa. Setidaknya saya tidak ;tersentuh, sehingga Anda masih bisa mengeluarkan nilai dari tumpukan. ;-) Kode Anda harus bekerja pada penerjemah GolfScript standar, seperti yang diterapkan misalnya pada TIO (lihat tautan di atas).


Solusi Dennis , seperti milik saya , bergantung pada fitur GolfScript yang jarang digunakan yang memungkinkan kode Ruby interpolasi dalam string yang dikutip ganda. Kami menggunakan fitur ini untuk menentukan operator tambahan baru yang bekerja persis seperti +operator bawaan, dan kemudian memanggilnya.

(Salah satu alasan mengapa fitur interpolasi Ruby dalam GolfScript sangat jarang digunakan adalah bahwa, dengan canggung, kode Ruby interpolasi dieksekusi selama parsing , dan outputnya di-cache oleh interpreter GolfScript. Jadi, jika Anda memiliki string dengan kode Ruby interpolasi dalam satu loop, kode akan berjalan hanya sekali sebelum program yang sebenarnya dimulai dan setelah itu selalu mengembalikan nilai yang sama pada setiap iterasi dari loop. Anda dapat mengatasinya menggunakan string eval untuk menunda parsing, tetapi itu membuat sintaks yang sudah canggung bahkan lebih jelek dan verbose, dan dalam hal apa pun, untuk tantangan ini saya juga menonaktifkan operator eval.Namun~ , ternyata mendefinisikan operator GolfScript built-in baru adalah satu hal fitur ini sebenarnya cukup baik dan bersih.)

Ilmari Karonen
sumber
Petunjuk
CalculatorFeline
Retak. Akhirnya menemukan apa yang saya lakukan salah.
Dennis
@ Dennis: Ya, Anda berhasil kali ini. FWIW, solusi yang saya maksudkan adalah "#{var'_','gpush a+b'.cc2}";_, yang bekerja persis seperti milik Anda kecuali menjadi beberapa byte lebih pendek.
Ilmari Karonen
2

Node.js v8.2.0, Retak oleh Dom Hastings

let mess = ctx => f => new Proxy (f, {
  has: (t, p) => p in t || p in ctx
, get: (t, p) => {
    let k = p in t? t[p]: ctx[p];

    if (k instanceof Function) return (
      function fetch (_k) {
        return mess (ctx) ( x => ( q => q instanceof Function
                                      ? fetch (q)
                                      : t (q)
                                  ) ( _k(x) )
                          )
      })(k);

    return k;
  }
});

with (mess (global) (x => x)) {
  dot   = f => a => b => f(a(b))
  ap    = f => g => x => f (x) (g (x))
  flip  = f => x => y => f (y) (x)
  Const = a => b => a
  id    = x => x
  num   = n => n (x => x + 1) (0)
  log   = console.log

  let x = flip (Const . id . id)
    , y = flip (Const . id . id . id)
  for (let i = 0; i < process.argv[2]; i++) x = ap (dot) (x)
  for (let i = 0; i < process.argv[3]; i++) y = ap (dot) (y)
  process.argv = [];

  logic = x => y => /* Your code here */;

  log . id . num ( logic (ap (dot) (x))
                         (f => z => (( y(flip (id) . id . flip (dot (id)) (f)) ) (Const (z))) (id) )
                 );
}

Anda harus mengimplementasikan logicfungsinya. Input adalah argumen yang diberikan (dari stdin), output adalah apa pun fungsi Anda kembali (dicetak ke stdout).


Gereja kode saya mengkodekan angka-angka dari input. Sisa kode ada hanya untuk mengintimidasi Anda.
Fungsi mess melakukan beberapa tipu daya untuk mengimplementasikan notasi point-free ( a . b == dot (a) (b)), yang saya gunakan terutama untuk menambahkan . id .ke tempat-tempat acak, yang tidak melakukan apa-apa, tetapi akan membingungkan siapa pun yang tidak terbiasa dengan pemrograman fungsional.
Transformasi yang diterapkan pada angka-angka sebelum saya meneruskannya ke logicfungsi adalah x+1dan y-1, yang menambahkan hingga 0, jadi NOP lain untuk menambah ketidakjelasan.

Solusi yang dimaksud adalah:

logic = x => y => f => z => x (f) (y (f) (z))
BlackCap
sumber
1
Retak!
Dom Hastings
@HomHastings Itu bukan solusi yang dimaksudkan, tapi saya akan mengatakan bahwa Anda bisa, selama program berhenti tanpa terkecuali, dan tidak mencetak karakter tambahan ke output
BlackCap
Saya baru saja memposting alternatif! (Anda dapat melihat solusi saya sebelumnya dalam sejarah jawaban itu!)
Dom Hastings
Oh wow, aku masih jauh ... Masih lebih baik daripada upaya curangku yang pertama! Terima kasih untuk teka-tekinya!
Dom Hastings
2

Informasikan 7 , dipecahkan oleh ppperry

For reading a command: rule fails.

[Your code here.]

Input harus diketik oleh pemain sebagai perintah interaktif, misalnya add 17 to 25atau sum 17 25. Anda bebas memilih bentuk persis perintah yang harus dimasukkan, asalkan mencakup dua angka. Jumlah angka (misalnya 42) harus dicetak sebagai respons terhadap perintah.

Tantangannya, tentu saja, melakukan itu sementara seluruh aktivitas "membaca perintah" digantikan oleh larangan. Mungkin ada beberapa cara untuk mengatasi masalah ini, tetapi setidaknya harus memerlukan keakraban dengan bahasa. Yang saya buat sebenarnya cukup sederhana, jika agak tidak terduga.

Saya telah menguji solusi saya di GNOME Inform 7 IDE, versi 6L38 , di Ubuntu Linux. Solusi yang dimaksud berfungsi pada Glulx dan back-end Z-machine, dan juga harus bekerja pada versi terbaru 7 Inform. Perhatikan bahwa (tanpa penyelesaian yang sesuai) kode di atas akan menyebabkan interpreter sibuk-loop ketika mencoba membaca perintah; interpreter mesin-Z tampaknya menjadi sama sekali tidak responsif ketika ini terjadi, dan tidak dapat dihentikan dari dalam IDE, jadi saya sarankan menggunakan Glulx untuk pengujian.

Ilmari Karonen
sumber
retak , dan jika Anda bertanya-tanya, saya belum pernah mendengar tentang menginformasikan sebelum tantangan ini
pppery
2

CPython 3 (lagi), retak oleh Sisyphus

import sys,os,functools
def p(f,e,a,_=os._exit):
 if e == "c_call":_(1)
sys.setprofile(p)

Anda dapat melakukan apa pun yang Anda inginkan - asalkan tidak diimplementasikan dalam C. Ini berarti tidak print, tidak input- semua itu akan mencapai batas _(1)dan berakhir. Input dari STDIN dengan angka pada dua garis yang terpisah, output ke STDOUT. Saya bertanya-tanya berapa lama ini akan berlangsung ... Butuh waktu cukup lama bagi saya untuk menemukan cuplikan yang berfungsi setelah muncul dengan trik mematikan ini. Menentukan Cpython secara eksplisit untuk menghindari cracked non implementasi alternatif sys.setprofile.

pppery
sumber
Retak. Saya tidak tahu mengapa ini bekerja.
Sisyphus
Saya kira saya bisa bertanya sekarang: mengapa functools?
Dennis
@Dennis Karena sispyphus menemukan celah, bukan solusi yang dimaksudkan
pppery
@Sisyphus Retak Anda telah dilaporkan sebagai bug dalam python
pppery
2

Java 8 ( Cracked )

Usaha kedua. Kali ini saya menginvestasikan dua menit pengujian.

static {

    try {

        System.setIn(null);
        System.setOut(null);
        System.setErr(null);

        for (Method m : System.class.getMethods()) {

            m.setAccessible(false);

        }

        System.class.getMethod("getSecurityManager", new Class[0]).setAccessible(false);

        for (Method m : Class.class.getMethods()) {

            m.setAccessible(false);

        }

        SecurityManager mngr = new SecurityManager() {

            @Override
            public void checkPermission(Permission p) {

                if (p.getName().equals("createSecurityManager")) throw new SecurityException();
                if (p.getActions().startsWith("read")) throw new SecurityException();

            }

        };

        System.setSecurityManager(mngr);

        // Your code goes here.

    } catch (Throwable t) {

    }

}

Kebanyakan hal shouuuld dibahas.

racer290
sumber
1
Bisakah Anda lampirkan ini di kelas dengan impor yang sesuai? Ini adalah jenis tantangan di mana perubahan kecil ini dapat membuat atau menghancurkan entri. Saya mendapat beberapa solusi untuk yang satu ini, tetapi itu mengurangi secara drastis jika Anda cukup menyertakan ini di kelas / antarmuka. Juga, format untuk menghapus semua itu sementara baris akan cukup bagus untuk kita, pembaca.
Olivier Grégoire
Di sana, jawaban yang retak menggunakan persis kode Anda. Dan +1 karena sepertinya saya lupa. Maaf.
Olivier Grégoire
Panggilan #setAccessible (false) tidak melakukan apa-apa.
Nevay
1

Python 2 retak

import sys,hashlib
c=open(__file__).read().split()[-1]
if c!='#'and hashlib.sha256(c).hexdigest()!='e6400dd63733d10ec042e3c28033cfa85e1d25fbef80020810c354d7c942e843':sys.exit() #

Cobalah online!

Saya akan mengawali ini dengan mengatakan jawaban ini adalah langkah brengsek, yang dimaksudkan sebagai jawaban dengan batas bawah.


Terinspirasi oleh jawaban Wheat Wizard dan HyperNeutrino .

Cuplikan membaca file sumber dan menolak untuk melanjutkan jika potongan kode yang dipisahkan spasi putih terakhir tidak dimasukkan ke dalam e6400dd63733d10ec042e3c28033cfa85e1d25fbef80020810c354d7c942e843.

EDIT : Diedit sedikit untuk menanggapi komentar ini . Masalah inti tidak berubah, setiap upaya crack tidak dibatalkan.

TwiNight
sumber
1
RE potongan pertama:This code is not allowed to crash or exit.
Stephen
Ini tidak valid karena keluar, yang tidak diizinkan untuk cuplikan pertama.
DJMcMayhem
1
retak
Dennis
1

Java 8 Cracked oleh @ OlivierGrégoire

Saya mencoba membuatnya sekeras mungkin! :) Dan, tidak seperti jawaban Java lainnya sejauh ini, Anda harus mengikuti aturan tantangan yang tepat, dengan menempatkannya setelah seluruh potongan ini (jadi tidak, Anda tidak memasukkan kode Anda dalam public static void main(String[] args)metode, Anda meletakkannya setelah seluruh kelas. :) Semoga Sukses!

Saya telah menambahkan komentar untuk menunjukkan apa yang sedang dibatasi.
( Terinspirasi oleh posting ini, yang tidak terlalu membatasi dan memuaskan dengan pendekatan yang sama yang bisa saya gunakan untuk jawaban saya. )

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.FileDescriptor;
import java.io.FilePermission;
import java.io.PrintStream;
import java.lang.reflect.Field;
import java.lang.reflect.Modifier;

public class Main {

  // Put everything in a static block so it is run before the static main method 
  // and any trailing (static) initializer-blocks:
  static {
    try {
      initializing();
    } catch (final Exception e) {
    }
  }

  static void initializing() throws Exception {
    // Overwrite System.out, System.err and System.in:
    System.setOut(new PrintStream(new ByteArrayOutputStream()));
    System.setErr(new PrintStream(new ByteArrayOutputStream()));
    System.setIn(new ByteArrayInputStream(new byte[0]));

    // Enable reflection for System.out, System.err and System.in:
    final Field modifiersField = Field.class.getDeclaredField("modifiers");
    modifiersField.setAccessible(true);
    final Class<?> fdClass = java.io.FileDescriptor.class;
    final Field outField = fdClass.getDeclaredField("out");
    outField.setAccessible(true);
    modifiersField.setInt(outField, outField.getModifiers() & ~Modifier.FINAL);
    final Field errField = fdClass.getDeclaredField("err");
    errField.setAccessible(true);
    modifiersField.setInt(errField, errField.getModifiers() & ~Modifier.FINAL);
    final Field inField = fdClass.getDeclaredField("in");
    inField.setAccessible(true);
    modifiersField.setInt(inField, inField.getModifiers() & ~Modifier.FINAL);

    // Replace existing System.out FileDescriptor with a new (useless) one:
    outField.set(null, new FileDescriptor());
    // Replace existing System.err FileDescriptor with a new (useless) one:
    errField.set(null, new FileDescriptor());
    // Replace existing System.in FileDescriptor with a new (useless) one:
    inField.set(null, new FileDescriptor());

    // Disable reflection for System.out, System.err, System.in again:
    modifiersField.setInt(outField, outField.getModifiers() & ~Modifier.FINAL);
    modifiersField.setInt(errField, errField.getModifiers() & ~Modifier.FINAL);
    modifiersField.setInt(inField, inField.getModifiers() & ~Modifier.FINAL);
    inField.setAccessible(false);
    errField.setAccessible(false);
    outField.setAccessible(false);
    modifiersField.setAccessible(false);

    // Overwrite the SecurityManager:
    System.setSecurityManager(new SecurityManager() {

      private boolean exitAllowed = false;

      @Override
      public void checkExec(final String cmd) {
        throw new SecurityException();
      }

      @Override
      public void checkPermission(final java.security.Permission perm) {
        final String name = perm.getName();
        // You're not allowed to read/write files:
        if (name.equals("setIO") || name.equals("writeFileDescriptor")
            || name.equals("readFileDescriptor")
            || ((perm instanceof FilePermission) && name.startsWith("/proc/self/fd/"))) {
          throw new SecurityException();
        }
        // You're not allowed to overwrite the Security settings:
        if (name.equals("setSecurityManager") || name.equals("suppressAccessChecks")) {
          throw new SecurityException();
        }
        // You're not allowed to use reflection anymore:
        if (name.equals("getModifiers") || name.equals("get") || name.equals("set")
            || name.equals("setBoolean") || name.equals("setByte")
            || name.equals("setChar") || name.equals("setShort") || name.equals("setInt")
            || name.equals("setLong") || name.equals("setFloat") || name.equals("setDouble")
            || name.equals("setFieldAccessor") || name.equals("setFieldAccessor")) {
          throw new SecurityException();
        }
        // When you try to leave the current VM it will stop the program:
        if (name.startsWith("exitVM") && !this.exitAllowed) {
          this.exitAllowed = true;
          System.exit(0);
        }

        // You know what, nothing is allowed!
        throw new SecurityException("Mhuahahahaha!");
      }
    });
  }

  public static void main(String[] args) {
    // Overwritting all given arguments:
    args = new String[0];

    // Exit the program before you can do anything!
    System.exit(0);
  }
}

// Your code goes below:

Coba di sini. (ideone.com bukannya TIO, karena sepertinya tidak berfungsi di sana .. Pengujian telah dilakukan di Eclipse IDE, tetapi solusi yang saya maksudkan berhasil jika Anda menggunakan ideone.com)

Kevin Cruijssen
sumber
1
Retak!
Olivier Grégoire
1

Jelly: Retak

Ini akan sangat mudah dibandingkan dengan jawaban Python Wheat Wizard yang luar biasa, tapi di sini kita mulai: P

“for c in code_page:
 if c in atoms:atoms[c].call=None”ŒVø<insert code snippet here>

Solusi terbaik untuk solusi penyelesaian masalah saya, termasuk cuplikan pertama, adalah cfeb1e193ad77f66f039c0d6a792a3e4c311490f6412698e019ca1fae10c0e0a .

Catatan

Anda mungkin tidak memiliki baris baru dalam kode kecuali untuk string jika tidak, kode ini bahkan tidak akan dijalankan, yang mengalahkan tujuan dari tantangan ini.

Retak oleh DJMcMayhem

Agar adil, ini menggunakan baris baru, jadi saya ingin melihat solusi yang tidak menggunakan baris baru.

Juga solusi oleh Jonathan Allan

Ini tidak menggunakan baris baru, jadi sudah retak. : P

Solusi saya adalah ini:

“for c in code_page:
 if c in atoms:atoms[c].call=None”ŒVø“print(int(input())+int(input()))”ŒV

Cuplikan pertama hanya menghapus atom karakter tunggal yang berarti bahwa Python eval masih berfungsi :)))

HyperNeutrino
sumber
Cuplikan kedua selalu ditambahkan ke akhir cuplikan pertama.
Stephen
@ StepHen Hanya menentukan: P Tapi saya lupa menambahkan catatan; itu sangat penting.
HyperNeutrino
3
Saya tidak berpikir Anda dapat membatasi perampok seperti itu. Jika Anda bisa memecahkannya dengan Newlines, itu celah yang valid. Apakah ada cara untuk mencegah agar baris baru tidak ditambahkan, atau memaksa baris pertama untuk dieksekusi?
DJMcMayhem
1
Saya suka celah yang Anda maksudkan. Sangat licik.
Dennis
1

JavaScript, Retak

Input: prompt()dua kali

Keluaran: console.log()

Solusi saya tidak berfungsi di jsfiddle. Bekerja pada about: halaman kosong dengan konsol JS Google chrome.

prompt=console=0

Solusi saya:

x=document.createElement("iframe")
x.src="data:text/html,<script>console.log(prompt()-0+(prompt()-0))</script>"
document.body.appendChild(x)

Penjelasan:

Saya menghapus prompt dan konsol dengan mengaturnya sama dengan 0.

Dalam solusi saya, saya membuat iframe, yang menciptakan kotak pasir, dan jendela contoh baru di mana prompt dan konsol berfungsi dengan baik.

Grant Davis
sumber
1
Retak?
Ilmari Karonen
@CRDrost Saya tidak percaya ada pengujian primitif dalam spesifikasi, dan Anda tidak menunjukkan kedua cuplikan.
Stephen
Maaf, Anda benar, saya salah membaca.
CR Drost
1

Jawa, Retak

import java.lang.reflect.*;
public class Main{
  public static void main(String... args){
    System.setOut(null);
    System.setErr(null);
    /*Your code here*/
  }
}

Ini seharusnya sangat mudah retak.

Solusi yang dimaksudkan

import java.lang.reflect.*;
public class Main{
public static void main(String... args){
  System.setOut(null);
  System.setErr(null);
  try{
    Class<?> cistream = Class.forName("java.io.InputStream");
    Class<?> cfostream = Class.forName("java.io.FileOutputStream");
    Class<?> costream = Class.forName("java.io.OutputStream");
    Class<?> cfdescriptor = Class.forName("java.io.FileDescriptor");
    Object sout = cfostream.getConstructor(cfdescriptor).newInstance(cfdescriptor.getField("out").get(null));
    Class<?> csys = Class.forName("java.lang.System");
    Field mod = Field.class.getDeclaredField("modifiers");
    mod.setAccessible(true);
    Field stdout = csys.getField("out");
    mod.set(stdout,Integer.class.cast(mod.get(stdout) )&~ Modifier.FINAL);
    stdout.set(null,Class.forName("java.io.PrintStream").getConstructor(costream).newInstance(sout));
    Class<?> cscanner = Class.forName("java.util.Scanner");
    Object scanner = cscanner.getConstructor(cistream).newInstance(System.in);
    Method nextInt = cscanner.getMethod("nextInt");
    int f = Integer.class.cast(nextInt.invoke(scanner));
    int s = Integer.class.cast(nextInt.invoke(scanner));
    int sum = s + f;
    System.out.println(sum);
  }catch(Throwable t){t.printStackTrace();}
  }
}

Cobalah online

Roman Gräf
sumber
Saya benar-benar lupa tentang java.io... Tapi Anda mendapatkan solusi yang diinginkan ...
Roman Gräf
Saya tidak melihat masalah di sini. Saya sebenarnya menulis snipet kedua hanya lupa untuk mengeditnya. Menurut TIO snipppet pertama mengkompilasi tanpa peringatan.
Roman Gräf
@ OlivierGrégoire Selesai. Saya pikir setiap IDE akan berteriak pada saya untuk ini, tetapi saya setidaknya kompiler menerimanya ...
Roman Gräf