ไม่สามารถอ่านได้ , 1830 1796 1791 1771 1762 1745 1736 1727 1626 1606 1577 ไบต์
เอาต์พุตอยู่ในลำดับตามตัวอักษรย้อนกลับ ( z
ถึงa
) แต่เป็นไปตามกฎของคุณที่อนุญาต
' '' '' ' ' '' '' '''' ' '"'' ''' "" ' '' '' '' '' ''' "" "" """ '' ''" " '"'" "" ' '' ''"' "" " ' '' '' '' '' '''" "" "" '' '' ' ' '' '' '''' " ' '''" " '' ' ' '' '' '''' ' '"'' '' "" "" "" "" "" '' '' ''"" '''"' "" "" '' '' ' ' '' '' '''' ' ' ''''" '' ' ' '' '' '' '''' '' '' '' ' ''' "" '"' "" " ' '' '' "'" "" ' ''' "" "" "" "" ''" ' '' '' '' ''"' "" ' ''' "" ' '' '' '' "' '' '' '' "" ''" " '' '' '' '' ' ' ''''" '"'"" "" "" ' '' '' '' ' ' '' ' ' '' '' '' '''' '' '' '''' '' '' ''' "" "" '' "" "" " ' '' '' '' ' '"'' '''" " ' '''" "" '' '' ''" " '' '' '' ' ' '''' "" ' ''' "" "" "" " ' '' '' '' ' '"'' '''" "" "" " ' '''" " ' '''""" ' '''" " ' '''" " ' '''" " ' '''" " ' '''" " ' '''" " ' '''" " ' '''"' "" ' ''' "" ' ''' "" ' ''' "" ' ''' "" '"' "" "" '' '' ' ' '' '' ''''" "" '"' "" " ' '' '' '' '''" "" "" "" ' ''' "" '"' "" " ' '' '''" "" "'"" "" "" "" " ' '' '' '' '''" "" "" " '"'" "" ' ''' "" "" """ " '' '' '' ' '' ' ' '''' ' ' '''' ' ' '''' ' ' '''' ' ' '''' ' ' '''' ' ' '''' " '"' "" ' ''' "" ' ''' "" ' ''' "" ' ''' "" ' ''' "" ' ''' "" ' ''' "" ' ''' ""' ''' "" ' ''' "" ' ''' "" ' ''' "" ' ''' "" ' ''' "" ' ''' "" ' ''' "" "" " ' '''" " ' '''" " ' '''" " ' '''" " ' '''" " ' '''" " ' '''" " ' '''"' "" ' ''' "" ' ''' "" ' ''' "" ' ''' "" ' ''' "" ' ''' "" ' ''' "" ' ''' "" '"" ' ''' "" ' ''' "" ' ''' "" ' ''' "" ' ''' "" ' ''' "" ' ''' "" "" "" "' "" ' ''' " ' ''"' "" '' '' ''" ' ''"' '' "" '' '' ' ' '' '' '' '''' ''" "" ' '' '' '' ''' "" " ' '' '' '' ' '"'' '''" "" " ' '' '' "'" "" " ''"" "" '"' "" "" '' ' ' '' '' '''' '' '' ' ' ''''" '' ' ' '' '' '' '''' "" "" "" ' ''' "" '' ' ' '''' ' ' '''' ' ' '''' ' ' '''' ' ' '''' " '"' "" ' ''' "" ' ''' "" ' ''' "" ' ''' "" ' ''' "" ' ''' "" ' ''' "" ' ''' ""' ''' "" ' ''' "" ' ''' "" ' ''' "" ' ''' "" ' ''' "" ' ''' "" ' ''' "" "" " ' '''" "" '' '' ' ' '' '' '''' '' '' ''"" '' ' ' '' '' '' '''' '' '' '' ' '' '' '' ''' "" "" '' '' '' '' ' ' '' '' '' '''' '' '' ''"" '' '' ''"" ' '' '' '' ''' "" "" "" "" ' '' '' '' ''' "" "" "" "" ' '' '' '' ''' "" "" "" "" ' '' '' '' ''' "" "" "" " ' '' ' ' '' ''"'' '''" "" '' '' ''" " "" " ' '' '''" "" "" " '"'" "" ' ''' "" "" "" " '"'" "" " '' '' ''" ''" '' "" '' ''"" '' '' '' ' ' '''' " '' """ ' '' '' '' "' '' '' ''" " ' '' '' '''" " '"'" "" ' ''' "" "" "" " ' '''"" '' """ '"' "" " ' '''" "" "" "" ' '''" " ''""" '"' "" " ' '''" "" "" "" ' '''" " ''"
คำอธิบาย
ก่อนอื่นเพื่อรับความประทับใจในสิ่งที่อ่านไม่ได้สามารถทำได้นี่คือการดำเนินการขั้นพื้นฐาน:
- คุณมีเทปจำนวนเต็มของเซลล์จำนวนเต็มที่ไม่มีขีด จำกัด
- คุณไม่มีตัวชี้หน่วยความจำเหมือนใน Brainfuck คุณทำการค้นหาเซลล์ซ้ำตามตำแหน่งของพวกเขาบนเทปแทน ซึ่งหมายความว่าคุณสามารถ“ อ่านค่า # 4” หรือ“ อ่านค่า # (อ่านค่า # 4)” (อ่านซ้ำสองครั้ง)
- คุณสามารถอ่านหรือเขียนเซลล์หน่วยความจำเท่านั้น (ไม่เพิ่ม / ลดโดยตรงเช่นเดียวกับใน Brainfuck)
- คุณสามารถเพิ่ม / ลดค่าภายในนิพจน์ ดังนั้นเพื่อเพิ่มเซลล์หน่วยความจำที่คุณต้องอ่าน , เพิ่มขึ้น , เขียน
write(x, inc(read(x)))
หรือแตกต่างกันใส่:
- มีในขณะที่ลูปและเงื่อนไขแบบสามมิติที่สามารถตรวจสอบได้เฉพาะกับศูนย์กับที่ไม่ใช่ศูนย์
โปรแกรมนี้ใช้เทปดังนี้ ชื่อตัวแปรจะถูกใช้ใน pseudocode ภายหลังด้านล่าง นอกจากนี้เอกสารฉบับแรก (ซึ่งเป็น 1830 ไบต์); ดูการแก้ไขที่ด้านล่างสำหรับสิ่งที่เปลี่ยนแปลงไปตั้งแต่
- เซลล์ 0:ตัวแปร
q
- มือถือ 1:ตัวแปร
a
, p
,ch
- มือถือ 2:ตัวแปร
hash
,v
- มือที่ 3:ตัวแปร
b
,r
- มือถือ 4:ตัวแปร
aa
,l
- เซลล์ 5:เหลือ 0 เพื่อทำเครื่องหมาย "สิ้นสุด" ของสตริงตัวเลขทศนิยม
- เซลล์ 6–95:จัดเก็บสตริงทศนิยมหลัง
- เซลล์ 96–121:เก็บจำนวนคะแนนที่จะถูกหักจากผู้ใช้
a
(96) ถึงz
(121) (รหัส ASCII ของจดหมายลบหนึ่ง)
- เซลล์ 4657–7380:จำได้ว่ามีการรวมกันของผู้มีสิทธิเลือกตั้ง / ผู้มีสิทธิเลือกตั้งจำนวนกี่ครั้ง เซลล์เหล่านี้มีค่าที่เป็นไปได้เพียง 4 ค่า:
0
= ยังไม่เห็น, -1
= เห็นหนึ่งครั้ง, -2
= เห็นสองครั้ง, -3
= เห็นจำนวนครั้งใด ๆ ที่มากกว่า 2
อัลกอริทึมเป็นหลักดำเนินการดังนี้
- ให้อ่านคู่ของตัวละครและ
a
b
คำนวณค่าแฮช(a-2)*(a-1)+b-1
ซึ่งเป็นค่าเฉพาะสำหรับการรวมกันของตัวอักษร a – z
- ตรวจสอบเซลล์หน่วยความจำด้วยค่าแฮช (
*hash
) ถ้าเป็นผู้ใช้ที่มีอยู่แล้วมีสิทธิ์ในการกำจัดการลงคะแนนเสียงเพื่อให้เพิ่มขึ้น-3
มิฉะนั้นพร่อง*(b-1)
*hash
ถ้าเป็นตอนนี้ -3
ผู้ใช้เพิ่งกลายเป็นมีสิทธิ์ลงคะแนนเสียงสำหรับการกำจัดหลังจากที่สามเกิดขึ้นดังนั้นการเพิ่มขึ้นโดย*(b-1)
3
- หลังจากนี้ไปถึงตัวละครในลำดับย้อนกลับ (
z
ไปa
) และส่งออกตัวละครที่ต้องได้รับคะแนนโหวตหัก ต้องมีการหารจำนวนเต็มด้วยตนเอง 10 เพื่อแปลตัวเลขเป็นเลขทศนิยม
ด้วยสิ่งที่ทำให้กระจ่างนี่คือสิ่งที่โปรแกรมดูเหมือนว่าเป็นรหัสเทียม:
// Read pairs of characters
while (a = read) + 1 {
b = read
// Calculate hash = (a-1)*(a-2)/2 + b-1
// This also sets a = b-1
hash = 0
while --a {
aa = a
while --aa {
++hash
}
}
while --b {
++a
++hash
}
// If this combination has just been seen for the third time,
// increment *a by 3; if more than third time, increment *a by 1
*a = (*hash + 3) ? ((--*hash) + 3 ? *a : (*a+3)) : (*a+1)
}
// Loop through the characters z to a
l = 27
while --l { // l loops from 26 to 1 (not 0)
(v = *(ch = l + 95)) ? { // 'a' is ASCII 97, but cell 96
print (ch+1) // print the votee
// Now we need to turn the number v into decimal.
// p points to where we are storing decimal digits.
p = 5
while v {
// Integer division by 10 (q=quotient, r=remainder)
r = (q = 0)
while v {
--v
(++r - 10) ? 1 : {
r = 0
++q
}
}
// Store digit ASCII character
*(++p) = r + 48 // 48 = '0'
v = q
}
// Now output all the digit ASCII characters in reverse order
while *p {
print *(--p + 1)
}
} : 1
}
แก้ไข 1, 1830 → 1796:ตระหนักว่าฉันสามารถใช้ค่าส่งคืนของลูป while อีกครั้งในที่เดียว
แก้ไข 2, 1796 → 1791:เปิดโปรแกรมให้เล็กลงเล็กน้อยถ้าแทนที่จะใช้เซลล์ 6–95 ฉันจะเก็บตัวเลขทศนิยมไว้ในเซลล์ติดลบ (–1 เป็นต้นไป) เป็นโบนัสที่เพิ่มเข้ามาโปรแกรมไม่ จำกัด เพียง10⁹⁰โหวต!
แก้ไข 3, 1791 → 1771:แทนการกำหนดผลลัพธ์ของ*(ch = l + 95)
ถึงv
ตอนนี้ฉันกำหนดให้q
และจากนั้นย้ายการมอบหมายv = q
ไปยังเงื่อนไขในขณะที่นำรหัสไปที่ 1777 ไบต์ จากนั้นสลับตำแหน่งของq
และv
บนเทปเพราะq
ตอนนี้เป็นเรื่องธรรมดามากกว่าv
1
แก้ไข 4, 1771 → 1762: Duh การเริ่มต้นhash
ที่ 1 แทน 0 จะมีความยาว 9 ไบต์ ตอนนี้รหัสแฮชเพิ่มอีก 1 รายการซึ่งไม่สำคัญ
แก้ไข 5, 1762 → 1745:ถ้าฉันเริ่มต้นq
และr
เป็น 1 แทน 0 ฉันต้องโรยบาง-1
ที่เพื่อให้ถูกต้องและดูเหมือนว่ามันจะถูกยกเลิก - ยกเว้นว่าwhile v { --v; [...] }
ตอนนี้ลูปจะต้องดำเนินการซ้ำหนึ่งครั้งน้อยลง ซึ่งฉันสามารถทำได้โดยการพูดwhile --v { [...] }
ซึ่งสั้นกว่า 26 ตัวอักษร
แก้ไข 6, 1745 → 1736:แทนที่จะเราสามารถเขียน{ r = 1; ++q }
q = *((r = 1)+1)+1
สิ่งนี้ขึ้นอยู่กับข้อเท็จจริงที่q
อยู่ในตัวแปรสล็อต # 2 หากอยู่ใน slot # 1 สิ่งนี้จะสั้นกว่านี้ แต่โปรแกรมทั้งหมดจะมีความยาวโดยรวมมากกว่า
แก้ไข 7, 1745 → 1727:ย้อนกลับแก้ไข 6 และแทนการประหยัดโดยการฝังอินทราสต์ในขณะที่วนเข้าสู่นิพจน์ที่คำนวณรหัส ASCII หลักซึ่งสิ้นสุดที่ 1736 ไบต์ ... แต่บันทึกคำสั่งลดลง (9 ไบต์) ) โดยการเปลี่ยนไป((++r) - 11) ? r :
(r - 10) ? ++r :
แก้ไข 8, 1727 → 1626:ทำการคำนวณแฮชทำใหม่ ตอนนี้ใช้น้อยลงหนึ่งขณะที่วนซ้ำ ตอนนี้ที่ตั้งของเซลล์นั้นอยู่ที่รหัส ASCII จริงของพวกเขา (ไม่ปิดอีก 1) ปรับเปลี่ยนตัวแปรไปยังตำแหน่งต่างๆบนเทปเนื่องจากตอนนี้เกิดขึ้นกับความถี่ที่แตกต่างกัน
แก้ไข 9, 1626 → 1606: การอินไลน์อย่างบ้าคลั่งมากขึ้น เนื้อความของแรกในขณะที่วนรอบตอนนี้มีลักษณะดังนี้:
// b = next char
*(b = (hash = read)) = {
// hash = b + (a-1)*(a-2)/2
while (a2 = --a) {
while --a2 {
++hash
}
}
// If this combination has just been seen for the third time,
// increment *b by 3; if more than third time, increment *b by 1
(*hash + 3) ? ((--*hash) + 3 ? *b : (*b+3)) : (*b+1)
}
และการมอบหมายตัวแปรเปลี่ยนแปลงเกือบทั้งหมดแล้ว
แก้ไข 10 1606 → 1577:ผมสังเกตว่าa
และa2
มีทั้ง decremented 0 ในขณะที่ลูปดังนั้นถ้าฉันจะจับคู่p
กับทั้งของเหล่านั้น แต่ไม่ได้กับch
ผมจะไม่จำเป็นต้องเริ่มต้นp
ที่จะ0
(ซึ่งค่าใช้จ่าย 29 bytes) เปิดออกฉันจะทำโดยการแลกเปลี่ยนและp
r
การกำหนดตัวแปรใหม่ล่าสุด (และความถี่ของการเกิดขึ้นในโค้ด) คือ:
0 = v (3) (total 3)
1 = hash (6), r (5), ch (2) (total 13)
2 = b (4), q (5) (total 9)
3 = a (3), p (5) (total 8)
4 = a2 (3), l (4) (total 7)
nanananananananabatman
กรณีทดสอบ