Monitor Woz

17

Tantangan

Saya baru saja masuk ke komputer 8-bit dan terpesona dengan cara kerja mereka dan orang lain yang sama; dengan demikian tujuan golf kode ini, adalah untuk mereplikasi sebagian dari Woz Monitor, yang dirancang oleh Steve Wozniak untuk Apple I.

Anda harus menyimpan larik 22 nilai heksadesimal dengan lebar dua byte, (nilai min $ 10 , nilai maks $ FF ), dan kemudian menerima n- jumlah input. (Biasanya dua; bahasa seperti Brainfuck mungkin mengalami kesulitan).
Input akan merujuk ke mana dalam array untuk memulai pencetakan, dan ke mana harus berhenti; input dengan perilaku yang ditentukan akan memiliki nilai awal kurang atau sama dengan nilai akhir. Program Anda kemudian harus mampu mencetak setiap nilai heksadesimal antara, dan termasuk , heksadesimal yang dimasukkan.

Contoh dari ini:

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

Sekarang bagian yang menarik dari latihan ini, adalah Anda dapat menggunakan apa pun yang Anda inginkan untuk memeriksa batasan input pengguna. Masukan orang hellodan program Anda memiliki perilaku yang tidak jelas? Itu berhenti tanpa pemberitahuan? Keduanya valid.

Satu-satunya aturan adalah:

1. Anda harus memasukkan nilai 22 nilai heksadesimal sebagai bagian dari program Anda sebelum dimulai, (tidak dapat meminta input dari pengguna).
2. Output dari nilai heksadesimal harus mengikuti format yang tepat: 00 FF 00 FF 00Trailing spasi, tab atau garis OK. Karakter tidak.
3. Program tidak perlu meminta input dengan pesan. Biarkan "pesan" kosong jika Anda mau. Pengguna harus memasukkan hex-bounds.
4. Karena nilai-nilai dari 22 hexadecimal terserah Anda untuk memutuskan, Anda harus membuat program yang benar-benar mengambil nilai-nilai dari penyimpanan, berlawanan dengan meniru program dengan hanya mencetak nilai. (seperti daftar $ 00 ).
5. n-jumlah input, mengacu pada jumlah input yang diperlukan untuk bahasa pilihan Anda untuk mengenali heksadesimal dua byte-lebar. misalnya. (Brainfuck akan membutuhkan dua input per hex, membuatnya menjadi empat untuk keduanya).

Jangan ragu untuk berkomentar jika Anda membutuhkan klarifikasi.

Ini adalah kode golf, jadi jawaban tersingkat dalam jumlah byte adalah pemenangnya.

Papan peringkat

Berikut ini adalah papan peringkat yang menghasilkan milik Martin Ender .

Untuk memastikan bahwa jawaban Anda muncul, silakan mulai jawaban Anda dengan tajuk utama, menggunakan templat Penurunan harga berikut:

# Language Name, N bytes

di mana Nukuran kiriman Anda. Jika Anda meningkatkan skor Anda, Anda dapat menyimpan skor lama di headline, dengan mencoretnya. Contohnya:

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

Finn Rayment
sumber
Apakah kita meminta dua input atau n kepada pengguna? Apakah kita memilih 22 nilai hex?
xnor
Ya, 22 nilai adalah milik Anda untuk memutuskan. Nilai input, mereka dapat berapa pun jumlahnya. Saya katakan nkarena Brainfuck tidak dapat mengambil string 2 karakter, Anda harus memasukkan byte pertama, kemudian yang kedua untuk nilai pertama, dan kemudian melakukannya lagi untuk nilai kedua, total 4 input. Namun mereka bisa sebanyak yang Anda suka.
Finn Rayment
Namun dengan nilai-nilai, Anda tidak bisa hanya memiliki semuanya sebagai 00, dan memiliki program meniru apa yang akan benar-benar membaca array. Memperbarui pertanyaan.
Finn Rayment
Haruskah membungkus atau membaca secara terbalik jika input 2 kurang dari input 1?
Jonathan Allan
@ JonathanAllan Itu sepenuhnya terserah Anda. Ingat saja, memastikan input yang benar dapat membuat kode Anda lebih besar. Seperti yang ditulis tepat di atas aturan, Anda dapat mengizinkan segala bentuk input (terserah Anda), yang mengarah ke perilaku atau kesalahan yang tidak ditentukan jika Anda mau.
Finn Rayment

