การตรวจสอบ Woz


17

ท้าทาย

ฉันเพิ่งเข้าสู่คอมพิวเตอร์ 8 บิตและรู้สึกทึ่งกับผลงานของพวกเขาและคนอื่น ๆ ดังนั้นวัตถุประสงค์ของรหัสกอล์ฟนี้คือการทำซ้ำส่วนของ Woz Monitor ซึ่งออกแบบโดย Steve Wozniak สำหรับ Apple I

คุณจะต้องเก็บอาร์เรย์ของค่าเลขฐานสิบหก 22 ค่าที่มีความกว้างสองไบต์ (ค่าต่ำสุด$ 10 , ค่าสูงสุด$ FF ) จากนั้นใช้จำนวนn-จำนวนอินพุต (ปกติสองภาษาเช่น Brainfuck อาจมีช่วงเวลาที่ยากลำบาก)
อินพุตจะอ้างอิงตำแหน่งที่อยู่ในอาเรย์เพื่อเริ่มการพิมพ์จากและตำแหน่งที่จะหยุด อินพุตที่มีพฤติกรรมที่กำหนดจะมีค่าเริ่มต้นน้อยกว่าหรือเท่ากับค่าสิ้นสุด โปรแกรมของคุณจะต้องสามารถพิมพ์ค่าเลขฐานสิบหกทุกค่าระหว่างและรวมถึงเลขฐานสิบหกที่ป้อนเข้า

ตัวอย่างของสิ่งนี้:

Array
00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15

Values
FF F4 B6 D7 40 00 00 A4 F0 00 FF 0D 9C 21 65 C4 02 28 90 E7 D6 A5

input first num:
04
input second num:
14
40 00 00 A4 F0 00 FF 0D 9C 21 65 C4 02 28 90 E7 D6

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

กฎเท่านั้นคือ:

1.คุณต้องรวมค่าของเลขฐานสิบหก 22 ค่าเป็นส่วนหนึ่งของโปรแกรมของคุณก่อนที่จะเริ่มต้น (ไม่สามารถขออินพุตจากผู้ใช้)
2.ผลลัพธ์ของค่าเลขฐานสิบหกต้องเป็นไปตามรูปแบบที่แน่นอน: 00 FF 00 FF 00ช่องว่างต่อท้ายแท็บหรือบรรทัดเป็นปกติ ตัวละครไม่ได้
3.โปรแกรมไม่จำเป็นต้องขออินพุตด้วยข้อความ เว้น "ข้อความ" ว่างไว้หากคุณต้องการ ผู้ใช้จะต้องป้อนขอบเขตหกเหลี่ยมอย่างไรก็ตาม
4.เช่นเดียวกับค่าของเลขฐานสิบหก 22 ตัวที่ขึ้นอยู่กับคุณในการตัดสินใจคุณจะต้องสร้างโปรแกรมที่ดึงค่าจากหน่วยเก็บข้อมูลซึ่งตรงข้ามกับการเลียนแบบโปรแกรมโดยการพิมพ์ค่าเพียงอย่างเดียว (เช่นรายการ$ 00 )
5 อินพุตจำนวน nหมายถึงจำนวนอินพุตที่จำเป็นสำหรับภาษาที่คุณเลือกเพื่อให้รับรู้เลขฐานสิบหกที่มีความกว้างสองไบต์ เช่น. (Brainfuck จะต้องใช้สองอินพุตต่อฐานสิบหกทำให้เป็นสี่สำหรับสอง)

รู้สึกอิสระที่จะแสดงความคิดเห็นหากคุณต้องการชี้แจง

นี่คือรหัสกอล์ฟดังนั้นคำตอบที่สั้นที่สุดในจำนวนไบต์จึงเป็นผู้ชนะ

ลีดเดอร์บอร์ด

นี่คือการสร้างลีดเดอร์ข้อมูลโค้ดมารยาทของมาร์ตินเอนเดอร์

