ทำให้ภาษาของคุณเป็นส่วนใหญ่ * ใช้ไม่ได้! (ด้ายของตำรวจ)


61

แรงบันดาลใจจากความคิดเห็นนี้ ...

ขอขอบคุณผู้ใช้Step Hen , Wheat-WizardและDennis ที่ช่วยฉันสร้างความแข็งแกร่งให้กับสเปคของความท้าทายนี้ก่อนโพสต์มัน!

นี่คือหัวข้อของ Cops สำหรับเธรดของ Robbers ให้ไปที่นี่


ในความท้าทายนี้คุณจะได้รับมอบหมายให้ใช้งานโค้ดบางอย่างเพื่อให้ภาษาของคุณไม่เป็นไปตามเกณฑ์การเป็นภาษาการเขียนโปรแกรมอีกต่อไป ในการท้าทายนั้นหมายถึงการทำให้ภาษาไม่สามารถ ...

  • รับอินพุตและเอาต์พุตตัวเลข

  • เพิ่มตัวเลขสองตัวเข้าด้วยกัน

  • ทดสอบว่าจำนวนหนึ่งเป็นจำนวนเฉพาะหรือไม่

นี่เป็นความท้าทายของซึ่งมีความท้าทายสองประการที่แตกต่างกันโดยมีวัตถุประสงค์ที่แตกต่างกันสองประการ: ตำรวจจะพยายามเขียนโค้ดบางอย่างที่ทำให้ภาษาใช้งานไม่ได้เป็นส่วนใหญ่และโจรจะพยายามหาวิธีแก้ปัญหาที่ซ่อนอยู่ เพื่อกู้คืนภาษาของพวกเขา

ในฐานะตำรวจคุณต้องเขียนโค้ดสองตัวอย่าง:

  1. ภาษาที่ทำให้ภาษาของคุณใช้งานไม่ได้เป็นส่วนใหญ่เช่นโดยการลบฟังก์ชั่นในตัวสำหรับการรับอินพุต / เอาต์พุตและการดำเนินการเชิงตัวเลข ยิ่งคุณลบคุณสมบัติมากเท่าไหร่ก็ยิ่งดีเท่านั้น รหัสนี้ไม่ได้รับอนุญาตให้ผิดพลาดหรือออก มันควรจะเป็นไปได้ที่จะเพิ่มรหัสการสิ้นสุดของข้อมูลโค้ดนี้และรหัสที่จะได้รับการประเมิน และ...

  2. ... ตัวอย่างของรหัสที่ใช้จำนวนเต็มไม่เป็นลบสองตัวเป็นอินพุตเพิ่มเข้าด้วยกันและแสดงผลรวมของพวกเขา ตัวอย่างนี้จะต้องทำงานอย่างถูกต้องแม้หลังจากเรียกใช้ข้อมูลโค้ดแรกแล้ว เมื่อรวมข้อมูลโค้ดสองรายการเข้าด้วยกันพวกเขาจะต้องสร้างโปรแกรมเต็มรูปแบบที่เพิ่มตัวเลขสองตัวหรือกำหนดฟังก์ชั่นที่เพิ่มตัวเลขสองตัว ตามหลักแล้วตัวอย่างข้อมูลนี้ควรอาศัยพฤติกรรมที่คลุมเครือมากเพื่อให้ค้นหาได้ยากขึ้น

คุณสามารถเลือกวิธีการอินพุตและเอาต์พุตมาตรฐานได้ อย่างไรก็ตามคุณต้องเปิดเผยให้ชัดเจนว่าคุณใช้รูปแบบใด (อินพุตและเอาต์พุต) โจรไม่สามารถถอดรหัสคำตอบของคุณได้เว้นแต่พวกเขาจะใช้รูปแบบเดียวกับคุณ

หลังจากเขียนตัวอย่างโค้ดทั้งสองนี้แล้วคุณต้องโพสต์คำตอบแรกโดยไม่เปิดเผยตัวที่สอง คำตอบของคุณควรมีข้อมูลทั้งหมดต่อไปนี้:

  • แรกข้อมูลโค้ด (ไม่ชัดที่สอง)

  • ภาษา (รวมถึงรุ่นรองเนื่องจากการส่งส่วนใหญ่อาจขึ้นอยู่กับกรณีขอบแปลก ๆ )

  • รูปแบบ IO รวมถึงไม่ว่าจะเป็นฟังก์ชั่นหรือโปรแกรมเต็มรูปแบบ โจรต้องใช้รูปแบบเดียวกันเพื่อให้แคร็กของตนใช้งานได้

  • กรณีขอบแปลก ๆ ที่จำเป็นสำหรับคำตอบของคุณในการทำงาน ยกตัวอย่างเช่นทำงานบนลินุกซ์หรือต้องเชื่อมต่ออินเทอร์เน็ต เห็นได้ชัดว่านี่เป็นอัตนัยเล็กน้อย แต่ถ้าตำรวจมีคดีขอบบางอย่างที่ป้องกันไม่ให้มันร้าวแล้วเผยให้เห็นหลังจากที่ปลอดภัยแล้ว โจรที่อาจเกิดขึ้นควรมีข้อมูลทั้งหมดที่จำเป็นในการถอดรหัสคำตอบของคุณก่อนที่มันจะแตก

คุณไม่จำเป็นต้องเปิดเผยจำนวนไบต์จนกว่าคำตอบของคุณจะปลอดภัย

นี่คือตัวอย่าง สำหรับตัวอย่างแรกคุณสามารถส่งโปรแกรม Python 3 ต่อไปนี้:

Python 3

print=None

รับอินพุตจาก STDIN และเอาต์พุตไปยัง STDOUT

และในฐานะข้อมูลโค้ดที่สองของคุณคุณสามารถเขียน:

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

สิ่งนี้ถูกต้องเพราะมันจะใช้ตัวเลขสองตัวเป็นอินพุทและเอาท์พุทผลรวมของพวกมันแม้ว่าคุณจะรวมตัวอย่างสองอันเข้าด้วยกันเช่น

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

อย่างไรก็ตามนี่จะเป็นเรื่องง่ายมากที่โจรจะหาทางแก้ไข ตั้งแต่นี้จะแตกง่ายคุณสามารถพยายามแก้ไขวิธีนี้โดยเฉพาะเช่น:

import sys
sys.stdout=None
print=None

อย่างไรก็ตามแม้จะมีวิธีแก้ไขปัญหาที่ง่ายมาก:

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

ในฐานะตำรวจเป้าหมายของคุณคือการทำให้วิธีการแก้ปัญหาที่ซ่อนอยู่ชัดเจนที่สุดเพื่อป้องกันไม่ให้โจรค้นพบมัน

โจรจะมีลักษณะที่หนึ่งในคำตอบของคุณและพยายามที่จะแตกมัน พวกเขาอาจถอดรหัสโดยการเขียนตัวอย่างที่ถูกต้องใด ๆที่สามารถทำงานเป็นตัวอย่างที่ 2 (เพิ่มสองตัวเลขร่วมกันหลังจากที่ภาษาทำไม่ได้เป็นส่วนใหญ่) สิ่งนี้ไม่จำเป็นต้องเป็นข้อมูลโค้ดเดียวกับที่คุณตั้งใจไว้ หากโจรปล้นคำตอบของคุณพวกเขาจะแสดงความคิดเห็นในคำตอบของคุณและจากนั้นคุณควรแก้ไขเพื่อระบุว่าได้รับการถอดรหัส หากโพสต์ของคุณแตกคุณควรแก้ไขคำตอบของคุณเพื่อแสดงวิธีแก้ปัญหา (ตัวอย่างที่ 2) ที่คุณตั้งใจไว้ นี่ไม่ใช่กฎต่อ seเพียงแค่ข้อเสนอแนะที่เป็นมิตรเพื่อให้เกมสนุก คุณจะได้ไม่ต้อง.

หากคำตอบยังคงไม่ได้ทำการแยกตลอดทั้งสัปดาห์คุณสามารถแก้ไขในตัวอย่างที่สองของคุณและระบุว่าคำตอบของคุณปลอดภัยแล้ว หากคุณไม่แก้ไขหลังจากสิ้นสุดสัปดาห์ผู้ใช้รายอื่นยังสามารถถอดรหัสได้จนกว่าคุณจะทำ หากคุณไม่เปิดเผยตัวอย่างที่สองของคุณคุณไม่สามารถรับคะแนนสำหรับคำตอบของคุณหรือเรียกมันว่าปลอดภัย

ผู้ชนะของเธรดของตำรวจเป็นคำตอบที่สั้นที่สุดที่ปลอดภัยซึ่งรวมถึงตัวอย่างข้อมูลที่นับเป็นไบต์และคำตอบนี้จะได้รับการยอมรับหลังจากผ่านเวลาที่เพียงพอแล้ว คุณไม่จำเป็นต้องเปิดเผยจำนวนไบต์จนกว่าคำตอบของคุณจะปลอดภัยเนื่องจากการนับจำนวนนั้นไม่เกี่ยวข้องกับคะแนนของคุณจนกว่าคำตอบของคุณจะปลอดภัย ในกรณีที่เวลาผ่านไปนานและไม่มีคำตอบใดที่ยังไม่ได้ทำการปลดผู้ชนะจะเป็นคำตอบที่ยังไม่ได้ทำการแยกออกเป็นระยะเวลานานที่สุด