Jawaban:

4

Jelly , 24 21 byte

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

Nilai yang dipilih: [00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 1F 10 11 12 13 14 15]

TryItOnline

Jika input kedua kurang dari yang pertama akan menghasilkan urutan terbalik.
Perilaku di luar batas tidak terdefinisi (mis. "Foo", "14" mengembalikan nilai 38, yang sebagian besar bahkan tidak dalam array dan banyak yang tidak panjang 2)

Bagaimana?

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
Jonathan Allan
sumber
Ah, maafkan saya. Anda memang benar. Dilakukan dengan baik, dan memiliki posisi papan peringkat # 1. :)
Finn Rayment
1
ya, saya baru saja pindah dan mengubah satu nilai offset (sekarang 1F), artinya saya tidak perlu "dengan benar" menginterpretasikan input hex atau menambahkan 16 untuk memberi saya dua digit hex untuk mengkonversi kembali.
Jonathan Allan
4

JavaScript (ES6), 118 115 112 102 82 81 byte

Disimpan 1 byte berkat produk ETH

Nilai yang dipilih:

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
  • Anjuran untuk batas bawah, lalu untuk batas atas (misalnya 0x04/ 0x0f).
  • Batas bawah yang tidak valid akan ditafsirkan sebagai 0x00(nilai minimum).
  • Batas atas yang tidak valid akan ditafsirkan sebagai 0x15(nilai maksimum).
  • Tidak menghasilkan apa-apa jika batas bawah lebih besar dari batas atas.

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

Versi sebelumnya (97 byte)

Menghasilkan daftar pseudo-acak dari nilai-nilai heksadesimal 'benar':

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

Urutan:

10 10 17 1c 1e 38 33 31 17 1c 1e 38 33 31 17 1c 1e 38 33 31 38 3f
Arnauld
sumber
"message": "Uncaught SyntaxError: Sasaran penugasan penghancuran tidak valid"
Finn Rayment
@ pelebaran - Ini Chrome, kan? Itu aneh karena tidak mengeluh tentang [a,b]=prompt().split(' ')di baris perintah. Bagaimanapun, jawaban saya yang diperbarui harus memperbaikinya.
Arnauld
Sudah selesai dilakukan dengan baik! Bekerja sekarang. Itu aneh bahwa Chrome melakukannya. Saya mengujinya pada tester JS Anda, dan di konsol Pengembang saya. Kesalahan yang sama. Selamat datang di papan peringkat.
Finn Rayment
Anda dapat menyimpan beberapa byte dengan input seperti 0x04
Hedi
1
Kawan, tidak ada yang salah dengan pengganti Anda, itu berfungsi dengan baik di sini dan berada dalam aturan. Perbarui posting Anda! :)
Finn Rayment
3

JavaScript (ES6), 107 152 137 byte

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

Nilai yang dipilih:

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

Input:

  • Format input adalah 0x14
  • Jika ada input negatif atau input pertama lebih besar dari input kedua: InternalError: too much recursion
  • Akan dicetak di NaNluar batas.

Solusi sebelumnya:
152 byte:

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 byte, solusi tidak valid (input tidak ada):

f=(a,b,[x,y,...s]='FFF4B6D7402011A4F0D0FF3D9C2165C4A22890E7D6A5')=>a?f(a-1,b-1,s):x+y+' '+(b?f(a,b-1,s):'')
Hedi
sumber
1
Menutup! Tetapi Anda harus dapat meminta input dari pengguna. Saya suka dengan apa yang Anda lakukan console.log(...). ;)
Finn Rayment
@ pelebaran var dan yang terakhir ;bukan bagian dari jawabannya. Ini hanya untuk cuplikan, itu sebabnya saya menambahkan linebreak. Saya akan mengedit jawabannya.
Hedi
@Hedi burukku, maaf soal itu.
Finn Rayment
2

