Woz Monitörü


17

Meydan okuma

Son zamanlarda 8-bit bilgisayarlara girdim ve onların ve diğerlerinin çalışmalarından çok etkilendim; bu nedenle golf kodunun amacı, Steve Wozniak tarafından Apple I için tasarlanan Woz Monitörünün bir bölümünü çoğaltmaktır.

İki bayt genişliği olan 22 onaltılık değerden oluşan bir diziyi (en düşük değer $ 10 , en yüksek değer $ FF ) saklayacak ve ardından n- girişlerin girişini alacaksınız. (Normalde iki; Brainfuck gibi dillerin zor zamanları olabilir).
Girişler, dizide nereden yazdırmaya başlanacağını ve nerede durulacağını belirtir; tanımlanmış davranışa sahip bir girişin başlangıç ​​değeri, bitiş değerine eşit veya daha az olacaktır. Programınız daha sonra girilen onaltılık değerler arasındaki ve onaltılık değerler dahil her onaltılı değeri yazdırabilmelidir .

Buna bir örnek:

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

Şimdi bu alıştırmanın ilginç kısmı, kullanıcıların girdilerinin sınırlarını kontrol etmek istediğiniz her şeyi kullanabilmenizdir. Kişi girdileri hellove programınızda tanımlanmamış davranış var mı? Haber vermeden istifa eder mi? İkisi de geçerlidir.

Tek kural:

1. Başlamadan önce programınızın bir parçası olarak 22 onaltılık değerin değerlerini dahil etmelisiniz (kullanıcıdan girdi isteyemezsiniz).
2. Onaltılık değerlerin çıktısı tam biçime uygun olmalıdır: 00 FF 00 FF 00Sondaki boşluklar, sekmeler veya çizgiler TAMAM. Karakterler değil.
3. Program gelmez bir mesaj ile girişler için sormak gerekir. İsterseniz "iletiyi" boş bırakın. Ancak kullanıcı onaltılık sınırları girmelidir.
4. 22 onaltılık değerin değerlerine karar vermeniz gerektiği gibi, sadece değerleri yazdırarak bir programı taklit etmenin aksine, değerleri gerçekte depodan alan bir program yapmalısınız . ( 00 ABD doları ' ). 5.tutarındaki bir liste gibi)
girdi miktarı, seçtiğiniz dilin iki bayt genişliğini onaltılık olarak tanıması için gereken girdi miktarı anlamına gelir. Örneğin. (Brainfuck altıgen başına iki giriş gerektirir, bu da ikisi için dört olur).

Açıklığa ihtiyacınız varsa yorum yapmaktan çekinmeyin.

Bu kod golf, yani bayt sayısındaki en kısa cevap kazanır.

Liderler Sıralaması

İşte Martin Ender'in pasajını üreten bir afiş tablosu .

Yanıtınızın göründüğünden emin olmak için lütfen aşağıdaki Markdown şablonunu kullanarak yanıtınızı bir başlıkla başlatın:

# Language Name, N bytes

Ngönderiminizin büyüklüğü nerede . Puanınızı artırmak varsa, olabilir onları içinden vurarak, başlığa eski hesapları tutmak. Örneğin:

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


Kullanıcıdan iki giriş mi istiyoruz yoksa n? 22 onaltılık değerin ne olduğunu seçer miyiz?
xnor

Evet, 22 değere siz karar verin. Girdi değerleri, herhangi bir miktar olabilir. Dedim ki, nBrainfuck 2 karakterli bir dize alamaz, ilk bayt, sonra ilk değer için ikincisini girmeniz ve sonra ikinci değer için toplamda 4 giriş yapmanız gerekir. Ancak istediğiniz kadar olabilirler.
Finn Rayment

Bununla birlikte, değerlerle, hepsine 00 olarak sahip olamazsınız ve dizileri gerçekten okuyan bir şeyin ne olacağını taklit eden bir programa sahip olamazsınız . Soru güncelleniyor.
Finn Rayment

Giriş 2, giriş 1'den küçükse, geriye doğru okumalı mı yoksa okumalı mı?
Jonathan Allan

@JonathanAllan Bu tamamen size bağlı. Unutmayın, girişlerin doğru olduğundan emin olmak kodunuzu büyütebilir. Kuralların hemen üzerinde yazıldığı gibi, herhangi bir giriş biçimine (size bağlı) izin vererek tanımlanmamış davranış veya hatalara yol açabilirsiniz.
Finn Rayment

Yanıtlar:


4

Jöle , 24 21 bayt

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

Seçilen değerler: [00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 1F 10 11 12 13 14 15]

TryItOnline

İkinci giriş birinciden daha azsa, ters sıralamayı verir.
Sınırların dışında davranış tanımlanmamıştır (örn. "Foo", "14", çoğu dizide bile olmayan ve birçoğu uzunluk 2 olmayan 38 değer döndürür)

Nasıl?

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

Ah, affedersiniz. Gerçekten haklıydınız. Aferin ve skor tablosu pozisyonu 1. :)
Finn Rayment