มีความสุข!

การชี้แจงกฎ

  • ข้อมูลครั้งแรกจะต้องทำงานอย่างถูกต้องโดยไม่ต้องสละป้อนข้อมูลใดมันอาจส่งออกสิ่งที่คุณต้องการและผลลัพธ์นี้จะถูกละเว้น - ตราบใดที่ข้อมูลโค้ดเสร็จสิ้นแล้วข้อมูลโค้ดที่สองจะทำงานอย่างถูกต้อง

  • ตัวอย่างที่สองจะต้องดำเนินการจริงเพื่อให้คำตอบของคุณถูกต้อง นี่หมายถึงคำตอบที่ชอบ

    import sys
    sys.exit()
    

    ไม่ถูกต้องเพราะมันไม่ทำลายภาษา มันหยุดทำงาน ในทำนองเดียวกันการป้อนลูปไม่สิ้นสุดไม่ถูกต้องเนื่องจากข้อมูลโค้ดที่สองจะไม่ถูกดำเนินการ

  • หลังจากเป็นที่ปลอดภัยคะแนนของคุณคือการนับไบต์ทั้งเกร็ดเล็กเกร็ดน้อย

  • นี้ไปกลับไปกรุณาเปิดเผยกรณีขอบแปลก ๆ ที่จำเป็นสำหรับคำตอบของคุณในการทำงาน ... การส่งของคุณจะต้องมีข้อมูลเพียงพอก่อนที่จะถูกเปิดเผยที่จะทำซ้ำหลังจากที่ถูกเปิดเผย ซึ่งหมายความว่าหากคำตอบของคุณปลอดภัยแล้วคุณแก้ไขใน: นี่คือคำตอบของฉัน อ๊ะ BTW ใช้งานได้ก็ต่อเมื่อคุณเรียกใช้บน Solaris แล้วพูดเล่น ๆ กับคุณ! คำตอบของคุณไม่ถูกต้องและจะถูกลบและไม่ถือว่ามีสิทธิ์ได้รับรางวัล

  • ตัวอย่างที่สองได้รับอนุญาตให้เกิดความผิดพลาดหลังจากส่งผลรวม - ตราบใดที่ผลลัพธ์ยังคงถูกต้อง (ตัวอย่างเช่นหากคุณเลือกที่จะส่งออกไปยัง STDERR และจากนั้นคุณจะได้รับข้อมูลความผิดพลาดจำนวนมาก

  • คุณไม่สามารถแก้ไขรหัสของคุณหลังจากส่งคำตอบ

  • คุณไม่สามารถพึ่งพาฟังก์ชันการเข้ารหัสเช่นการเข้ารหัส, ฟังก์ชันแฮช, CSPRNG เป็นต้น

ตัวอย่างเพื่อค้นหาการส่งที่ไม่ได้ติดตาม:


3
สิ่งที่ควรทำสำหรับภาษาเช่น C การต่อข้อมูลจะอนุญาตเพียงหนึ่ง "ข้อมูลโค้ดหลัก" และตรรกะใด ๆ ก็จะต้องไปที่นั่น เช่นถ้าฉันมีint main(){ do_evil_stuff(); }รหัสผู้ใช้ควรไปที่ไหน? ในฟังก์ชั่น? หลังจากงบทั้งหมดในmain?
Conor O'Brien

1
สามารถวางข้อมูลโค้ดที่สองที่ใดก็ได้ในตัวอย่างแรกหรือไม่
LegionMammal978

1
ฉันไม่รู้อะไรเลยเกี่ยวกับการเขียนโค้ด แต่ความท้าทายนี้ดูน่าทึ่งมาก
Pritt Balagopal

2
ผมแก้ไขได้ในข้อมูลโค้ดที่น่ากลัวของ jimmy23013 อย่าลังเลที่จะคืนค่า แต่ฉันใช้มันด้วยตัวเองเพื่อค้นหาสิ่งที่ส่งมาและคิดว่ามันอาจช่วยคนอื่นได้
Dom Hastings

2
@DomHastings นั่นเป็นประโยชน์อย่างมาก! ขอบคุณมาก :)
DJMcMayhem

คำตอบ:


2

Gforth 0.7.3 (TIO) , 231 ไบต์ [ปลอดภัย]

รหัสนี้นิยามใหม่ของวิธีการแสดงผลที่จำเป็นบางอย่างเช่นเดียวกับการเพิ่มและสิ่งที่สำคัญสำหรับการประกาศฟังก์ชั่น โชคดี!

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

อินพุตจะเป็นจำนวนเต็มสองลายเซ็นที่นำมาจากด้านบนของสแต็กเป็นพารามิเตอร์ฟังก์ชัน ส่งออกไปยัง STDOUT

ดังนั้นคุณควรแก้ไขความเสียหายที่เกิดขึ้นและกำหนดฟังก์ชั่นที่รับค่าสองค่าสูงสุดจากสแต็กและพิมพ์ผลลัพธ์เป็นจำนวนเต็ม (ไม่ใช่แบบลอย) ไปยัง STDOUT โดยไม่ต้องมีเอาต์พุตเพิ่มเติม

นี่เป็นแม่แบบfถ้าฟังก์ชั่นเป้าหมายของคุณคือการตั้งชื่อ

วิธีการแก้:

79 ไบต์

ฉันลบimmediateคำหลักออกจากตอนท้ายของการกำหนดค่าใหม่;ดังนั้นจึงจำเป็นสำหรับคำตอบที่จะรวมไว้ในตอนเริ่มต้น ฟังก์ชั่นที่ฉันกำหนดนั้นส่วนใหญ่เทียบเท่ากับคำจำกัดความภายในของ.แต่มันไม่ได้พิมพ์ช่องว่างในตอนท้ายและการเพิ่มจะดำเนินการก่อนโดยการย้ายตัวเลขไปยังสแต็กจุดลอยตัวและด้านหลัง

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

ลองออนไลน์


1
นี่เป็นคำตอบที่ดีมาก ในอัตรานี้ดูเหมือนว่าอาจเป็นคำตอบเดียวที่ไม่ได้ติดตาม!
DJMcMayhem

:) ฉันรวมอุปสรรคที่แตกต่างกันสองอย่าง เมื่อมาถึงจุดนี้ฉันสงสัยว่าฉันสามารถทำได้เพียงคนเดียวเพื่อให้คะแนนของฉันดีขึ้น แต่เป็นไปได้ว่าการมีมากกว่าหนึ่งเป็นสาเหตุที่ยังไม่ได้ทำการตรวจสอบ
mbomb007

21

Haskell คริสเตียน Sievers แตก

import Prelude(getLine,print)
a=a

โปรแกรมแบบเต็มอ่านจำนวนเต็มสองจำนวน (รวมถึงจำนวนลบ) จาก stdin และการเขียนไปยัง stdout

ฉันเพิ่งปิดใช้งานโหมโรงดังนั้นแทบจะไม่มีสิ่งใดที่อยู่ในขอบเขตแล้วจึงเพิ่มคำจำกัดความ การนำเข้าเพิ่มเติมไม่ถูกต้องทางไวยากรณ์ ฉันให้คุณgetLineและprintแม้ว่า


แก้ไขเพื่อเพิ่มโซลูชันดั้งเดิมของฉัน รอยแตกของคริสเตียนแตกต่างกัน แต่ใช้ประโยชน์จากคุณสมบัติพื้นฐานแบบเดียวกัน (คุณสามารถรับการคำนวณที่น่าประหลาดใจได้โดยการเข้าถึงฟังก์ชั่นที่มีน้ำตาลซินแทคติกแม้ว่าคุณจะไม่สามารถเรียกสิ่งใด ๆ ได้โดยตรง

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))

ซึ่งอาจไม่ได้เป็น super-golfed ต่อไป แต่ที่นี่มันอ่านง่ายขึ้น:

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)


17

Python 2 , แคร็ก

ใช้การเพิ่มเป็นฟังก์ชันที่มีชื่อ

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\

ลองออนไลน์!

สิ่งนี้ทำอะไร

