Monitor Woz

17

Wyzwanie

Niedawno dostałem się do komputerów 8-bitowych i jestem zafascynowany ich działaniem i innymi; dlatego celem tego kodu golfowego jest odtworzenie części Monitora Woz, zaprojektowanego przez Steve'a Woźniaka dla Apple I.

Masz przechowywać tablicę 22 wartości szesnastkowych o szerokości dwóch bajtów (minimalna wartość 10 USD , maksymalna wartość $ FF ), a następnie weź n- ilość danych wejściowych. (Zwykle dwa; języki takie jak Brainfuck mogą mieć trudności).
Dane wejściowe będą odnosić się do miejsca w tablicy, od którego ma się rozpocząć drukowanie, i gdzie się zatrzymać; wejście o zdefiniowanym zachowaniu będzie miało wartość początkową mniejszą lub równą wartości końcowej. Twój program musi wtedy być w stanie wydrukować każdą wartość szesnastkową między wprowadzonymi wartościami szesnastkowymi włącznie .

Przykład tego:

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

Interesującą częścią tego ćwiczenia jest to, że możesz użyć wszystkiego, co chcesz, sprawdzić granice danych wejściowych użytkowników. Dane wejściowe od osoby helloi twój program ma niezdefiniowane zachowanie? Odchodzi bez uprzedzenia? Oba są ważne.

Jedyne zasady to:

1. Musisz włączyć wartości 22 wartości szesnastkowych jako część programu przed jego uruchomieniem (nie możesz poprosić użytkownika o dane wejściowe).
2. Dane wyjściowe wartości szesnastkowych muszą mieć dokładny format: 00 FF 00 FF 00spacje końcowe, tabulatory lub linie są w porządku. Znaki nie są.
3. Program nie musi pytać o dane wejściowe z komunikatem. Pozostaw „wiadomość” pustą, jeśli chcesz. Użytkownik musi jednak wprowadzić ograniczenia szesnastkowe.
4. Ponieważ w przypadku wartości 22 wartości szesnastkowych decyzję należy podjąć, należy stworzyć program, który faktycznie pobiera wartości z pamięci, a nie naśladuje program, po prostu drukując wartości. (np. lista 00 $ ).
5 n-ilość danych wejściowych, odnosi się do ilości danych wejściowych wymaganych dla wybranego języka do rozpoznania szesnastkowej o szerokości dwóch bajtów. na przykład. (Brainfuck wymaga dwóch danych wejściowych na heks, co daje cztery dla obu).

Jeśli potrzebujesz wyjaśnienia, możesz je komentować.

To jest kod golfowy, więc zwycięzcą jest najkrótsza odpowiedź w liczbie bajtów.

Tabela liderów

Oto tabela liderów generująca fragment dzięki uprzejmości Martina Endera .

Aby upewnić się, że twoja odpowiedź się pojawi, zacznij od nagłówka, korzystając z następującego szablonu Markdown:

# Language Name, N bytes

gdzie Njest rozmiar twojego zgłoszenia. Jeśli poprawić swój wynik, to może zachować stare porachunki w nagłówku, uderzając je przez. Na przykład:

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

Finn Rayment
źródło
Czy pytamy użytkownika o dwa dane wejściowe czy n? Czy wybieramy 22 wartości szesnastkowe?
xnor
Tak, 22 wartości należy do ciebie. Wartości wejściowe mogą być dowolną kwotą. Powiedziałem, nponieważ ponieważ Brainfuck nie może pobrać ciągu 2 znaków, należy wprowadzić pierwszy bajt, a następnie drugi dla pierwszej wartości, a następnie zrobić to ponownie dla drugiej wartości, łącznie 4 dane wejściowe. Może być ich tyle, ile chcesz.
Finn Rayment
Jednak przy tych wartościach nie możesz po prostu mieć ich wszystkich jako 00 i mieć program naśladujący to, co faktycznie czyta tablice. Aktualizacja pytania.
Finn Rayment
Czy powinien zawijać lub czytać w odwrotnej kolejności, jeśli wejście 2 jest mniejsze niż wejście 1?
Jonathan Allan
@JonathanAllan To zależy wyłącznie od Ciebie. Pamiętaj tylko, że upewnienie się, że dane wejściowe są prawidłowe, może zwiększyć Twój kod. Jak napisano tuż nad regułami, możesz zezwolić na dowolną formę wprowadzania danych (do ciebie), co może prowadzić do nieokreślonego zachowania lub błędów, jeśli chcesz.
Finn Rayment