เพื่อให้แน่ใจว่าคำตอบของคุณปรากฏขึ้นโปรดเริ่มคำตอบด้วยหัวข้อโดยใช้เทมเพลต Markdown ต่อไปนี้:

# Language Name, N bytes

ที่Nมีขนาดของส่งของคุณ หากคุณปรับปรุงคะแนนของคุณคุณสามารถเก็บคะแนนเก่าไว้ในพาดหัวโดยการตีพวกเขาผ่าน ตัวอย่างเช่น

# Ruby, <s>104</s> <s>101</s> 96 bytes


เรากำลังขอให้ผู้ใช้ป้อนสองอินพุตหรือ n เราจะเลือกค่า hex ที่ 22 หรือไม่
xnor

ใช่ค่า 22 เป็นของคุณที่จะตัดสินใจ ค่าอินพุตพวกมันสามารถเป็นจำนวนเท่าใดก็ได้ ฉันพูดnเพราะ Brainfuck ไม่สามารถใช้สายอักขระ 2 ตัวได้คุณจะต้องใส่ไบต์แรกจากนั้นจึงเลือกที่สองสำหรับค่าแรกแล้วทำอีกครั้งสำหรับค่าที่สองซึ่งรวม 4 อินพุต พวกเขาสามารถเป็นได้มากเท่าที่คุณต้องการ
Finn Rayment

อย่างไรก็ตามด้วยค่าเหล่านี้คุณไม่สามารถมีทั้งหมดเป็น 00 และมีโปรแกรมเลียนแบบสิ่งที่จะอ่านอาร์เรย์ กำลังอัปเดตคำถาม
Finn Rayment

มันควรห่อหรืออ่านในสิ่งที่ตรงกันข้ามถ้าอินพุท 2 น้อยกว่าอินพุท 1?
Jonathan Allan

@JanathanAllan นั่นขึ้นอยู่กับคุณแล้ว เพียงจำให้แน่ใจว่าอินพุตที่ถูกต้องอาจทำให้โค้ดของคุณใหญ่ขึ้น ตามที่เขียนไว้เหนือกฎคุณสามารถอนุญาตรูปแบบการป้อนข้อมูลใด ๆ (ขึ้นอยู่กับคุณ) ซึ่งนำไปสู่พฤติกรรมหรือข้อผิดพลาดที่ไม่ได้กำหนดหากคุณต้องการ
Finn Rayment

คำตอบ:


4

เยลลี่ , 24 21 ไบต์

w@€ØHḅ⁴
ɠǵɠÇr@b⁴ịØHK

ค่าที่เลือก: [00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 1F 10 11 12 13 14 15]

TryItOnline

ถ้าอินพุทที่สองน้อยกว่าครั้งแรกมันจะออกลำดับที่กลับด้าน
พฤติกรรมนอกขอบเขตไม่ได้ถูกกำหนด (เช่น "foo", "14" ส่งกลับค่า 38 ค่าซึ่งส่วนใหญ่ไม่ได้อยู่ในอาเรย์และส่วนใหญ่ไม่ยาว 2)

อย่างไร?

w@€ØHḅ⁴ - Link 1, parse a string as a 1-based hex value e.g. "14"
w@€      - first index (1-based) of each character in
   ØH    - hex digits: "0123456789ABCDEF"                   [2,5]
     ḅ⁴ - convert from base 16                                 37

ɠǵɠÇr@b⁴ịØHK - Main link
ɠ  ɠ          - read a line from stdin               e.g. "04"  "14"
 Ç  Ç         - call the last link (1) as a monad          21    37
  µ           - monadic chain separation
     r@       - inclusive range, with reversed arguments  [   21,   22,...,   36,   37] 
       b⁴     - convert to base 16                        [[1,5],[1,6],...,[2,4],[2,5]]
         ị    - index into
          ØH  - hex digits: "0123456789ABCDEF"            [ "04", "05",..., "13", "14"]
            K - join with spaces

