Woz Monitor


17

Вызов

Я недавно попал на 8-битные компьютеры и очарован работой их и других; таким образом, цель этого кода гольфа состоит в том, чтобы скопировать часть монитора Woz, разработанного Стивом Возняком для 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 потребует два входа на гекс, делая четыре на два).

Не стесняйтесь комментировать, если вам нужны разъяснения.

Это код гольф, поэтому самый короткий ответ по количеству байтов - победитель.

Leaderboard

Вот таблица лидеров, генерирующая сниппет от Мартина Эндера .

Чтобы убедиться, что ваш ответ обнаружен, начните его с заголовка, используя следующий шаблон уценки:

# Language Name, N bytes

где Nразмер вашего представления. Если вы улучшите свой счет, вы можете сохранить старые результаты в заголовке, вычеркнув их. Например:

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


Мы просим пользователя ввести два ввода или n? Мы выбираем, что такое 22 шестнадцатеричных значения?
xnor

Да, 22 значения - это ваше решение. Входные значения могут быть любыми. Я сказал, nпотому что Brainfuck не может взять 2-символьную строку, вам нужно будет ввести первый байт, затем второй для первого значения, а затем сделать это снова для второго значения, всего 4 ввода. Их может быть сколько угодно.
Выплата Finn

Однако со значениями вы не можете просто иметь их все как 00, и иметь программу, имитирующую что-то, что фактически читает массивы. Обновление вопроса.
Выплата Finn

Должен ли он переноситься или считываться в обратном порядке, если вход 2 меньше входа 1?
Джонатан Аллан

@JonathanAllan Это полностью зависит от вас. Просто помните, что правильность ввода может сделать ваш код больше. Как написано чуть выше правил, вы можете разрешить любую форму ввода (вплоть до вас), что приведет к неопределенному поведению или ошибкам, если вы хотите.
Выплата Finn

Ответы:


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

Ах, простите меня. Вы были действительно правы. Молодцы, и заняли первое место в рейтинге. :)
Finn Rayment

1
да, я просто переместил и изменил одно значение смещения (сейчас 1F), то есть мне не нужно «правильно» интерпретировать шестнадцатеричные входы или добавить 16, чтобы дать мне две шестнадцатеричные цифры для преобразования обратно.
Джонатан Аллан

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(' ')в командной строке. Во всяком случае, мой обновленный ответ должен исправить это.
Арно

Отлично сработано! Работает сейчас. Это странно, что Chrome это делает. Я проверил это на вашем JS-тестере и на моей консоли разработчика. Та же ошибка. Добро пожаловать в таблицу лидеров.
Выплата Finn

Вы можете сохранить несколько байтов с помощью входных данных, таких как 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
  • Если какой-либо вход отрицательный или 1-й вход больше, чем 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 и последнее ;не являются частью ответа. Это только для фрагмента, поэтому я добавил перенос строки. Я отредактирую ответ.
Хеди

Мой плохой @Хеди, извини за это.
Выплата Finn

2

Питон, 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


Добро пожаловать в Программирование Пазлов и Код Гольф! Это хороший ответ, но я не думаю, что он отвечает требованиям задачи. Не могли бы вы включить 22 выбранных вами шестнадцатеричных значения?
ETHproductions

Где-то там! Единственная проблема заключается в том, что когда я ввел значения 04и 06я получил только два значения назад. Я подозреваю, что это 05и 06ценности. Вам необходимо указать все значения между введенными значениями, включая их.
Выплата Finn

1
@frayment, о, верно, исправил это!
Фатих БАКИР

1

Perl, 79 45 41 байт

"минимальное значение $ 10" - пример имеет минимум $ 00 - это опечатка?

Вот довольно скучный perl-ответ в 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

@frayment, вероятно, из-за интерполяции строк, которые были введены в Scala 2.10.0
corvus_192

Так в какой версии вы это встроили? 2,9?
Finn Rayment

@frayment Я использовал REPL
2.11.7

1

С 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напрямую?
Нил

Почему бы не использовать char s[2]вместо mallocматериала? Кастинг malloc«s возвращаемого значения не является необходимым в C в любом случае.
cadaniluk

@Neil Если вы говорите о printf("%d%d ", ...)части, заменив форматирование просто %xвозвращает 0«вместо 00», а не размечает их.
Выплата Finn

@ Downvoter Спасибо большое! Я не думал об этом. Редактирую ответ сейчас.
Выплата Finn

Нет, я все еще говорю о scanf.
Нил

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

(первые 22 кода ASCII выполненного кода)

или

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

@frayment нет, если вы используете -r. И если мне нужно сохранить его в файл, я использую тэг open open <?.
Тит

Константы a, zи ProgramingPuzles_CGolfне определены. В ProgramingPuzles_CGolfлюбом случае, откуда? : /
Выплата Finn

@frayment Это уведомления. Перенаправить stderrк , /dev/nullесли вы не похожие на них. PHP оценивает неопределенные константы в строки.
Тит

Но они появляются как ошибки синтаксиса, я не могу запустить программу.
Выплата Finn

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

Пользователь нажимает четыре клавиши, чтобы установить входы.


Оооо, используя собственный код Apple. Очень красиво сделано.
Finn Rayment
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.