Odpowiedzi:

4

Galaretka , 24 21 bajtów

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

Wybrane wartości: [00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 1F 10 11 12 13 14 15]

TryItOnline

Jeśli drugie wejście jest mniejsze niż pierwsze, wyświetla odwróconą sekwencję.
Zachowanie poza zakresem jest niezdefiniowane (np. „Foo”, „14” zwraca 38 wartości, z których większość nie jest nawet w tablicy, a wiele z nich nie ma długości 2)

W jaki sposób?

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
źródło
Ach, wybacz mi. Naprawdę miałeś rację. Dobra robota i zajmij pozycję lidera # 1. :)
Finn Rayment
1
tak, właśnie przesunąłem i zmieniłem jedną wartość przesunięcia (teraz 1F), co oznacza, że ​​nie musiałem „poprawnie” interpretować danych szesnastkowych lub dodawać 16, aby otrzymać dwie cyfry szesnastkowe do konwersji.
Jonathan Allan
4

JavaScript (ES6), 118 115 112 102 82 81 bajtów

Zaoszczędzono 1 bajt dzięki produktom ETH

Wybrane wartości:

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
  • Monituje o dolną granicę, a następnie górną granicę (np. 0x04/ 0x0f).
  • Nieprawidłowa dolna granica zostanie zinterpretowana jako 0x00(wartość minimalna).
  • Nieprawidłowa górna granica zostanie zinterpretowana jako 0x15(wartość maksymalna).
  • Nie wyprowadza nic, jeśli dolna granica jest większa niż górna granica.

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

Poprzednia wersja (97 bajtów)

Generowanie pseudolosowej listy „prawdziwych” wartości szesnastkowych:

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

Sekwencja:

10 10 17 1c 1e 38 33 31 17 1c 1e 38 33 31 17 1c 1e 38 33 31 38 3f
Arnauld
źródło
„message”: „Uncaught SyntaxError: Nieprawidłowy cel przypisania do destrukcji”
Finn Rayment
@frayment - To jest Chrome, prawda? To dziwne, ponieważ nie narzeka [a,b]=prompt().split(' ')w wierszu poleceń. W każdym razie moja zaktualizowana odpowiedź powinna to naprawić.
Arnauld
Dobra robota! Działa teraz. To dziwne, że Chrome to robi. Przetestowałem to na twoim testerze JS i w mojej konsoli programisty. Ten sam błąd. Witamy w tabeli wyników.
Finn Rayment
Możesz zapisać niektóre bajty z wejściami takimi jak 0x04
Hedi
1
Koleś, nie ma nic złego z twoim zastępcą, tutaj działa dobrze i jest zgodny z zasadami. Zaktualizuj swój post! :)
Finn Rayment
3

JavaScript (ES6), 107 152 137 bajtów

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

Wybrane wartości:

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

Wejścia:

  • Format wejściowy to 0x14
  • Jeśli jakiekolwiek wejście jest ujemne lub 1. wejście jest większe niż 2. wejście: InternalError: too much recursion
  • Wydrukuje NaNpoza limitem.

Poprzednie rozwiązania:
152 bajty:

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 bajtów, nieprawidłowe rozwiązanie (brak danych wejściowych):

f=(a,b,[x,y,...s]='FFF4B6D7402011A4F0D0FF3D9C2165C4A22890E7D6A5')=>a?f(a-1,b-1,s):x+y+' '+(b?f(a,b-1,s):'')
Hedi
źródło
1
Blisko! Ale musisz móc poprosić użytkownika o dane wejściowe. Lubię jednak to, co zrobiłeś console.log(...). ;)
Finn Rayment
@frayment var i ostatnie ;nie są częścią odpowiedzi. To tylko fragment kodu, dlatego dodałem podział linii. Zmienię odpowiedź.
Hedi
Przepraszam, mój zły @Hedi.
Finn Rayment
2

Python, 88 87 86 bajtów