อ๊ะยกโทษให้ฉันด้วย คุณถูกต้องแน่นอน ทำได้ดีมากและมีตำแหน่งกระดานผู้นำอันดับ 1 :)
Finn Rayment

1
ใช่ฉันเพิ่งย้ายและเปลี่ยนค่าออฟเซ็ตเดียว (ตอนนี้1F) ซึ่งหมายความว่าฉันไม่จำเป็นต้อง "ตีความ" ให้ถูกต้องสำหรับการป้อนค่าเลขฐานสิบหกหรือเพิ่ม 16 เพื่อให้ตัวเลขฐานสิบหกสองค่าให้ฉันเพื่อแปลงกลับ
Jonathan Allan

4

JavaScript (ES6), 118 115 112 102 82 81 ไบต์

บันทึก 1 ไบต์ขอบคุณ ETHproductions

ค่าที่เลือก:

00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f 10 11 12 13 14 15
-----------------------------------------------------------------
10 10 11 14 10 10 15 15 11 14 10 10 15 15 11 14 10 10 15 15 10 11
  • พร้อมต์สำหรับขอบเขตล่างจากนั้นสำหรับขอบเขตบน (เช่น0x04/ 0x0f)
  • ขอบเขตล่างที่ไม่ถูกต้องจะถูกตีความว่าเป็น0x00(ค่าต่ำสุด)
  • ขอบเขตบนที่ไม่ถูกต้องจะถูกตีความว่าเป็น0x15(ค่าสูงสุด)
  • ไม่มีผลอะไรถ้าขอบเขตล่างมากกว่าขอบเขตบน

alert((1/7+'789').replace(/./g,(v,i)=>i<a|i>b?'':(v|10)+' ',p=prompt,b=p(a=p())))

รุ่นก่อนหน้า (97 ไบต์)

การสร้างรายการเลขฐานสิบหกเทียมแบบสุ่มของจริง:

alert((1/7+'789').replace(/./g,(v,i)=>i<a|i>b?'':(v*7|16).toString(16)+' ',p=prompt,a=p(),b=p()))

ลำดับ:

10 10 17 1c 1e 38 33 31 17 1c 1e 38 33 31 17 1c 1e 38 33 31 38 3f

"message": "Uncaught SyntaxError: เป้าหมายการมอบหมายงานการทำลายโครงสร้างไม่ถูกต้อง"
Finn Rayment

@frayment - นี่คือ Chrome ใช่มั้ย มันแปลกเพราะมันไม่บ่น[a,b]=prompt().split(' ')ในบรรทัดคำสั่ง อย่างไรก็ตามคำตอบที่อัปเดตของฉันควรแก้ไข
Arnauld

ทำได้ดี! ใช้งานได้ทันที นั่นเป็นเรื่องแปลกที่ Chrome ทำ ฉันทดสอบบนเครื่องทดสอบ JS ของคุณและในคอนโซลนักพัฒนาซอฟต์แวร์ของฉัน ข้อผิดพลาดเดียวกัน ยินดีต้อนรับสู่กระดานผู้นำ
Finn Rayment

คุณสามารถบันทึกบางไบต์ด้วยอินพุตเช่น0x04
Hedi

1
เพื่อนไม่มีอะไรผิดปกติกับทางเลือกของคุณมันทำงานได้ดีที่นี่และอยู่ในกฎ อัปเดตโพสต์ของคุณ! :)
Finn Rayment

3

JavaScript (ES6), 107 152 137 ไบต์

p=prompt,f=(a=+p(),b=+p(),[x,y,...s]='FFF4B6D7402011A4F0D0FF3D9C2165C4A22890E7D6A5')=>a?f(a-1,b-1,s):x+y+' '+(b?f(a,b-1,s):'');alert(f())

ค่าที่เลือก:

FF F4 B6 D7 40 20 11 A4 F0 D0 FF 3D 9C 21 65 C4 A2 28 90 E7 D6 A5

