Монітор Woz


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 зажадає два входи на шістнадцять, роблячи це чотири для двох).

Не соромтесь коментувати, якщо вам потрібно уточнення.

Це кодовий гольф, тому найкоротша відповідь у кількості байтів - переможець.

Таблиця лідерів

Ось таблиця лідерів, що генерує фотографії Мартіна Ендера .

Щоб переконатися, що ваша відповідь відображається, будь ласка, почніть свою відповідь із заголовка, використовуючи наступний шаблон Markdown:

# Language Name, N bytes

де Nрозмір вашого подання. Якщо ви покращите свій рахунок, ви можете зберегти старі бали у заголовку, прокресливши їх. Наприклад:

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


Ми запитуємо у користувача два входи чи n? Чи вибираємо ми, які є значення 22 шістнадцяткових?
xnor

Так, 22 значення слід вирішити. Вхідні значення, їх може бути будь-яка кількість. я сказавn тому, що Brainfuck не може взяти рядок з двома символами, вам потрібно буде ввести перший байт, потім другий для першого значення, а потім зробити це знову для другого значення, всього 4 входи. Їх може бути скільки завгодно.
Фінн Реймент

Однак зі значеннями ви не можете просто мати їх усіма як 00 та мати програму, що імітує щось таке, що насправді читає масиви. Оновлення питання.
Фінн Реймент

Чи слід обертати або читати в зворотному порядку, якщо вхід 2 менший за вхід 1?
Джонатан Аллан

@JonathanAllan Це повністю залежить від вас. Пам’ятайте лише, якщо переконання, що введення правильне, може збільшити ваш код. Як написано трохи вище правил, ви можете дозволити будь-яку форму введення (залежно від вас), що призводить до невизначеної поведінки або помилок, якщо бажаєте.
Фінн Реймент

Відповіді:


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 лідерів. :)
Фінн Реймент

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 та на консолі розробника. Та сама помилка. Ласкаво просимо до таблиці лідерів.
Фінн Реймент

Ви можете зберегти кілька байтів із вхідними даними,
Hedi

1
Чувак, у вас немає нічого поганого з вашим заступником, тут він прекрасно працює і в межах правил. Оновіть свою публікацію! :)
Фінн Реймент

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(...)хоча. ;)
Фінн Реймент

@frayment var і остання ;не є частиною відповіді. Це просто для фрагмента, тому я додав linebreak. Я відредагую відповідь.
Хеді

Мій поганий @Hedi, вибач за це.
Фінн Реймент

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для всього.

Та сама ідея, що і моя відповідь С. Цього разу, однак, код приймає від користувача один вхід, вимагаючи пробілу між обома значеннями, розділяючи їх, привласнюючи їх до шістнадцяткових значень та друкуючи кожен шістнадцятковий 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цінності. Потрібно надати всі значення між введеними значеннями та включаючи їх.
Фінн Реймент

1
@frayment, о, це правильно, це виправлено!
Фатих БАКІР

1

Perl, 79 45 41 байт

"min значення $ 10" - приклад має мінімум $ 00 - це помилка друку?

Ось досить нудна відповідь на перли в 41 байті (було 46, а потім я постійно бачив пробіли, парени, на які я міг зійти). Вводиться в два рядки.

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

Дані - це список 04..1A

До того, як я був занадто розумний з упаковкою та розпакуванням. Його вхідні байти вводяться одразу розмитими разом, наприклад, "020E" надрукує записи 2-24

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

Можливо, спробуйте більше грати в гольф, використовуючи всі 0 substr, та printf'%*vX'... ні, це робить мою відповідь довшою. 48 символів (використовуючи рядок ascii '7', hex 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 " "

Безумовно:

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

Використання 00в FFякості значень, але працює до 2147483647.


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

Не знаю, чи це тільки я чи що. : / Що я повинен спробувати запустити?
Фін Реймент

@frayment, ймовірно, через інтерполяцію рядків, яка була введена в Scala 2.10.0
corvus_192

Отже, в якій версії ви створили це? 2,9?
Фінн Реймент

@frayment Я використовував 2.11.7 REPL
corvus_192

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значення кастингу все одно не потрібно в C.
каданілюк

@Neil Якщо ви говорите про printf("%d%d ", ...)частину, замінивши форматування на просто, %xповертає лише 0замість 00s, а не видаляє їх.
Фінн Реймент

@Downvoter Дякую дуже! Я про це не думав. Редагування відповіді зараз.
Фінн Реймент

Ні, я все ще говорю про це 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 збережених шістнадцяткових значень такі ж, як у прикладі ОП

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шматок?
Фінн Реймент

@frayment не використовується, якщо ви використовуєте -r. І якщо мені потрібно зберегти його у файл, я використовую короткий відкритий тег <?.
Тит

Константи a, zі ProgramingPuzles_CGolfне визначені. Звідки ProgramingPuzles_CGolfвзявся? : /
Фінн Реймент

@frayment Це повідомлення. Перенаправити stderrдо , /dev/nullякщо ви не схожі на них. PHP оцінює невизначені константи до рядків.
Тит

Але їх появу як синтаксичні помилки, я не можу запустити програму.
Фінн Реймент

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, використовуючи власний код Apple. Дуже красиво зроблено.
Фін Реймент
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.