Zapis
1 bajt dzięki @JonathanAllan Zapis 1 bajt ponownie w @JonathanAllan

Zmieniłem także podstawę kodu, teraz znacznie ładniej.

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

Wybrane wartości: 00do wszystkiego.

Ten sam pomysł jak moja odpowiedź C. Tym razem jednak kod pobiera od użytkownika pojedyncze dane wejściowe, wymagając odstępu między obiema wartościami, dzieląc je, rzutując je na wartości szesnastkowe i drukując każdy hex w ltablicy, w tym i pomiędzy dwiema wprowadzonymi wartościami. Ponieważ Python ma wspaniały system wychwytywania błędów, nie występuje przepełnienie bufora, a zatem kod jest znacznie bezpieczniejszy. Program jest zabezpieczony przed niezdefiniowanym zachowaniem w takim sensie, że nie zostanie uruchomiony, gdy wyższa wartość zostanie przesłana przed niższą wartością.

Powinno to działać zarówno w Pythonie 2.x, jak i 3.x; Popraw mnie, jeśli się mylę, ponieważ nie mam dostępu do obu tłumaczy, ponieważ mój system nie obsługuje ich obu.

Finn Rayment
źródło
2

C ++, 98 95 93 bajtów

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

Moje wybrane wartości to 0

Fatih BAKIR
źródło
Witamy w Programowaniu Puzzle i Code Golf! To odpowiedź na golfa, ale nie sądzę, żeby spełniała wymagania wyzwania. Czy miałbyś coś przeciwko uwzględnieniu 22 wybranych wartości szesnastkowych?
ETHprodukcje
Prawie tu! Jedyny problem polega na tym, że kiedy wprowadziłem wartości 04i 06odzyskałem tylko dwie wartości. Podejrzewam, że są to wartości 05i 06. Musisz podać wszystkie wartości pomiędzy wprowadzonymi wartościami włącznie .
Finn Rayment
1
@frayment, o tak, naprawiłem to!
Fatih BAKIR
1

Perl, 79 45 41 bajtów

„minimalna wartość 10 $” - przykład ma minimum 00 $ - czy to literówka?

Oto dość nudna odpowiedź perla w 41 bajtach (miał 46 lat, a potem wciąż widziałem spacje, pareny, które mogłem wymknąć). Pobiera dane wejściowe w dwóch wierszach.

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

Dane są listą 04..1A

Wcześniej byłem zbyt sprytny przy pakowaniu i rozpakowywaniu. Jego bajty wejściowe są wprowadzane jednocześnie zetknięte razem, np. „020E” wydrukuje wpisy 2-14

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

Mogę spróbować zagrać w golfa bardziej, używając wszystkich zer substr, i printf'%*vX'... nie, to sprawia, że ​​moja odpowiedź jest dłuższa. 48 znaków (używając ciągu znaków ascii '7', hex 37 jako danych)

printf'%*vX',' ',substr 7x22,$s=hex<>,1+hex<>-$s
Yary
źródło
1

CJam, 22 bajty

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

Wybrane wartości:

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

Wypróbuj online

Neorej
źródło
1

Scala, 45 bajtów

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

Nie golfowany:

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

Zastosowania 00do FFjak wartości, ale działa do 2147483647.