ปัจจัยการผลิต:

  • รูปแบบอินพุตคือ 0x14
  • หากอินพุตใด ๆ เป็นลบหรืออินพุตแรกมากกว่า 2: InternalError: too much recursion
  • จะพิมพ์NaNออกนอกขอบเขต

โซลูชันก่อนหน้า:
152 ไบต์:

i=parseInt,p=prompt,f=(a=i(p()),b=i(p()),[x,y,...s]='FFF4B6D7402011A4F0D0FF3D9C2165C4A22890E7D6A5')=>a?f(a-1,b-1,s):x+y+' '+(b?f(a,b-1,s):'');alert(f())

107 ไบต์วิธีแก้ปัญหาที่ไม่ถูกต้อง (ไม่มีอินพุต):

f=(a,b,[x,y,...s]='FFF4B6D7402011A4F0D0FF3D9C2165C4A22890E7D6A5')=>a?f(a-1,b-1,s):x+y+' '+(b?f(a,b-1,s):'')

1
ปิด! แต่คุณต้องสามารถขอให้ผู้ใช้ป้อนข้อมูล ฉันต้องการสิ่งที่คุณทำกับconsole.log(...)ว่า ;)
Finn Rayment

@frayment var และสุดท้าย;ไม่ใช่คำตอบ มันเป็นเพียงตัวอย่างเท่านั้นนั่นคือเหตุผลที่ฉันเพิ่ม linebreak ฉันจะแก้ไขคำตอบ
Hedi

@Hedi ที่ไม่ดีของฉันขอโทษด้วย
Finn Rayment

2

Python, 88 87 86 ไบต์

1 ไบต์บันทึกขอบคุณ @JonathanAllan
1 ไบต์บันทึกอีกครั้งไปยัง @JonathanAllan

เปลี่ยนฐานของรหัสมากขึ้นด้วย

a,b=[int(x,16)for x in raw_input().split()];l=[0]*22
while a<=b:print"%02x"%l[a],;a+=1

ค่าที่เลือก: 00สำหรับทุกสิ่ง

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

สิ่งนี้จะใช้ได้ทั้ง Python 2.x และ 3.x; โปรดแก้ไขฉันหากฉันผิดเพราะฉันไม่สามารถเข้าถึงล่ามทั้งสองได้เนื่องจากระบบของฉันไม่รองรับทั้งสองคน


2

C ++, 98 95 93 ไบต์

#include <iostream>
int _[22],a,b;int main(){for(std::cin>>a>>b;b/a++;)printf("%02x ",_[a]);}

ค่าที่ฉันเลือกคือ 0 ทั้งหมด


ยินดีต้อนรับสู่ Programming Puzzles & Code Golf! นี่เป็นคำตอบที่ดี แต่ฉันคิดว่ามันไม่ตรงกับความต้องการของความท้าทาย คุณจะคิดรวมถึงค่าเลขฐานสิบหก 22 ที่คุณเลือก?
ETHproductions

ใกล้ถึงแล้ว! ปัญหาเดียวคือเมื่อฉันป้อนค่า04และ06ฉันได้รับสองค่ากลับมา ฉันสงสัยว่าสิ่งเหล่านี้คือ05และ06คุณค่า คุณต้องระบุค่าทั้งหมดระหว่างและรวมถึงค่าที่ป้อนเข้า
Finn Rayment

1
@ ภาพวาดโอ้ถูกต้องแก้ไขมัน!
Fatih BAKIR

1

Perl, 79 45 41 ไบต์

"ค่าต่ำสุด $ 10" - ตัวอย่างมีค่าต่ำสุด $ 00 นั่นคือการพิมพ์ผิดหรือไม่