สำหรับจุดประสงค์ในการช่วยเหลือคุณบ้างฉันจะอธิบายสิ่งนี้ รหัสนี้จะเปิดไฟล์ต้นฉบับและตรวจสอบว่าส่วนที่เหลือของรหัสตรงกับเกณฑ์ต่อไปนี้:

  • ไม่มีสตริง import
  • ทำขึ้นจากตัวละครเท่านั้น &)(,.:[]a`cdfijmonrt~

หากไม่เป็นไปตามเงื่อนไขขีด จำกัด การเรียกซ้ำจะถูกตั้งค่าเป็น1หมายความว่ารหัสใด ๆ ที่คุณเขียนจะกระทบขีด จำกัด การเรียกซ้ำ

ไม่มีกลอุบายที่นี่ฉันได้เขียนวิธีแก้ปัญหาที่ใช้เฉพาะตัวละครเหล่านี้และไม่มีการนำเข้าฉันไม่ได้ทำอะไรที่ถูกโค่นล้ม แต่ฉันจะบอกว่าฉันคิดว่ามันจะยากที่จะแตก

เพื่อช่วยคุณประหยัดเวลานี่คือรายการย่อของสิ่งที่มีประโยชน์ที่คุณไม่สามารถทำได้ด้วยข้อ จำกัด นี้

  • + เอ่อ

  • eval/ execจะไม่ปล่อยให้คุณหนีไปกับสิ่งนั้น

  • ตัวเลขพวกเขาอาจมีประโยชน์มากกว่าที่คุณคิด

  • สตริงตัวอักษร

  • len

  • =, ไม่มีการกำหนดตัวแปร

  • >, ,< ==. . ฉันไม่ได้เปรียบเทียบคุณ

  • *, -, /, %, ^, |, >>, << ผู้ประกอบการเท่านั้นที่มีอยู่~และ&

  • __foo__ไม่อนุญาตให้ใช้วิธีการขีดเส้นใต้คู่แฟนซี


1
ว้าวนี่มันชั่วร้ายทีเดียว ดี!
HyperNeutrino

คำตอบที่ยอดเยี่ยมในการเตะสิ่งต่าง ๆ ออกมา :)
DJMcMayhem

Hehe เพียงแค่นี้อาจได้รับแรงบันดาลใจจากความท้าทายกษัตริย์ที่ยอดเยี่ยมที่ฉันพยายามระบุในการแชทครั้งเดียว
Stephen

4
ฉันคิดว่านี่เป็นช่องโหว่ที่
HyperNeutrino

ตัวอย่างข้อมูลแรก: This code is not allowed to crash or exit.(ดูแชทเพื่อพูดคุยเรื่องนี้)
สตีเฟ่น

12

Python 2 , แคร็ก

นี่คือการวนซ้ำครั้งที่สี่ของคำตอบนี้ คำตอบสุดท้ายแต่ละคำตอบถูกถอดรหัสผ่านการตั้งค่าความลึกการเรียกซ้ำ

ใช้การเพิ่มเป็นฟังก์ชันที่มีชื่อ

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\

ลองออนไลน์!

สิ่งนี้ทำอะไร

สำหรับจุดประสงค์ในการช่วยเหลือคุณบ้างฉันจะอธิบายสิ่งนี้ รหัสนี้จะเปิดไฟล์ต้นฉบับและตรวจสอบว่าส่วนที่เหลือของรหัสจะทำเพียงตัวอักษร &)(,.:[]a`cdfijmonrt~

หากล้มเหลวขีด จำกัด การสอบถามซ้ำถูกตั้งค่าเป็น1หมายความว่ารหัสใด ๆ ที่คุณเขียนจะตีขีด จำกัด การสอบถามซ้ำ

ฉันได้ปิดการใช้งานโมดูลทั้งหมดดังนั้นคุณจึงไม่สามารถนำเข้าอะไรก็ได้

ไม่มีกลอุบายที่นี่ฉันได้เขียนวิธีแก้ปัญหาที่ใช้เฉพาะตัวละครเหล่านี้และไม่มีการนำเข้าฉันไม่ได้ทำอะไรที่ถูกโค่นล้ม แต่ฉันจะบอกว่าฉันคิดว่ามันจะยากที่จะแตก

เพื่อช่วยคุณประหยัดเวลานี่คือรายการย่อของสิ่งที่มีประโยชน์ที่คุณไม่สามารถทำได้ด้วยข้อ จำกัด นี้

  • + เอ่อ

  • eval/ execจะไม่ปล่อยให้คุณหนีไปกับสิ่งนั้น

  • ตัวเลขพวกเขาอาจมีประโยชน์มากกว่าที่คุณคิด

  • สตริงตัวอักษร

  • len

  • =, ไม่มีการกำหนดตัวแปร

  • >, ,< ==. . ฉันไม่ได้เปรียบเทียบคุณ

  • *, -, /, %, ^, |, >>, << ผู้ประกอบการเท่านั้นที่มีอยู่~และ&

  • __foo__ไม่อนุญาตให้ใช้วิธีการขีดเส้นใต้คู่แฟนซี

ทางออกของฉัน

ดังนั้นตอนนี้ที่ xnor ได้ถอดรหัสมันในแบบที่ฉันพอใจพอที่จะเปิดเผยทางออกของฉัน

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

เซอร์ไพร์สประหลาดใจเป็นกองที่พูดพล่อยๆ แทนที่จะทำลายมันลงฉันจะต้องทำตามวิธีการที่ฉันทำสิ่งนี้

ฉันเริ่มด้วยอัลกอริธึมการเพิ่มมาตรฐานที่ค่อนข้างสวย

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

จากนั้นผมใช้เคล็ดลับค่าที่เหมาะสมสำหรับการเป็นตัวแทน^กับ|, ,&~

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

ฉันใช้เคล็ดลับระดับบิตอื่นเพื่อกำจัด |

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

ตอนนี้สิ่งที่เหลืออยู่คือ<<ไม่ควรยากเกินไปใช่ไหม เตรียมตัวให้พร้อมสำหรับการขับขี่ที่เป็นหลุมเป็นบ่อ เพื่อแทนที่ bitshift ฉันใช้สตริงเพื่อผนวกศูนย์ถึงจุดสิ้นสุดของการเป็นตัวแทนไบนารีของมัน

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

ปัญหานี้มีปัญหาเล็กน้อย แต่ปัญหาหลักคือการเพิ่มนอกจากนี้ฉันจึงแก้ไขสิ่งนี้โดยใช้รูปแบบแทน

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

เราไม่ได้รับอนุญาตให้ใช้ bin ดังนั้นฉันใช้การจัดรูปแบบสตริงเพื่อแปลงเป็นไบนารี

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

เนื่องจากตัวอักษรสตริงเป็นสิ่งต้องห้ามฉันต้องสร้างสตริง{0:b}0จากชิ้นส่วนที่ทำด้วยเห็บหลังและjoinรวมเข้าด้วยกัน

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

สตริงที่ว่างเปล่านั้นค่อนข้างง่ายคุณสามารถทำได้

`r`[:0]

เลขศูนย์คือ

`0`

และ{:}ทั้งหมดถูกคว้ามาจากพจนานุกรม

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

bดูเหมือนจะยากที่จะได้รับมันไม่ได้อยู่ในชุดตัวละครของเราดังนั้นเราควรจะได้วัตถุที่มีbในนั้นreprอย่างไร เมื่อคุณใช้งานreprฟังก์ชั่นบิวด์อินคุณจะได้สิ่งที่ดูเหมือน

<built-in function name>

และ thats 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

ตอนนี้สิ่งที่เหลือคือตัวเลขฉันต้องการเพียง -1, 0, 1 และ 2 ดังนั้นนี่คือวิธีที่ฉันแสดง:

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

2 อาจสั้นลงจริง ๆ ตามไบต์

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

ตามคำแนะนำของ @ Blender ในความคิดเห็น แต่ฉันไม่ได้คิดเรื่องนี้จนกระทั่งหลังจากความจริง

ดังนั้นเราจึงแทนที่ตัวเลขเหล่านี้ใน

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

และนั่นคือรอยแตก


ตัวอย่างนี้ดูเหมือนว่าจะเกิดข้อผิดพลาดด้วยตัวเอง
ATaco

@ATaco ฉันเชื่อว่าสิ่งนี้ถูกกล่าวถึงในการแชทและได้มีการตัดสินใจแล้วว่ามันใช้ได้
ตัวช่วยสร้างข้าวสาลี

กฎจะระบุเป็นอย่างอื่นอย่างชัดเจน "รหัสนี้ไม่ได้รับอนุญาตให้ผิดพลาดหรือออก"
ATaco

@ ATaco นี่คือข้อความที่เขาบอกว่าเขาจะอัปเดตเมื่อเขามีโอกาส
ตัวช่วยสร้างข้าวสาลี


10

C (gcc) แตก!

#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
}

ลองออนไลน์!

อินพุตจาก STDIN และเอาต์พุตไปยัง STDOUT

สิ่งนี้จะทำงานโดยไม่มีข้อผิดพลาด ฮ่าฮ่าฮ่ามันค่อนข้างชั่วร้าย ฉันแค่ทดสอบมันใน gcc ของ TIO ตามปกติคุณต้องต่อท้ายโค้ดของคุณหลังจากตัวอย่างนี้เพื่อให้มันทำงานได้ :) ความคิดเห็นเป็นค่าเฉลี่ยอย่าฟัง

ทดสอบgcc (GCC) 6.3.1 20161221 (Red Hat 6.3.1-1)แล้ว ควรทำงานกับระบบ linux ใด ๆ

โซลูชันดั้งเดิม

#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);
}

@ LegionMammal978 อ่าใช่
Conor O'Brien

2
ระบุแพลตฟอร์มของคุณ!
Joshua