corvus_192
źródło
error: ')' expected but string literal found.oa.to(b).map(
Finn Rayment
Nie wiem czy to tylko ja czy co. : / Na czym powinienem go uruchomić?
Finn Rayment
@płatność, która prawdopodobnie wynika z interpolacji łańcuchów, które zostały wprowadzone w Scali
2.10.0
Więc w której wersji to wbudowałeś? 2,9?
Finn Rayment
@frayment Użyłem REPL
2.11.7
1

C, 176 175 161 bajtów

Oszczędzaj 1 bajt dzięki @JonathanAllan
Ogromna pomoc dzięki @Downvoter za uratowanie mnie 14 bajtów!

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

Wypróbuj online!

Wybrane wartości: 00do wszystkiego.

Odpowiedź bez gry w golfa:

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

Sztuczka polega na tym, że pobiera dwa dane wejściowe i próbuje przekonwertować je na ciągi szesnastkowe, a następnie rzutować na liczby całkowite. Ponieważ nie ma sprawdzania błędów ani nic podobnego, niezdefiniowanym zachowaniem jest po prostu rzucanie błędów i łamanie programu. Użytkownik musi wprowadzić dwa dane wejściowe, ale wydaje mi się, że mój kompilator Eclipse CDT pozwala mi je wprowadzać w tym samym wierszu ze spacją między nimi.

Muszą być w odpowiedniej kolejności, ponieważ żądanie większej wartości, zanim mniejsza wartość w ogóle nie uruchomi whilepętli.

Chodzi o to, że nie ma również ochrony przed przepełnieniem bufora, więc mogę po prostu zażądać czegoś absurdalnego, takiego jak zakres od 0 $ do $ FFFF, a wszystko w pamięci komputera dostanę od początku przydzielania pamięci dla a[44]tablicy , aż do 65536 wartości później.

Finn Rayment
źródło
Pojedynczy znak białych znaków w formacie wejściowym odpowiada dowolnej ilości białych znaków w strumieniu wejściowym, chociaż większość formatów scanf i tak pomija białe znaki, mówiąc o tym, dlaczego nie wyciąć środkowego człowieka i użyć %xbezpośrednio?
Neil
Dlaczego nie użyć char s[2]zamiast tego malloc? Odlewy mallocwartość powinna zwrotnego nie jest konieczne, C i tak.
cadaniluk
@ Neil Jeśli mówisz o printf("%d%d ", ...)części, zastępując formatowanie, po prostu %xzwraca tylko 0zamiast zamiast 00i nie rozdziela ich.
Finn Rayment
@Downvoter Dziękuję bardzo! Nie myślałem o tym. Edycja odpowiedzi teraz.
Finn Rayment
Nie, wciąż mówię o scanf.
Neil
1

GNU sed, 209 + 1 (flaga r) = 210 bajtów

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

Wypróbuj online! Jedna wyjściowa przestrzeń jest obecna na wyjściu, mam nadzieję, że jest dozwolona.

Uruchom przykłady:

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

Objaśnienie: 22 zapisane wartości szesnastkowe są takie same jak te z przykładu PO

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

Indeksy początkowe i końcowe są odczytywane w osobnych wierszach. Dane wyjściowe to pojedynczy wiersz z wartościami tabeli w tym zakresie indeksu (włącznie). Niezdefiniowane wejście spowoduje zapisanie wielu wierszy nieprawidłowego wyjścia.

# 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
źródło
1

PHP, 106 105 104 96 + 2 bajty

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

lub

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

Uruchom z php -nr '<code>' <lowindex> <highindex>; unikaj pojedynczych cudzysłowów w kodzie.
... lub przetestuj online .

dechex interpretuje dane wejściowe jako ciągi szesnastkowe, o ile znaki są cyframi szesnastkowymi,
0 jeśli dane wejściowe zaczynają się od czegoś innego.

nie drukuje nic, jeśli pierwsza wartość jest większa niż druga.

wybrane wartości:

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

(pierwsze 22 kody ascii wykonanego kodu)

lub

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

z tymi wartościami:

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 
Tytus
źródło
Czy odpowiedzi zwykle zawierają <?phpfragment?
Finn Rayment
@ płatność nie, jeśli używasz -r. A jeśli muszę zapisać go w pliku, używam krótkiego otwartego tagu <?.
Tytus
Stałe a, zi ProgramingPuzles_CGolfsą niezdefiniowane. Skąd to ProgramingPuzles_CGolfsię wzięło? : /
Finn Rayment
@frayment To są powiadomienia. Przekieruj stderrna adres, /dev/nulljeśli ich nie lubisz. PHP ocenia niezdefiniowane stałe ciągów.
Tytus
Ale pojawiają się jako błędy składniowe, nie mogę uruchomić programu.
Finn Rayment
1

Zestaw Apple II 6502, 75 bajtów

Kod bajtowy:

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

Demontaż:

  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

Tworzy tablicę w pamięci, która wygląda jak wynik. Wybrane wartości to:

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

Użytkownik naciska cztery klawisze, aby ustawić wejścia.

Peter Ferrie
źródło
Oooo przy użyciu własnego kodu Apple. Bardzo ładnie wykonane.
Finn Rayment