Python, 88 87 86 byte

1 byte simpan berkat @JonathanAllan
1 byte simpan lagi ke @JonathanAllan

Juga mengubah basis kode, jauh lebih baik sekarang.

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

Nilai yang dipilih: 00untuk semuanya.

Ide yang sama dengan jawaban C saya. Namun kali ini, kode mengambil input tunggal dari pengguna, membutuhkan ruang antara kedua nilai, membaginya, melemparkannya ke nilai hex, dan mencetak setiap hex dalam larray termasuk dan antara dua nilai yang diinput. Karena Python memiliki sistem penangkap kesalahan yang luar biasa, tidak ada buffer overflows yang hadir dan karena itu kodenya jauh lebih aman. Program ini aman dari perilaku yang tidak terdefinisi dalam arti bahwa ia tidak akan dieksekusi ketika nilai yang lebih tinggi diajukan sebelum nilai yang lebih rendah.

Ini harus bekerja pada kedua Python 2.x dan 3.x; Harap perbaiki saya jika saya salah, karena saya tidak memiliki akses ke kedua penerjemah karena sistem saya tidak mendukung keduanya.

Finn Rayment
sumber
2

C ++, 98 95 93 byte

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

Nilai yang saya pilih semuanya 0

Fatih BAKIR
sumber
Selamat Datang di Programming Puzzles & Code Golf! Ini adalah jawaban yang bagus, tapi saya pikir itu tidak memenuhi persyaratan tantangan. Maukah Anda memasukkan 22 nilai heksadesimal yang Anda pilih?
ETHproduk
Hampir sampai! Satu-satunya masalah adalah, ketika saya memasukkan nilai 04dan 06, saya hanya mendapatkan dua nilai kembali. Saya curiga ini adalah 05dan 06nilai - nilai. Anda harus memberikan semua nilai antara dan termasuk nilai yang dimasukkan.
Finn Rayment
1
@ perbaikan, oh itu benar, perbaiki!
Fatih BAKIR
1

Perl, 79 45 41 byte

"nilai min $ 10" - contohnya memiliki minimum $ 00- apakah itu kesalahan ketik?

Inilah jawaban perl yang agak membosankan dalam 41 byte (Apakah 46 dan kemudian saya terus melihat spasi, parens aku bisa kawin lari). Mengambil input dalam dua baris.

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

Data adalah daftar 04..1A

Sebelumnya saya terlalu pintar dengan paket & membongkar. Byte inputnya dimasukkan sekaligus dihancurkan bersama, misalnya "020E 'akan mencetak entri ke-14

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

Mungkin akan mencoba bermain golf lebih banyak menggunakan semua 0 substr,, dan printf'%*vX'... tidak yang membuat jawaban saya lebih lama. 48 karakter (menggunakan string ascii '7', hex 37 sebagai data)

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

CJam, 22 byte

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

Nilai yang dipilih:

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

Cobalah online

Neorej
sumber
1

Scala, 45 byte

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

Tidak Disatukan:

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

Penggunaan 00untuk FFsebagai nilai-nilai, tetapi karya-karya hingga 2147483647.