@Joshua ฉันได้เพิ่มข้อมูลบางอย่าง
Conor O'Brien


ดี__asm__และคุณมีความอุดมสมบูรณ์ของฟังก์ชั่นให้เลือก :) ไม่คิดว่า C และ C ++ เป็นศัตรูที่ดีที่นี่
edmz

9

Haskell , แตกโดยเบน

main=main--

ลองออนไลน์! นี่ควรเป็นโปรแกรมแบบสมบูรณ์ที่อ่านตัวเลขสองตัวจาก stdin และส่งออกผลรวมไปยัง stdout

แต่ละโปรแกรมเต็มรูปแบบเริ่มต้นด้วยการเรียกใช้mainฟังก์ชัน แต่ที่นี่mainเรียกตัวเองและทำให้เกิดวงไม่สิ้นสุด ในการทำให้เรื่องแย่ลงความคิดเห็นของบรรทัดจะเริ่มต้นด้วย--การเรียกซ้ำโดยตรงเพื่อป้องกันไม่ให้เปลี่ยนเช่นmain2และจากนั้นกำหนดว่าจะรวม


โซลูชันที่ตั้งใจไว้:

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

ลองออนไลน์!

--เริ่มความคิดเห็นของบรรทัดยกเว้นว่าสามารถแยกวิเคราะห์เป็นส่วนหนึ่งของโอเปอเรเตอร์ได้ (เน้นไวยากรณ์ดูเหมือนว่าจะตระหนักถึงความจริงนี้.) --$เป็นผู้ประกอบการมัดที่ถูกต้องซึ่งจะใช้เวลาเป็นอาร์กิวเมนต์แรกและบางอาร์กิวเมนต์ที่สองหุ่นmain ()จากนั้นจะถูกกำหนดเพื่อละเว้นอาร์กิวเมนต์ทั้งสองและเพื่อทำงานที่จำเป็นแทน


2
แคร็กมัน: codegolf.stackexchange.com/a/133244/17061
Ben

5
คุณสามารถเพิ่ม "โดยที่ main = ... "
michi7x7

+1 สำหรับโซลูชัน Haskell ที่ใช้งานได้เนื่องจากการประเมินที่ขี้เกียจของ Haskell เท่านั้น
จูลส์

9

C (GCC บน Linux) (แตก)

แทนที่จะใช้เทคนิคการอ่านแซนด์บ็อกซ์ไฟล์ที่ไร้สาระเราก็ทำมันด้วยวิธีที่เหมาะสม - ด้วยการขึ้นบัญชีขาวปลอดภัย SECCOMP!

งานของคุณ: ดำเนินการเพิ่มเติมด้วยอินพุตจาก STDIN และเอาต์พุตไปยัง 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!
}

ลองออนไลน์!

WTF คือสิ่งนี้!

เพื่อช่วยคุณในงานที่ผ่านไม่ได้ของคุณฉันจะอธิบายว่ารหัสนี้ทำอะไร

__attribute__ ((constructor(0)))ตรวจสอบให้แน่ใจว่าsมีการเรียกใช้ฟังก์ชันก่อน ฟังก์ชันปิดตัวอธิบายไฟล์ที่เปิดอยู่ทั้งหมดสำหรับ STDIN, STDOUT และ STDERR จากนั้นโปรแกรมจะ จำกัด ตัวเองด้วยรายการที่ปลอดภัย SECCOMP ที่เข้มงวดซึ่ง จำกัด การเรียกระบบของคุณต่อไปนี้

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

ดังนั้นคุณไม่สามารถเปิดไฟล์ใหม่ใด ๆ (หรือโดยทั่วไปจะทำอะไร) จากนั้นเรามาถึงหลักและเรียกรหัสของคุณห่ออย่างดีในsandboxฟังก์ชั่น

syscall(SYS_exit, EXIT_SUCCESS);ที่สิ้นสุดเป็นเพียงเพื่อให้แน่ใจว่าออกจากโปรแกรมที่เรียบร้อย - GCC โดยเริ่มต้นจะออกกับexit_group(2)ที่ไม่ได้รับอนุญาตจากรายการที่อนุญาต seccomp ฟังก์ชั่นที่ออกจากนี้ถูกเรียกใช้หลังจากที่โค้ดของคุณรัน

ดังนั้นคุณไม่มีตัวอธิบายไฟล์ที่เปิดอยู่และคุณไม่สามารถเปิดอะไรใหม่ได้ เป็นไปไม่ได้ใช่มั้ย ;)



8

x86 ประกอบโหมดจริง 16 บิต ( แตก )

_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

ง่ายถ้าคุณรู้เคล็ดลับ


1
คุณจะรับอินพุตอย่างไร บนสแต็กหรือในการลงทะเบียน? (นอกจากนี้ดูเหมือนว่าควรจะประกอบ 16 บิต แต่ถ้าเป็นเช่นor [bp], 256นั้นไม่ถูกต้องควรเป็นเช่นนั้นor WORD PTR [bp], 256)
Cody Gray

1
นอกจากนี้คุณควรระบุที่หน่วยประมวลผลที่คุณใช้; มีรุ่น x86 จำนวนมากและโคลนออกมีและคำแนะนำที่ไม่ได้กำหนดจำนวนมาก ถ้าฉันเขียนโค้ดสำหรับ "obscure 80186 clone" ที่เพิ่งเกิดขึ้นจะมีคำสั่งที่ไม่ได้กำหนดซึ่งมีข้อโต้แย้งเล็กน้อยและ blah blah blah ... เราอาจต้องการสภาพแวดล้อมด้วย Windows 16 บิตให้ SS == DS รับประกันว่าระบบอื่นอาจไม่ได้ตัวอย่างเช่น
Orion

1
คุณจะต้องระบุที่ประมวลผลถ้าคุณจริงจะใช้เคล็ดลับบางอย่างที่จะทำงานเฉพาะในรูปแบบหนึ่งโดยเฉพาะ (หรือรุ่นหนึ่งโดยเฉพาะ) รหัสนี้ไม่เป็นเช่นนั้นดังนั้นฉันคิดว่า "x86-16" ก็เพียงพอแล้ว ในความคิดของฉันยิ่งกว้างยิ่งดี ตกลงว่าควรระบุโหมดจริงหรือที่ได้รับการป้องกันแม้ว่าการมีอยู่ของhltคำสั่ง (แหวน 0) แสดงนัยอย่างยิ่งว่านี่ไม่ใช่โหมดที่ได้รับการป้องกัน
Cody Gray

3
@ โจชัวถ้ามันไม่ทำงานในทุกแพลตฟอร์มคุณต้องระบุอย่างน้อยแพลตฟอร์มที่จะใช้งานได้ฉันเชื่อว่า Your submission must contain enough information before being revealed to be reproducible after being revealed
Stephen

1
@ StepHen: วิธีแก้ปัญหา unbreak ภาษานั้นเป็นแพลตฟอร์มที่ไม่เชื่อเรื่องพระเจ้าเมื่อมีการระบุโหมดจริงของ x86-16 แต่ I / O ไม่ใช่แพลตฟอร์มที่ไม่เชื่อเรื่องพระเจ้า เขาที่แยกมันอาจระบุระบบปฏิบัติการที่เขาโพล่งออกมา ฉันเพิ่มป้ายกำกับ _main ล่าช้าเพื่อให้คนในทางทฤษฎีสามารถทำลายผู้ไม่เชื่อเรื่องพระเจ้าได้เกือบโดยการเชื่อมโยงกับ libc
Joshua

4

Javascript, แคร็ก

ความท้าทายนี้ต่อยอดจากGrant Davisแต่แก้ไขวิธีแก้ปัญหาที่เขามีในใจ (ซึ่งจะสร้าง iframe และใช้ iframe window) วิธีการแก้ปัญหาทำงานในคอนโซล javascript ของโครเมี่ยมabout:blank pageและใช้เวลาสองinput()วินาทีรวมเข้าด้วยกันและconsole.logผล ใส่รหัสของคุณหลังจาก:

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

ครั้งแรกที่เราบังคับpromptและและตั้งทางลัดconsole dจากนั้นเราจะสร้างผู้สังเกตการณ์การกลายพันธุ์ด้วยการเรียกกลับซึ่งจะลบเป้าหมายทั้งหมดที่กลายพันธุ์ เราตั้งค่าผู้สังเกตการณ์การกลายพันธุ์นั้นให้สังเกตเอกสารและแจ้งเตือนchildListและsubtreeแก้ไข แทนที่จะใช้ตัวอักษรtrueเราใช้ทางลัดของเรากับค่าความจริงdocument( สเป็คไม่อนุญาตให้ทำสิ่งนี้ แต่ใช้โครเมียม)

หลังจากที่ฉันโพสต์สิ่งนี้ฉันก็รู้ว่ามีคนทำหมวกสง่างามมากขึ้น โซลูชันที่ฉันตั้งใจยังใช้งานได้อยู่ แต่รอยแตกที่โพสต์ไม่ได้:

 h=document.querySelector("html");h.parentNode.removeChild(h);