นี่เป็นคำตอบที่ค่อนข้างน่าเบื่อใน 41 ไบต์ (เป็น 46 และจากนั้นฉันก็ยังคงเห็นช่องว่าง รับอินพุตเป็นสองบรรทัด

printf'%02X ',$_ for(4..26)[hex<>..hex<>]

ข้อมูลเป็นรายการ 04..1A

ก่อนที่ฉันจะฉลาดเกินไปกับการแพ็ค & แกะ ไบต์อินพุตของมันจะถูกป้อนในครั้งเดียวด้วยกันเช่น "020E 'จะพิมพ์รายการที่ 2-14

printf'%02X ',$_ for sub{(4..26)[shift..shift]}->(unpack'CC',pack'H4',<>)

อาจลองเล่นกอล์ฟมากกว่านี้โดยใช้ 0 ทั้งหมดsubstrและprintf'%*vX'... ไม่เลยที่จะทำให้คำตอบของฉันยาว 48 ตัวอักษร (โดยใช้สตริง ascii '7', ฐานสิบหก 37 เป็นข้อมูล)

printf'%*vX',' ',substr 7x22,$s=hex<>,1+hex<>-$s

1

CJam, 22 ไบต์

{r:~Gb}2*37m!s2/\)<>S*

ค่าที่เลือก:

00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15
-----------------------------------------------------------------
13 76 37 53 09 12 26 34 50 46 31 59 79 58 15 80 90 24 00 00 00 00

ลองออนไลน์


1

สกาลา 45 ไบต์

(_:Int)to(_:Int)map(x=>f"$x%02X")mkString " "

Ungolfed:

(a:Int,b:Int)=>a.to(b).map(x=>f"$x%02X").mkString(" ")

ใช้00เพื่อFFเป็นค่า แต่ทำงานได้ถึง 2147483647