1
evet, sadece bir ofset değerini taşıdım ve değiştirdim (şimdi 1F), yani onaltılık girişleri doğru şekilde yorumlamak ya da geri dönüştürmek için iki onaltılık basamak vermek için 16 eklemek zorunda değilim.
Jonathan Allan

4

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

ETHproductions sayesinde 1 bayt tasarruf

Seçilen değerler:

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
  • Alt sınır, sonra üst sınır (örn. 0x04/ 0x0f) İçin sorulur .
  • Geçersiz bir alt sınır 0x00(minimum değer) olarak yorumlanır .
  • Geçersiz bir üst sınır 0x15(maksimum değer) olarak yorumlanacaktır .
  • Alt sınır üst sınırdan büyükse hiçbir şey çıktılamaz.

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

Önceki sürüm (97 bayt)

'Gerçek' onaltılık değerlerin sözde rastgele bir listesini oluşturma:

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

Sıra:

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

"message": "Yakalanmamış Sözdizimi Hatası: Geçersiz yıkıcı atama hedefi"
Finn Rayment

@frayment - Bu Chrome, değil mi? Bu garip çünkü [a,b]=prompt().split(' ')komut satırında şikayet etmiyor . Her neyse, güncellenmiş cevabım bunu düzeltmeli.
Arnauld

Aferin! Şimdi çalışıyor. Chrome'un bunu yapması garip. JS test cihazınızda ve Geliştirici konsolumda test ettim. Aynı hata. Liderlik tablosuna hoş geldiniz.
Finn Rayment

0x04
Hedi

1
Dostum, alternatifinizle ilgili yanlış bir şey yok, burada iyi çalışıyor ve kurallar dahilinde. Yayınınızı güncelleyin! :)
Finn Rayment

3

JavaScript (ES6), 107 152 137 bayt

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

Seçilen değerler:

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

girişler:

  • Girdi biçimi: 0x14
  • Herhangi bir giriş negatifse veya 1. giriş ikinciden büyükse: InternalError: too much recursion
  • NaNSınırların dışına yazdırır .

Önceki çözümler:
152 bayt:

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 bayt, geçersiz çözüm (girişler eksik):

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

1
Kapat! Ancak kullanıcıdan girdi isteyebilmeniz gerekir. console.log(...)Yine de yaptıklarını seviyorum . ;)
Finn Rayment

@frayment var ve son ;yanıtın bir parçası değildir. Bu sadece snippet için, bu yüzden linebreak ekledim. Cevabı düzenleyeceğim.
Hedi

Kötüüm @Kedi, bunun için üzgünüm.
Finn Rayment

2

Python, 88 87 86 bayt

@JonathanAllan sayesinde tasarruf 1 byte
1 byte kaydetmek tekrar @JonathanAllan için

Ayrıca kodun tabanını değiştirdi, şimdi çok daha hoş.

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

Seçilen değerler: 00her şey için.

C cevabımla aynı fikir. Ancak bu sefer, kod kullanıcıdan her iki değer arasında bir boşluk gerektiren, bunları böler, onaltılık değerlere lgönderir ve girilen iki değer de dahil olmak üzere dizideki her onaltılı yazdırır . Python'un muhteşem bir hata yakalama sistemi olduğundan, arabellek taşması yoktur ve bu nedenle kod çok daha güvenlidir. Program tanımlanmamış davranışlardan korunuyor daha düşük bir değerden önce daha yüksek bir değer gönderildiğinde yürütülmeyecek şekilde .

Bu hem Python 2.x hem de 3.x üzerinde çalışmalıdır; Sistemim her ikisini de desteklemediğinden, her iki tercümana da erişimim olmadığından, yanılıyorsam lütfen beni düzeltin.


2

C ++, 98 95 93 bayt

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

My chosen values are all 0's


Welcome to Programming Puzzles & Code Golf! This is a well-golfed answer, but I don't think it meets the requirements of the challenge. Would you mind including your 22 chosen hexadecimal values?
ETHproductions