ยินดีต้อนรับสู่เว็บไซต์! ฉันสนใจที่จะดูว่าทางแก้ปัญหาจะเป็นอย่างไร :)
DJMcMayhem


4

Perl 5 แตกโดย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__

การป้อนข้อมูลที่ได้รับในแต่ละบรรทัดของและเอาท์พุทถูกพิมพ์ไปSTDINSTDOUT

รหัสทั้งหมดตามหลัง__DATA__เครื่องหมาย วิธีนี้ใช้วิธีการที่คล้ายกับโซลูชันของ @ WheatWizard โดยที่โค้ดจะถูกวิเคราะห์และลบตัวอักษรที่ใช้ไม่ได้ออก

สิ่งนี้ได้รับการทดสอบในเวอร์ชัน 5.8, 5.10 และ 5.16 และไม่ต้องการแฟล็กบรรทัดคำสั่ง

ลองออนไลน์!


2
คุณกรุณาระบุวิธีการอินพุต / เอาต์พุตและรูปแบบได้หรือไม่?
Ilmari Karonen

@IlmariKaronen ขอโทษก็มีตัวอักษรในบรรทัดแยกกันและSTDIN STDOUTฉันจะเพิ่มสิ่งนี้ลงในเนื้อหาหลัก
Dom Hastings

แคร็กฉันคิดว่า
Ilmari Karonen

4

Python 3 ถอดรหัสโดย zbw

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

โมดูลทั้งหมดถูกลบซึ่งหมายความว่าไม่มีบิวอินอยู่และไม่สามารถทำได้อีกมาก เอาต์พุตไปยัง STDOUT อินพุตจาก STDIN นี่คือการทำซ้ำครั้งที่สองของคำตอบนี้หลังจากคำตอบก่อนหน้านี้ถูกทำลายโดยการถอดรหัสที่ไม่สำคัญโดยการเพิ่มคำสั่ง break


ฉันอยากรู้จริงๆว่าจะเห็นตัวอย่างข้อมูลที่ใช้งานได้หลังจากนี้
NickA

ทางที่ดีคุณต้องรอเจ็ดวันหรือแตกไม่น่ารำคาญใดมาก่อน ...
pppery


ดีดีความท้าทายเช่นนี้เป็นเรื่องยากมากที่จะทำดี
pppery

4

APL (ngn-apl)แตกโดยngn

ทำในความร่วมมือกับเพื่อนร่วมงานของฉันมาร์แชลล์

+การป้อนข้อมูลผ่านข้อโต้แย้งซ้ายและขวาเพื่อ นั่นคือเป้าหมายของคุณคือการแทรกรหัสหลังจากสิ่งต่อไปนี้เพื่อให้บรรทัดสุดท้ายของคุณอ่าน⎕←3+2และส่งออก5ไปยัง STDOUT

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

ลองออนไลน์!

ทำงานโดยการตั้งค่าฟังก์ชั่นที่มีประโยชน์ทั้งหมด{}ซึ่งรับหนึ่งหรือสองอาร์กิวเมนต์และส่งกลับรายการตัวเลขที่ว่างเปล่า ตั้งค่าให้เป็นเพียงการเขียนฟังก์ชั่น


ร้าว

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

⍺⍵1/0 ทำซ้ำ 0 โดยอาร์กิวเมนต์ซ้ายและอาร์กิวเมนต์ขวาและ 1

 รับดัชนีที่จะเรียงลำดับนั้น (เนื่องจากองค์ประกอบทั้งหมดเป็นศูนย์จะให้ 0 1 2 … (a + b)

⌈/ ค่าสูงสุด (a + b)


ngn / apl รวมถึงความสามารถในการเรียกใช้ JavaScript โดยพลการ ฉันไม่พิจารณาโซลูชันดังกล่าวที่ถูกต้องเนื่องจากจะเป็นการปิดใช้งาน JavaScript แทน APL มีวิธีที่ถูกต้อง (แม้ว่าจะคลุมเครือ) ในการรีเซ็ต+โดยใช้ APL ที่บริสุทธิ์เท่านั้นและไม่มีเทคนิคที่สกปรก
Adám

3

Python 2 , แคร็ก

นี่คือการทำซ้ำครั้งที่สองของคำตอบที่ได้รับการถอดรหัสหนึ่งครั้งโดย @HyperNuetrino โดยใช้วิธีที่ฉันไม่คาดคิด ตอนนี้ฉันได้ทำการปะแก้แล้วดังนั้นหวังว่าโซลูชันที่เหลือเพียงอย่างเดียวจะต้องปฏิบัติตามข้อ จำกัด ที่ฉันตั้งใจไว้

ใช้การเพิ่มเป็นฟังก์ชันที่มีชื่อ

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\

ลองออนไลน์!


ฉันคิดว่าฉันสามารถทำได้ถ้าฉันมีuแต่ฉันติดอยู่โดยไม่ได้
isaacg

@isaacg เพียงแค่อยากรู้อยากเห็นคุณจะทำuอะไรกับ
ตัวช่วยสร้างข้าวสาลี

.count. ฉันสามารถรับสายได้ตราบใดที่เอาท์พุทที่ต้องการ แต่ฉันไม่มีทางรับความยาวของมัน
isaacg

__import__('sys').setrecursionlimit(100)... และไม่มีอะไรได้รับการแก้ไข ฉันไม่รู้สึกเหมือนโพสต์ไว้ในเธรดของ robber แต่รู้สึกเหมือนโกง ลองออนไลน์
Value Ink


3

Java 8, ถอดรหัสโดย @ OlivierGrégoire

นี่คือความพยายามของฉัน ค่อนข้างเป็นความคิดที่จะเกิน namespaces ทั้งหมดที่คุณสามารถใช้ในการส่งออก (และฉันหวังว่าจะสะท้อน) เอาท์พุทมีวัตถุประสงค์เพื่อ 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{}
}

การขึ้นบัญชีดำนั้นเป็นวิธีที่เลวร้ายยิ่งกว่าบัญชีขาวดังนั้นฉันแน่ใจว่ามันเป็นเพียงเรื่องของเวลาก่อนที่จะมีคนเข้ามาใกล้ด้วยวิธีที่ฉันไม่ได้พิจารณา


1
นี่ไม่ใช่คลาสที่สามารถเรียกใช้งานได้ ...
Olivier Grégoire

1
@ OlivierGrégoireขออภัยที่ฉันเพิ่มclass String{}หลังจากการทดสอบโดยไม่ทราบว่ามันจะทำให้ล้มmain(String[] ...)ลง ตอนนี้ควรใช้งานแล้ว
Lord Farquaad

1
ใช่ว่าจะทำมันขอบคุณ! :) ไม่เปลี่ยนความแตกที่ฉันกำลังจะทำ แต่: p
Olivier Grégoire

1
แตก! ฉันมีความสุขอย่างนี้ :)
Olivier Grégoire

1
ฉันกำลังดูบางอย่างเช่นนี้ (ขออภัยมันยากที่จะจัดรูปแบบรหัสในความคิดเห็น) แต่ฉันคิดว่าวิธีการแก้ปัญหาของคุณสะอาดกว่านี้มาก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 แตกโดย Mayube

#|1,1:A

นี่ควรจะค่อนข้างง่าย แต่คุณไม่มีทางรู้

"ปัญหา" คือการที่ไม่มีCรหัสของคุณคุณได้รับข้อผิดพลาด

วิธีการแก้ปัญหาของ Mayube:

#|1,1:A+BC

แต่ละรายการในลำดับคืออินพุตแรกบวกครั้งที่สองที่สาม (aka 1)

โซลูชันของฉัน:

#1,1:A+B,C

รอบลำดับระหว่างอินพุตแรกบวกอินพุตที่สองและอินพุตที่สาม (1) A+Bรายการแรกในที่สองคือ

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

เช่นเดียวกับวิธีแก้ปัญหาของ Mayube - แทนการคูณB*Cเพียงแค่Cบวกแล้วลบออก

ลองออนไลน์!

คำอธิบาย

#|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