corvus_192
sumber
error: ')' expected but string literal found.ata.to(b).map(
Finn Rayment
Tidak tahu apakah ini hanya saya atau apa. : / Apa yang harus saya coba jalankan?
Finn Rayment
@ pelepasan yang mungkin karena interpolasi string, yang diperkenalkan di Scala 2.10.0
corvus_192
Jadi versi apa yang Anda buat ini? 2.9?
Finn Rayment
@frayment Saya menggunakan 2.11.7 REPL
corvus_192
1

C, 176 175 161 byte

1 byte simpan berkat @JonathanAllan
bantuan besar-besaran terima kasih kepada @Downvoter karena telah menyelamatkan saya 14 byte!

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

Cobalah online!

Nilai yang dipilih: 00untuk semuanya.

Batalkan jawaban golf:

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

Trik untuk ini, adalah mengambil dua input dan mencoba mengubahnya menjadi string heksadesimal dan kemudian dilemparkan ke bilangan bulat. Karena tidak ada pengecekan kesalahan atau apapun juga, perilaku tidak terdefinisi hanyalah melempar kesalahan dan merusak program. Pengguna perlu memasukkan dua input, namun kompiler Eclipse CDT saya sepertinya membiarkan saya memasukkan keduanya pada baris yang sama dengan spasi di antaranya.

Mereka harus berada dalam urutan yang benar, karena meminta nilai yang lebih besar sebelum nilai yang lebih kecil tidak akan menjalankan while-loop sama sekali.

Masalahnya, tidak ada perlindungan buffer-overflow, jadi saya bisa meminta sesuatu yang tidak masuk akal seperti kisaran dari $ 0 hingga $ FFFF, dan saya akan mendapatkan semua yang ada di memori komputer saya dari awal alokasi memori untuk a[44]array. , hingga nilai 65536 nanti.

Finn Rayment
sumber
Karakter spasi putih tunggal dalam format input cocok dengan jumlah spasi putih apa pun dalam aliran input, meskipun sebagian besar format scanf melewatkan spasi putih, ngomong-ngomong, mengapa tidak memotong perantara dan menggunakan %xlangsung?
Neil
Mengapa tidak menggunakan char s[2]bukan mallocbarang? mallocNilai pengembalian casting tidak perlu dalam C.
cadaniluk
@ Neil Jika Anda berbicara tentang printf("%d%d ", ...)bagian, dengan mengganti format dengan %xhanya mengembalikan 0bukan 00, dan tidak ruang mereka keluar.
Finn Rayment
@Downvoter Terima kasih banyak! Saya tidak memikirkan itu. Mengedit jawaban sekarang.
Finn Rayment
Tidak, saya masih berbicara tentang scanf.
Neil
1

GNU sed, 209 + 1 (r flag) = 210 byte

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

Cobalah online! Satu ruang terdepan hadir dalam output, saya harap itu diizinkan.

Jalankan contoh:

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

Penjelasan: 22 nilai heksadesimal yang disimpan sama dengan yang dari contoh 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

Indeks awal dan akhir dibaca pada baris yang berbeda. Outputnya adalah satu baris dengan nilai tabel dalam rentang indeks itu (inklusif). Input yang tidak terdefinisi akan menulis beberapa baris output yang tidak valid.

# 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
seshoumara
sumber
1

PHP, 106 105 104 96 + 2 byte

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

atau

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

Jalankan dengan php -nr '<code>' <lowindex> <highindex>; lepaskan tanda kutip tunggal dalam kode.
... atau uji secara online .

dechex menginterpretasikan input sebagai string heksadesimal sejauh karakter adalah digit hex,
0 jika input dimulai dengan sesuatu yang lain.

tidak mencetak apa pun jika nilai pertama lebih besar dari yang kedua.

nilai yang dipilih:

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

(22 kode ascii pertama dari kode yang dieksekusi)

atau

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

dengan nilai-nilai ini:

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 
Titus
sumber
Apakah jawaban biasanya memasukkan <?phppotongan?
Finn Rayment
@ pembayaran tidak jika Anda gunakan -r. Dan jika saya perlu menyimpannya di file, saya menggunakan tag terbuka pendek <?.
Titus
Konstanta a,, zdan ProgramingPuzles_CGolftidak terdefinisi. Dari mana ProgramingPuzles_CGolfdatangnya? : /
Finn Rayment
@ pelepasan Itu adalah pemberitahuan. Rute ulang stderruntuk /dev/nulljika Anda tidak seperti mereka. PHP mengevaluasi konstanta yang tidak terdefinisi pada string.
Titus
Tapi mereka muncul sebagai Kesalahan Sintaks, saya tidak bisa menjalankan program.
Finn Rayment
1

Rakitan Apple II 6502, 75 byte

Kode byte:

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

Membongkar:

  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

Ini membentuk array dalam memori yang terlihat seperti output. Nilai yang dipilih adalah:

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

Pengguna menekan empat tombol untuk mengatur input.

Peter Ferrie
sumber
Oooo menggunakan kode Apel sendiri. Dilakukan dengan sangat baik.
Finn Rayment