Nearly there! The only problem is, when I entered values 04 and 06, I only got two values back. I'm suspecting these are the 05 and 06 values. You need to provide all values between and including the inputted values.
Finn Rayment

1
@frayment, oh that's right, fixed it!
Fatih BAKIR

1

Perl, 79 45 41 bytes

"min value $10" - the example has minimum of $00- is that a typo?

Here's a rather boring perl answer in 41 bytes (Was 46 and then I kept seeing spaces, parens I could elide). Takes input in two lines.

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

The data is a list 04..1A

Before I was being too clever with pack & unpack. Its input bytes are entered at once smushed together, eg "020E' will print the 2nd-14th entries

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

Might try golfing it more using all 0's, substr, and printf'%*vX' ... nope that is making my answer longer. 48 characters (using a string of ascii '7', hex 37 as the data)

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

1

CJam, 22 bytes

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

Chosen values:

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

Try it online


1

Scala, 45 bytes

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

Ungolfed:

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

Uses 00 to FF as values, but works up to 2147483647.


error: ')' expected but string literal found. at a.to(b).map(
Finn Rayment

Don't know if it's just me or what. :/ What should I try running it in?
Finn Rayment

@frayment that's probably because of the string interpolation, which were introduced in Scala 2.10.0
corvus_192

So which version did you build this in? 2.9?
Finn Rayment

@frayment I used the 2.11.7 REPL
corvus_192

1

C, 176 175 161 bytes

1 byte save thanks to @JonathanAllan
Massive help thanks to @Downvoter for saving me 14 bytes!

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

Try it online!

Chosen values: 00 for everything.

Un-golfed answer:

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

The trick to this, is taking in two inputs and attempting to convert them to hexadecimal strings and then cast to integers. Since there is no error-checking or anything likewise, undefined behaviour is simply throwing errors and breaking the program. The user needs to enter two inputs, however my Eclipse CDT compiler seems to let me input them both on the same line with a space between.

They must be in the correct order, as requesting a bigger value before a smaller value will not run the while-loop at all.

The thing is, there is also no buffer-overflow protection, so I can simply request something absurd such as a range from $0 to $FFFF, and I will get everything in my computers memory from the beginning of the allocation of memory for the a[44] array, all the way to 65536 values later.


A single whitespace character in the input format matches any amount of whitespace in the input stream, although most scanf formats skip whitespace anyway, speaking of which, why not cut out the middle man and use %x directly?
Neil

Why not use char s[2] instead of the malloc stuff? Casting malloc's return value isn't necessary in C anyway.
cadaniluk

@Neil If your talking about the printf("%d%d ", ...) part, by replacing the formatting with simply %x only returns 0's instead of 00's, and doesn't space them out.
Finn Rayment

@Downvoter Thankyou very much! I didn't think of that. Editing answer now.
Finn Rayment

No, I'm still talking about the scanf.
Neil

1

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

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

Try it online! One leading space is present in the output, I hope it's allowed.

Run examples:

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

Explanation: the 22 hexadecimal values stored are the same as the ones from the OP's example

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

The start and end indexes are read on separate lines. The output is a single line with the table values in that index range (inclusive). Undefined input will write multiple lines of invalid output.

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

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

or

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

Run with php -nr '<code>' <lowindex> <highindex>; escape the single quotes in the code.
... or test it online.

dechex interpretes input as hexadecimal strings as far as characters are hex digits,
0 if the input starts with something else.

prints nothing if first value is larger than second.

chosen values:

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

(first 22 ascii codes of the executed code)

or

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

with these values:

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 

Yanıtlar normalde <?phpyığını içerir mi?
Finn Rayment

@frayment kullanırsanız değil -r. Ve bir dosyaya saklamam gerekirse kısa açık etiketi kullanıyorum <?.
Titus

Sabitler a, zve ProgramingPuzles_CGolftanımsız. ProgramingPuzles_CGolfZaten nereden geldi? : /
Finn Rayment

@frayment Bunlar bildirimlerdir. Yeniden yönlendir stderriçin /dev/nullonlara sevmiyorum eğer. PHP, dizelere tanımsız sabitleri değerlendirir.
Titus

Ama sözdizimi hataları olarak geliyor, ben programı çalıştıramazsınız.
Finn Rayment

1

Apple II 6502 assembly, 75 bytes

Byte code:

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

Disassembly:

  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

It forms an array in memory that looks like the output. The chosen values are:

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

User presses four keys to set the inputs.


Oooo using Apples own code. Very nicely done.
Finn Rayment
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.