ขณะนี้โปรแกรมนี้เอาต์พุต1เนื่องจากไม่มีอินพุตผู้ใช้อินพุตแรกคืออินพุตแรก1ในอินพุตดีฟอลต์ ( #)


เอกสารดูเหมือนคำพูดอย่างเชื่องช้าจริงๆฉันไม่สามารถสำหรับชีวิตของฉันคิดออกว่ามันหมายความว่าเมื่อมันบอกว่าDefault 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 มันแปลกฉันต้องหาวิธีที่จะพูดอย่างถูกต้อง โดยทั่วไปอินพุตของคุณไปยังโปรแกรมสามารถเท่ากับอินพุตสูงสุดที่สอบถามโดยตัวแปรA,B,C,D,Eในโค้ด ตัวอย่างเช่นหาก ณ จุดใดก็ตามที่คุณมีตัวแปรDในโปรแกรมของคุณตัวแยกวิเคราะห์คาดว่าจะมี 4 อินพุต แต่หากยังมีEตัวแยกวิเคราะห์จะคาดว่าจะมี 5 อินพุต ต้องไม่น้อยกว่าจำนวนที่คาดหวัง อย่างไรก็ตามมีอินพุตสุดท้ายเป็นทางเลือกเสมอnซึ่งจะใช้ในรูปแบบที่แตกต่างกันโดยโหมดที่แตกต่างกัน
Stephen

@Mayube ส่วนย่อยที่ฉันโพสต์ด้านบนมี an Aจึงมองหาหนึ่งอินพุต เนื่องจากมีสองทั้งสองมาจาก#ที่ระบุป้อนข้อมูลเริ่มต้นจะใช้อย่างใดอย่างหนึ่งเป็นครั้งแรกที่A's nคุ้มค่าและเป็นคนที่สองเป็น
Stephen

ดังนั้นถ้าฉันจะให้ 2 อินพุตและผนวกBCA จะเป็นอินพุตแรก B จะเป็นครั้งที่สอง C จะเป็น 1 และ n จะเป็น 1 ที่สอง?
Skidsdev

@Mayube แน่นอนขออภัยสำหรับเอกสารเส็งเคร็งของฉัน TMI: ถ้าจุดเริ่มต้นดูเหมือน#1,1(ไม่มีแถบ) มันจะเป็น: A เป็น 1 แรก, B เป็น 1 สอง, C เป็นอินพุตแรกและ n เป็นอินพุทที่สอง คุณสามารถทำได้#1|1โดยที่ A คือ 1 แรก B คืออินพุตแรก C คืออินพุตที่สองและ n คืออันดับที่ 1
Stephen

3

Node.JS เวอร์ชั่น 7.3.0 (ถอดรหัสโดย 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)})();

วางบล็อกโค้ดที่สองหลังจากบล็อกแรก

ข้อจำกัดความรับผิดชอบ: การบล็อกโค้ดที่สองจะไม่สามารถทำงานได้ด้วยตัวเอง หากนี่ไม่ได้รับอนุญาต แต่ฉันสามารถแก้ไขตัวอย่างที่สองได้

นี่เป็นโปรแกรมเต็ม เอาต์พุตคือprocess.stdout(STDOUT) อินพุตคือprocess.argv(อาร์กิวเมนต์บรรทัดรับคำสั่ง)

นี่เป็นตำรวจและโจรคนแรกของฉันหวังว่านี่จะเป็นความท้าทายที่ดี :)

ลองออนไลน์!


ความท้าทายอธิบาย

สร้างตัวแปรสุ่มnจาก 0 ถึง 1e7 หากคุณเรียกการเขียนด้วยความถูกต้องnจะไม่พิมพ์อะไรเลย แต่ตั้งค่าlเป็น 0 ซึ่ง "ปลดล็อค" ฟังก์ชั่นการเขียนช่วยให้คุณสามารถพิมพ์อะไรก็ได้ หากคุณพยายามโทรหาการเขียนที่ไม่ใช่สตริงจะส่งคุณเข้าสู่วงวนไม่สิ้นสุด หากคุณพยายามโทรหา write ด้วยสิ่งอื่นนอกเหนือจากที่ถูกต้องnในขณะที่การเขียนคือ "ล็อค" ส่งคุณเข้าสู่วงวนไม่สิ้นสุดเพื่อป้องกันการเดา

ทางออกที่ตั้งใจไว้

แอบผ่านประเภทของที่ดูเหมือนว่าตรวจสอบสตริงเท่านั้นโดยใช้สัญลักษณ์ซึ่งเริ่มต้นด้วย s สิ่งนี้จะโยนข้อผิดพลาดในฟังก์ชั่นที่เป็นผลมาจากการเรียก eval เพราะคุณไม่สามารถเพิ่มสตริง "f" ลงในสัญลักษณ์ เราตรวจจับข้อผิดพลาดและใช้ regex เพื่อกู้คืนnจากการติดตามสแต็กซึ่งอยู่ในชื่อของฟังก์ชัน จากนั้นเราพยายามที่จะเขียนnสิ่งที่ไม่ได้พิมพ์อะไร แต่ตั้งค่าตัวแปร "ล็อค" lเป็น 0 เพื่อ "ปลดล็อค" ฟังก์ชั่นการเขียน ตอนนี้ฟังก์ชั่นการเขียนถูกปลดล็อคเราเพียงพิมพ์ผลรวม

try{f(Symbol())}catch(e){f(e.stack.match(/f(\d+)/)[1])
f(+p.argv[2]+ +p.argv[3]+"")}


อัจฉริยะนั่น ... ข้ามาถูกทางแล้วตอนแรก! ขอบคุณสำหรับการฝึกสมอง!
Dom Hastings

3

RProgN2 , Crackedโดยอาร์โนลพาลเมอร์

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

เขียนตัวดำเนินการทางคณิตศาสตร์ทั้งหมดโดยไม่มีวิธีกู้คืน โดยเฉพาะอย่างยิ่งมันจะแทนที่ด้วยฟังก์ชันที่ลบรายการสองอันดับแรกบนสแต็ก

ลองออนไลน์!

โซลูชันดั้งเดิม