error: ')' expected but string literal found.เวลาa.to(b).map(
Finn Rayment

ไม่รู้ว่าเป็นแค่ฉันหรืออะไร : / ฉันควรลองใช้อะไร
Finn Rayment

@ ภาพวาดที่อาจเป็นเพราะการประมาณค่าสตริงซึ่งถูกนำมาใช้ใน Scala 2.10.0
corvus_192

คุณสร้างเวอร์ชั่นนี้ขึ้นมาในเวอร์ชั่นไหน? 2.9?
Finn Rayment

@ frayment ฉันใช้ 2.11.7 REPL
corvus_192

1

C, 176 175 161 ไบต์

1 ไบต์บันทึกขอบคุณ
@JonathanAllan ความช่วยเหลือจำนวนมากขอบคุณ @Downvoter สำหรับการบันทึกฉัน14ไบต์!

int main(){int a[44]={0};char s[2];scanf("%s",s);int b=(int)strtol(s,0,16);scanf("%s",s);int c=(int)strtol(s,0,16);while(b<=c){printf("%d%d ",a[b],a[b+1]);b++;}}

ลองออนไลน์!

ค่าที่เลือก: 00สำหรับทุกสิ่ง

คำตอบที่ไม่ตีกอล์ฟ:

int main() {
    int a[44] = {0};
    char s[2];
    scanf("%s", s);
    int b = (int) strtol(s, 0, 16);
    scanf("%s", s);
    int c = (int) strtol(s, 0, 16);
    while (b <= c) {
        printf("%d%d ", a[b], a[b+1]);
        b++;
    }
}

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

พวกเขาจะต้องอยู่ในลำดับที่ถูกต้องเนื่องจากการร้องขอค่าที่มากกว่าก่อนที่ค่าที่น้อยกว่าจะไม่เรียกใช้while-loop เลย

สิ่งนี้คือยังไม่มีการป้องกันบัฟเฟอร์มากเกินไปดังนั้นฉันสามารถขอสิ่งที่ไร้สาระเช่นช่วงจาก $ 0 ถึง $ FFFF และฉันจะได้รับทุกอย่างในหน่วยความจำคอมพิวเตอร์ของฉันจากจุดเริ่มต้นของการจัดสรรหน่วยความจำสำหรับa[44]อาร์เรย์ ไปจนถึง 65536 ค่าในภายหลัง


อักขระช่องว่างเดียวในรูปแบบอินพุตตรงกับช่องว่างใด ๆ ในสตรีมอินพุตแม้ว่ารูปแบบ scanf ส่วนใหญ่จะข้ามช่องว่างอย่างไรก็ตามการพูดที่ทำไมไม่ตัดชายกลางและใช้%xโดยตรง?
Neil

ทำไมไม่ใช้char s[2]แทนmallocสิ่งของ? การmallocส่งคืนค่าการหล่อไม่จำเป็นใน C
cadaniluk

@Neil หากคุณกำลังพูดถึงชิ้นprintf("%d%d ", ...)ส่วนด้วยการแทนที่การจัดรูปแบบด้วยการ%xคืนค่า0แทนที่จะส่งกลับมา00และไม่ต้องเว้นวรรค
Finn Rayment

@Downvoter ขอบคุณมาก! ฉันไม่คิดอย่างนั้น กำลังแก้ไขคำตอบทันที
Finn Rayment

scanfไม่ฉันยังคงพูดคุยเกี่ยวกับ
Neil

1

GNU sed, 209 + 1 (แฟล็ก r) = 210 ไบต์

1{h
s:.*:,00 FF,01 F4,02 B6,03 D7,04 40,05 00,06 00,07 A4,08 F0,09 00,0A FF,0B 0D,0C 9C,0D 21,0E 65,0F C4,10 02,11 28,12 90,13 E7,14 D6,15 A5:
H;d}
G;s:\n(.*)\n.*(,\1.*):\n\2:
s:(.*)\n(.*,\1 ..).*:\2:
s:,..::g

ลองออนไลน์! หนึ่งพื้นที่ชั้นนำมีอยู่ในผลลัพธ์ฉันหวังว่ามันจะได้รับอนุญาต

เรียกใช้ตัวอย่าง:

me@LCARS:/PPCG$ echo -e "06\n0F" | sed -rf table_lookup.sed
 00 A4 F0 00 FF 0D 9C 21 65 C4
me@LCARS:/PPCG$ echo -e "13\n13" | sed -rf table_lookup.sed
 E7

คำอธิบาย:ค่าเลขฐานสิบหก 22 ค่าที่เก็บไว้เหมือนกับค่าจากตัวอย่างของ OP

value | FF F4 B6 D7 40 00 00 A4 F0 00 FF 0D 9C 21 65 C4 02 28 90 E7 D6 A5
-------------------------------------------------------------------------
index | 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15

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

# store START index in hold space
1{h
# generate the table
s:.*:,INDEX1 VALUE1,INDEX2 VALUE2,°°°:
# append table to hold space and delete pattern space
H;d}
# read END index, append hold space (pattern space format is: END\nSTART\nTABLE)
G
# delete table entries up to, but excluding, the START index (END\nTABLE')
s:\n(.*)\n.*(,\1.*):\n\2:
# delete table entries starting from, but excluding, the END index (TABLE'')
s:(.*)\n(.*,\1 ..).*:\2:
# remove the indexes and print (implicitly) the resulting values
s:,..::g

1

PHP, 106 105 104 96 + 2 ไบต์

eval($s='for($a=a;$a++<c;)$$a=hexdec($argv[++$i]);while($b<=$c)printf("%02X ",ord($s[$b++]));');

หรือ

eval($s='for($a=a;$a++<c;)$$a=hexdec($argv[++$i]);');while($b<=$c)printf("%02X ",ord($s[$b++]));

ทำงานด้วยphp -nr '<code>' <lowindex> <highindex>; หลบหนีคำพูดเดียวในรหัส
... หรือทดสอบออนไลน์

dechex ตีความอินพุตเป็นสตริงเลขฐานสิบหกเท่าที่ตัวอักษรเป็นเลขฐานสิบหก
0ถ้าอินพุตเริ่มต้นด้วยอย่างอื่น

พิมพ์อะไรถ้าค่าแรกมีขนาดใหญ่กว่าที่สอง

ค่าที่เลือก:

00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f 10 11 12 13 14 15
-----------------------------------------------------------------
66 6F 72 28 24 61 3D 61 3B 24 61 2B 2B 3C 63 3B 29 24 24 61 3D 68

(รหัส ASCII 22 รหัสแรกของรหัสที่เรียกใช้)

หรือ

for($a=a;$a++<c;)eval($s='$$a=hexdec($argv[++$i]);');while($b<=$c)printf("%02X ",ord($s[$b++]));

ด้วยค่าเหล่านี้:

00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f 10 11 12 13 14 15
-----------------------------------------------------------------
24 24 61 3D 68 65 78 64 65 63 28 24 61 72 67 76 5B 2B 2B 24 69 5D 

คำตอบปกติรวม<?phpก้อนหรือไม่
Finn Rayment

@frayment -rไม่ได้ถ้าคุณใช้ <?และถ้าผมต้องเก็บไว้เป็นไฟล์ที่ผมใช้แท็กเปิดสั้น
ติตัส

ค่าคงที่a, zและProgramingPuzles_CGolfจะไม่ได้กำหนด ไม่อยู่ที่ไหนProgramingPuzles_CGolfมาจากหรือไม่? : /
Finn Rayment

@ ภาพวาดเหล่านี้เป็นประกาศ เปลี่ยนเส้นทางstderrไป/dev/nullถ้าคุณไม่ชอบพวกเขา PHP ประเมินค่าคงที่ที่ไม่ได้กำหนดกับสตริง
ติตัส

แต่ข้อผิดพลาดทางไวยากรณ์ของพวกเขามาฉันไม่สามารถเรียกใช้โปรแกรม
Finn Rayment

1

ชุดประกอบ Apple II 6502 ขนาด 75 ไบต์

รหัสไบต์:

A9 46 85 36 A9 10 85 37 A0 00 98 20 DA FD A9 A0 
20 ED FD C0 42 D0 F3 20 93 FE A2 FC 20 1B FD 9D 
04 01 E8 D0 F7 86 31 A9 8D 8D 04 02 20 A7 FF B5 
3C 0A 75 3C 95 3C CA 10 F6 A6 3D BD 05 02 20 ED 
FD E8 E4 3C D0 F5 99 05 02 C8 60

ถอดชิ้นส่วน:

  LDA    #<+
  STA    CSWL
  LDA    #>+
  STA    CSWH    ;redirect stdout
  LDY    #$00
- TYA
  JSR    PRBYTE  ;print number
  LDA    #$A0    ;space
  JSR    COUT    ;print space
  CPY    #$42    ;22*3
  BNE    -
  JSR    SETVID  ;restore stdout
  LDX    #$FC
- JSR    KEYIN   ;fetch a key
  STA    $0104,X ;store to $200+
  INX
  BNE    -       ;four keys
  STX    MODE    ;set internal flags
  LDA    #$8D
  STA    $0204   ;set key delimiter
  JSR    GETNUM  ;convert keys to hex values
- LDA    A1L,X   ;fetch value
  ASL
  ADC    A1L,X   ;multiply by 3
  STA    A1L,X   ;store value
  DEX
  BPL    -       ;both inputs
  LDX    A1H     ;first input
- LDA    $0205,X ;fetch from index
  JSR    COUT    ;print character
  INX
  CPX    A1L
  BNE    -       ;until second input
+ STA    $0205,Y ;fall through to save a byte
  INY
  RTS

มันเป็นอาร์เรย์ในหน่วยความจำที่ดูเหมือนว่าการส่งออก ค่าที่เลือกคือ:

00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f 10 11 12 13 14 15
-----------------------------------------------------------------
00 03 06 09 0C 0F 12 15 18 1B 1E 21 24 27 2A 2D 30 33 36 39 3C 3F

ผู้ใช้กดสี่ปุ่มเพื่อตั้งค่าอินพุต


Oooo ใช้รหัสของแอปเปิ้ล ทำได้ดีมาก
Finn Rayment
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.