{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.

ลองออนไลน์!


ฉันกำลังอ่านเอกสารของคุณและฉันไม่สามารถหาสิ่งที่เป็น²สัญลักษณ์ได้ สนใจที่จะสอนฉัน
Arnold Palmer

เอกสารนั้นไม่เกี่ยวข้องกับ RProgN2 อย่างไม่น่าเชื่อและสัญลักษณ์นั้นใช้สองแนวคิดถัดไป[[ในกรณีนี้และล้อมรอบด้วยฟังก์ชัน @ArnoldPalmer
ATaco


แดงนั้นดีกว่ามาก ฉันไม่รู้เกี่ยวกับตัวดำเนินการสแต็กซึ่งแน่นอนว่าจะมีประโยชน์ นอกจากนี้การรู้ว่า«»สร้างตัวแปรในท้องถิ่นเมื่อเทียบกับการทำให้ค่าทั่วโลกสับสนจะมีประโยชน์มาก
Arnold Palmer

3

Haskell, 161 144 ไบต์แตกโดยBlackCap

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

อินพุตไปยัง STDIN, ส่งออกไปยัง STDERR เพิ่มไปยังจุดสิ้นสุดของโปรแกรม

แก้ไข: ตั้งใจที่จะรวบรวมโดยไม่มีข้อโต้แย้ง GHC ghc --make prog.hsพิเศษเพียงปกติ

แก้ไขอีกครั้งเพื่อลดจำนวนไบต์

มีความสุข!


ดังนั้นฉันไม่สามารถทำเช่นนี้เพราะฟังก์ชั่นหลักจะไม่ถูกเรียก? main = do x <- readLn :: IO Integer; y <- readLn; print $ x + y
BlackCap

@BlackCap ไม่เนื่องจาก GHC คาดว่าmainฟังก์ชันจะอยู่ในโมดูลMainเมื่อไม่มีการระบุ-main-isค่าสถานะ
zbw

สิ่งนี้ใช้ไม่ได้ แต่ฉันต้องการแบ่งปันแนวคิดต่อไป
BlackCap

ฉันจะเรียกว่าแตก นี่คือทางออกที่ฉันตั้งใจไว้ ไม่ทำงานบน TIO เนื่องจากwrapperไม่ส่งอินพุตไปยังคอมไพเลอร์
zbw

หากคุณโพสต์โซลูชันของคุณฉันจะทำเครื่องหมายว่าแตก
zbw

3

Mascarponeแตกโดย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<^$

ข้อมูลที่ป้อนเป็นเลขคริสตจักรใน stdio ใช้iสำหรับการเพิ่มขึ้นและzเป็นศูนย์ ตัวอย่างเช่น 2 + 3 จะเป็น:

iiziiiz

ด้วยการขึ้นบรรทัดใหม่

เอาต์พุตควรเป็นตัวเลขใน stdout ในรูปแบบเดียวกับ stdio ตัวอย่างเช่นถ้าคำตอบคือห้าคุณควรส่งออก:

iiiiiz

(mascarpone ไม่มีแนวคิดของตัวเลข)


โซลูชันที่ตั้งใจไว้:

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

มันไม่ชัดเจนในทันทีจากเอกสาร แต่ในขณะที่ @IlmariKaronen ระบุไว้ในรอยแตกของเขาสตริงตัวอักษรใน Mascarpone เป็นน้ำตาลเชิงประโยคสำหรับการผลักดันลำดับของตัวละคร

ฉันตั้งใจเขียนความคิดเห็น[this]$เพื่อทำให้ดูเหมือนว่าฉันกำลังดันสตริงและ popping มันทันทีหลังจากนั้น แคร็กเกอร์ที่ไร้เดียงสาอาจลองทำบางสิ่งเช่น[:,>!]/*กดสตริงสลับกับล่ามและแปลความหมาย

ฉันยังแกล้งทำเป็น pop interpreter ที่ฉันทิ้งไว้ใน stack ด้วย$แต่$ถูกกำหนดใหม่เป็น NOP แล้ว คุณเหลือล่ามนี้ไว้ในกองซ้อนและคุณต้องพกมันติดตัวไว้ตลอดทั้งโปรแกรม รางแต่ละตัวละครของทุกสาย


แตกระแหง และไม่ฉันไม่เคยได้ยินมาสคาร์โปเน่มาก่อนความท้าทายนี้
Ilmari Karonen

@IlmariKaronen ภาษาโปรดใหม่ ๆ ? เยี่ยมมาก!
BlackCap

2

C # (.NET หลัก) CrackedโดยIlmari Karonen

นอกจากนี้ยังแตกโดยโจชัว

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

อ่านค่าสองค่าจาก stdin และเขียนผลลัพธ์ไปยัง stdout การทดสอบบน Windows ด้วย Framework รุ่น 3, 4.6 และTIO

นี่คือโปรแกรมเต็มรูปแบบที่ฉันตั้งใจไว้

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 });
        }
    }
}

ลองออนไลน์!



codegolf.stackexchange.com/a/133412/14306ฉันคิดว่านี่ไม่ใช่ทางออกที่ตั้งใจ
Joshua

@IlmariKaronen: +1 นี่คือทางออกที่ตั้งใจไว้
raznagul

@Joshua: +1 สำหรับการค้นหาโซลูชันที่แตกต่างจากที่ฉันตั้งใจไว้
raznagul

2

GolfScript , แตกโดยเดนนิส

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

ลองออนไลน์!

นี้เป็นท้าทายหลังจากทั้งหมดดังนั้นทำไมไม่ลอง GolfScript?

โซลูชันที่ถูกต้องควรเป็นข้อมูลโค้ดที่อ่านจำนวนเต็มสองจำนวนออกจากสแต็กรวมเข้าด้วยกันและส่งคืนผลลัพธ์บนสแต็ก จับได้ว่ามันควรจะยังคงทำงานได้แม้ว่ารหัสข้างต้นได้นิยามใหม่เกือบทั้งหมดของผู้ประกอบการ GolfScript ในตัวที่จะไม่ทำอะไรเลยอย่างเด็ดขาด อย่างน้อยฉันก็;ไม่แตะต้องดังนั้นคุณยังสามารถป๊อปอัพค่าปิดสแต็กได้ ;-) รหัสของคุณควรทำงานกับล่าม GolfScript มาตรฐานตามที่นำมาใช้เช่นใน TIO (ดูลิงค์ด้านบน)


วิธีแก้ปัญหาของเดนนิสเหมือนกับของฉันนั้นขึ้นอยู่กับคุณสมบัติที่ไม่ค่อยได้ใช้ของ GolfScript ที่อนุญาตให้ใช้โค้ดรูปแบบสอดแทรกในสตริงที่ยกมาสองครั้ง เราใช้คุณลักษณะนี้เพื่อกำหนดตัวดำเนินการเพิ่มใหม่ที่ทำงานเหมือนกับตัว+ดำเนินการในตัวจากนั้นเรียกมันว่า

(เหตุผลหนึ่งที่ทำไมคุณสมบัติการแก้ไขของ Ruby ใน GolfScript จึงไม่ค่อยถูกนำมาใช้คืออย่างแปลก ๆ รหัสทับทิมที่ถูกประมวลผลในระหว่างการแยกวิเคราะห์และเอาต์พุตของมันถูกแคชโดยล่าม GolfScript ดังนั้นถ้าคุณมีสตริงที่มีรหัสทับทิม ในลูปรหัสจะทำงานเพียงครั้งเดียวก่อนที่โปรแกรมจริงจะเริ่มต้นและหลังจากนั้นจะส่งคืนค่าเดิมทุกครั้งในการวนซ้ำคุณสามารถหลีกเลี่ยงการใช้สตริง evalเพื่อเลื่อนการแยกวิเคราะห์ได้ แต่นั่นทำให้ไวยากรณ์ที่น่าอึดอัดใจมากยิ่งขึ้น น่าเกลียดและ verbose และในกรณีใด ๆ สำหรับความท้าทายนี้ฉันปิดการใช้งานตัวดำเนินการ eval ~เช่นกันอย่างไรก็ตามปรากฎว่าการกำหนดผู้ประกอบการ GolfScript ในตัวใหม่ เป็นสิ่งหนึ่งที่คุณสมบัตินี้ใช้งานได้จริงอย่างดีและเรียบร้อย)



แตกระแหง ในที่สุดก็หาสิ่งที่ฉันทำผิด
Dennis

@Dennis: ใช่คุณตอกครั้งนี้ FWIW โซลูชันที่ฉันตั้งใจทำคือ"#{var'_','gpush a+b'.cc2}";_ซึ่งทำงานเหมือนกับคุณทุกประการยกเว้นว่าจะสั้นลงสักสองสามไบต์
Ilmari Karonen

2

Node.js v8.2.0 ถูกแคร็กโดย 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) )
                 );
}

คุณจะต้องใช้logicฟังก์ชั่น อินพุตคืออาร์กิวเมนต์ที่มีให้ (จาก stdin) เอาต์พุตคือสิ่งที่ฟังก์ชันของคุณส่งคืน (ถูกพิมพ์เป็น stdout)


คริสตจักรรหัสของฉันเข้ารหัสตัวเลขจากอินพุต ส่วนที่เหลือของรหัสอยู่ที่นั่นเพื่อข่มขู่คุณ
ฟังก์ชั่นระเบียบจะใช้กลอุบายเพื่อใช้สัญลักษณ์ที่ไม่มีจุด ( a . b == dot (a) (b)) ซึ่งฉันใช้เพื่อเพิ่ม. id .สถานที่แบบสุ่มซึ่งไม่ได้ทำอะไรเลย แต่จะทำให้ใคร ๆ
การแปลงนำไปใช้กับตัวเลขก่อนที่ฉันจะส่งผ่านไปยังlogicฟังก์ชันคือx+1และy-1ซึ่งเพิ่มขึ้นเป็น 0 ดังนั้นจึงเป็นอีก NOP เพื่อเพิ่มความสับสน

ทางออกที่ตั้งใจคือ:

logic = x => y => f => z => x (f) (y (f) (z))


@ DomHastings นั่นไม่ใช่ทางออกที่ตั้งใจ แต่ฉันจะบอกว่าคุณทำได้ตราบใดที่โปรแกรมหยุดโดยไม่มีข้อยกเว้นและไม่พิมพ์อักขระเพิ่มเติมไปยังผลลัพธ์
BlackCap

ฉันเพิ่งโพสต์ทางเลือก! (คุณสามารถดูคำตอบก่อนหน้านี้ของฉันในประวัติศาสตร์ของคำตอบนั้น!)
Dom Hastings

โอ้ว้าวข้าออกไปแล้ว ... ยังดีกว่าความพยายามครั้งแรกของข้า! ขอบคุณสำหรับปริศนา!
Dom Hastings

2

แจ้ง 7 , แคร็กโดย ppperry

For reading a command: rule fails.

[Your code here.]

การป้อนข้อมูลที่ควรจะพิมพ์โดยผู้เล่นในฐานะที่เป็นคำสั่งแบบโต้ตอบเช่นหรือadd 17 to 25 sum 17 25คุณมีอิสระที่จะเลือกรูปแบบที่แน่นอนของคำสั่งที่ควรป้อนตราบใดที่มันมีตัวเลขสองตัว 42ควรพิมพ์ผลรวมของตัวเลข (เช่น) ตามคำสั่ง

แน่นอนว่าสิ่งที่ท้าทายกำลังทำอยู่ในขณะที่กิจกรรม"อ่านคำสั่ง"ทั้งหมดถูกแทนที่ด้วยคำสั่งห้าม อาจมีหลายวิธีในการแก้ปัญหานี้ แต่อย่างน้อยก็ควรต้องมีความคุ้นเคยกับภาษา อันที่ฉันคิดขึ้นมานั้นง่ายมาก ๆ ถ้าไม่คาดคิด

ฉันได้ทดสอบวิธีแก้ปัญหาของฉันใน GNOME Inform 7 IDE เวอร์ชัน 6L38บน Ubuntu Linux โซลูชันที่ตั้งใจทำงานได้ทั้งบน Glulx และ Z-machine back-end และควรทำงานกับ Inform 7 รุ่นล่าสุดด้วย โปรดทราบว่า (โดยไม่มีการแก้ไขที่เหมาะสม) โค้ดด้านบนจะทำให้ล่ามยุ่งเมื่อพยายามอ่านคำสั่ง ล่าม Z-machine ดูเหมือนจะไม่ตอบสนองอย่างสมบูรณ์เมื่อเกิดเหตุการณ์นี้และไม่สามารถหยุดได้จากภายใน IDE ดังนั้นฉันแนะนำให้ใช้ Glulx สำหรับการทดสอบ


แตกและในกรณีที่คุณสงสัยฉันไม่เคยได้ยินแจ้งก่อนความท้าทายนี้
pppery

2

CPython 3 (อีกครั้ง) แตกโดย Sisyphus

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

คุณสามารถทำอะไรก็ได้ที่คุณต้องการ - ตราบใดที่มันไม่ได้ถูกนำไปใช้ใน C. ซึ่งหมายความว่าไม่ใช่printไม่input- สิ่งเหล่านั้นทั้งหมดจะเข้าสู่_(1)บรรทัดและยุติ อินพุตจาก STDIN พร้อมตัวเลขบนสองบรรทัดแยกกันเอาต์พุตไปยัง STDOUT ฉันสงสัยว่าจะใช้เวลานานเท่าไหร่ ... ใช้เวลาสักครู่เพื่อค้นหาตัวอย่างข้อมูลชิ้นที่สองหลังจากหาเคล็ดลับการปิดใช้งานนี้ ระบุ Cpython อย่างชัดเจนเพื่อหลีกเลี่ยงการถอดรหัสโดยไม่ใช้ sys.setprofile


แตกระแหง ฉันมีความคิดน้อยมากว่าทำไมสิ่งนี้ถึงได้ผล
Sisyphus

ผมคิดว่าผมสามารถถามตอนนี้ทำไมfunctools?
เดนนิส

@Dennis เพราะ sispyphus ค้นพบช่องโหว่ไม่ใช่วิธีแก้ปัญหาที่ตั้งใจ
pppery

@Sisyphus รอยแตกของคุณถูกรายงานว่าเป็นบั๊กในงูหลาม
pppery

2

Java 8 ( แคร็ก )

ความพยายามครั้งที่สอง ครั้งนี้ฉันลงทุนทดสอบสองนาที

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) {

    }

}

สิ่งที่ครอบคลุมมากที่สุดshouuuld


1
คุณช่วยกรุณาใส่สิ่งนี้ในชั้นเรียนด้วยการนำเข้าที่เหมาะสมหรือไม่ เป็นความท้าทายที่การเปลี่ยนแปลงเล็ก ๆ นี้สามารถสร้างหรือทำลายรายการ ฉันมีวิธีแก้ปัญหาหลายอย่างสำหรับสิ่งนี้ตามที่เป็นอยู่ แต่นั่นก็ลดลงอย่างมากถ้าคุณใส่มันไว้ในคลาส / ส่วนต่อประสาน นอกจากนี้รูปแบบที่จะลบทั้งหมดในขณะที่บรรทัดจะสวยดีสำหรับเราผู้อ่าน
Olivier Grégoire

มีคำตอบที่ถอดรหัสโดยใช้รหัสของคุณ และ +1 เพราะดูเหมือนว่าฉันจะลืมมัน ขอโทษ
Olivier Grégoire

การโทร #setAccessible (false) ไม่ทำอะไรเลย
Nevay

1

Python 2 แตก

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

ลองออนไลน์!

ฉันจะคำนำนี้โดยบอกว่าคำตอบนี้เป็นเพียงการเคลื่อนไหวกระตุกตั้งใจเป็นคำตอบที่ต่ำกว่า


แรงบันดาลใจจากคำตอบของWheat WizardและHyperNeutrino

ข้อมูลอ่านแฟ้มแหล่งที่มาและปฏิเสธที่จะดำเนินการต่อหากก้อนช่องว่างที่คั่นสุดท้ายของรหัสไม่ SHA256 e6400dd63733d10ec042e3c28033cfa85e1d25fbef80020810c354d7c942e843เข้า

แก้ไข : แก้ไขเล็กน้อยเพื่อตอบสนองต่อความคิดเห็นนี้ ปัญหาหลักไม่เปลี่ยนแปลงความพยายามในการถอดรหัสใด ๆ จะไม่ถูกยกเลิก


1
RE ตัวอย่างข้อมูล:This code is not allowed to crash or exit.
Stephen

สิ่งนี้ไม่ถูกต้องเนื่องจากมันออกแล้วซึ่งไม่ได้รับอนุญาตสำหรับตัวอย่างแรก
DJMcMayhem


1

Java 8 ถอดรหัสโดย@ OlivierGrégoire

ฉันพยายามทำให้มันยากที่สุด! :) และแตกต่างจากคำตอบ Java อื่น ๆ จนถึงคุณจะต้องปฏิบัติตามกฎที่แน่นอนของความท้าทายโดยวางไว้หลังจากตัวอย่างทั้งหมดนี้ (ดังนั้นไม่คุณไม่ใส่รหัสของคุณในpublic static void main(String[] args)วิธีการที่คุณใส่มัน หลังเลิกเรียนทั้งหมด :) ขอให้โชคดี!

ฉันได้เพิ่มความคิดเห็นเพื่อแสดงสิ่งที่ถูก จำกัด
( ได้รับแรงบันดาลใจจากโพสต์นี้ซึ่งมีข้อ จำกัด น้อยกว่าและเอาชนะได้ด้วยวิธีเดียวกันกับที่ฉันสามารถใช้สำหรับคำตอบของฉัน )

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:

ลองที่นี่ (ideone.com แทน TIO เนื่องจากดูเหมือนจะไม่ทำงานที่นั่น .. การทดสอบได้ทำใน Eclipse IDE แต่โซลูชันที่ฉันตั้งใจใช้งานได้ถ้าคุณใช้ ideone.com)



1

เยลลี่: แตก

นี่จะง่ายอย่างเมามันเมื่อเทียบกับคำตอบ Python ที่น่าประทับใจของ Wheat Wizard แต่ที่นี่เราจะไป: P

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

hexdigest SHA256 cfeb1e193ad77f66f039c0d6a792a3e4c311490f6412698e019ca1fae10c0e0aของการแก้ปัญหาวิธีแก้ปัญหาของฉันรวมทั้งตัวอย่างแรกคือ

บันทึก

คุณอาจไม่ได้ขึ้นบรรทัดใหม่ในรหัสยกเว้นสายอักขระมิฉะนั้นรหัสนี้จะไม่ถูกเรียกใช้ซึ่งเอาชนะวัตถุประสงค์ของการท้าทายนี้

ถูกแคร็กโดย DJMcMayhem

เพื่อความเป็นธรรมการดำเนินการนี้จะใช้การขึ้นบรรทัดใหม่ดังนั้นฉันจึงต้องการดูโซลูชันที่ไม่ใช้การขึ้นบรรทัดใหม่

ยังแก้ปัญหาโดย Jonathan Allan

สิ่งนี้ไม่ใช้การขึ้นบรรทัดใหม่ดังนั้นจึงมีการแตก : P

ทางออกของฉันคือ:

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

ตัวอย่างแรกลบเพียงอะตอมตัวเดียวซึ่งหมายความว่างูหลามยังคงใช้ได้ :)))


ตัวอย่างที่สองนั้นจะถูกผนวกเข้ากับส่วนท้ายของตัวอย่างแรกเสมอ
Stephen

@ StepHen เพียงระบุ: P แต่ฉันลืมที่จะเพิ่มบันทึก; นั่นสำคัญมาก
HyperNeutrino

3
ฉันไม่คิดว่าคุณสามารถ จำกัด โจรได้อย่างนั้น หากคุณสามารถถอดรหัสด้วย Newlines ได้นั่นคือการถอดรหัสที่ถูกต้อง อย่างไรก็ตามมีการป้องกันไม่ให้มีการเพิ่มบรรทัดใหม่หรือบังคับให้บรรทัดแรกรัน
DJMcMayhem


1
ฉันชอบรอยแตกที่คุณตั้งใจไว้ ส่อเสียดมาก
Dennis

1

JavaScript, แคร็ก

อินพุต: prompt()สองครั้ง

เอาท์พุท: console.log()

โซลูชันของฉันไม่ทำงานใน jsfiddle ทำงานบน about: blank page กับคอนโซล JS ของ Google chrome

prompt=console=0

ทางออกของฉัน:

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

คำอธิบาย:

ฉันลบพรอมต์และคอนโซลโดยตั้งค่าเป็น 0

ในโซลูชันของฉันฉันสร้าง iframe ซึ่งสร้างแซนด์บ็อกซ์และหน้าต่างใหม่ที่หน้าต่างแจ้งและคอนโซลทำงานอย่างถูกต้อง



@CRDrost ฉันไม่เชื่อว่ามีการทดสอบเบื้องต้นในสเปคและคุณไม่แสดงตัวอย่างทั้งสอง
Stephen

ขอโทษนะฉันเข้าใจผิด
CR Drost

1

ชวา แคร็ก

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

สิ่งนี้ควรจะแตกง่ายมาก

แนวทางแก้ไขปัญหา

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();}
  }
}

ลองออนไลน์



ฉันลืมไปjava.ioเลย .. แต่คุณก็มีวิธีแก้ปัญหาที่ตั้งใจไว้อยู่แล้ว ..
Roman Gräf

ฉันไม่เห็นปัญหาใด ๆ ที่นี่ ฉันเขียน snipet ตัวที่สองแค่ลืมแก้ไขมัน ตามTIO snipppet แรกรวบรวมโดยไม่มีการเตือนใด ๆ
Roman Gräf

@ OlivierGrégoireเสร็จสิ้น ฉันคิดว่า IDE ใด ๆ จะตะโกนใส่ฉันสำหรับเรื่องนี้ แต่อย่างน้อยฉันก็คอมไพเลอร์ยอมรับมัน ...
Roman Gräf
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.