Вызов
Я недавно попал на 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
function answersUrl(e){return"http://api.stackexchange.com/2.2/questions/95080/answers?page="+e+"&pagesize=100&order=desc&sort=creation&site=codegolf&filter="+ANSWER_FILTER}function getAnswers(){$.ajax({url:answersUrl(page++),method:"get",dataType:"jsonp",crossDomain:true,success:function(e){answers.push.apply(answers,e.items);if(e.has_more)getAnswers();else process()}})}function shouldHaveHeading(e){var t=false;var n=e.body_markdown.split("\n");try{t|=/^#/.test(e.body_markdown);t|=["-","="].indexOf(n[1][0])>-1;t&=LANGUAGE_REG.test(e.body_markdown)}catch(r){}return t}function shouldHaveScore(e){var t=false;try{t|=SIZE_REG.test(e.body_markdown.split("\n")[0])}catch(n){}return t}function getAuthorName(e){return e.owner.display_name}function process(){answers=answers.filter(shouldHaveScore).filter(shouldHaveHeading);answers.sort(function(e,t){var n=+(e.body_markdown.split("\n")[0].match(SIZE_REG)||[Infinity])[0],r=+(t.body_markdown.split("\n")[0].match(SIZE_REG)||[Infinity])[0];return n-r});var e={};var t=0,c=0,p=-1;answers.forEach(function(n){var r=n.body_markdown.split("\n")[0];var i=$("#answer-template").html();var s=r.match(NUMBER_REG)[0];var o=(r.match(SIZE_REG)||[0])[0];var u=r.match(LANGUAGE_REG)[1];var a=getAuthorName(n);t++;c=p==o?c:t;i=i.replace("{{PLACE}}",c+".").replace("{{NAME}}",a).replace("{{LANGUAGE}}",u).replace("{{SIZE}}",o).replace("{{LINK}}",n.share_link);i=$(i);p=o;$("#answers").append(i);e[u]=e[u]||{lang:u,user:a,size:o,link:n.share_link}});var n=[];for(var r in e)if(e.hasOwnProperty(r))n.push(e[r]);n.sort(function(e,t){if(e.lang>t.lang)return 1;if(e.lang<t.lang)return-1;return 0});for(var i=0;i<n.length;++i){var s=$("#language-template").html();var r=n[i];s=s.replace("{{LANGUAGE}}",r.lang).replace("{{NAME}}",r.user).replace("{{SIZE}}",r.size).replace("{{LINK}}",r.link);s=$(s);$("#languages").append(s)}}var QUESTION_ID=49042;var ANSWER_FILTER="!t)IWYnsLAZle2tQ3KqrVveCRJfxcRLe";var answers=[],page=1;getAnswers();var SIZE_REG=/\d+(?=[^\d&]*(?:<(?:s>[^&]*<\/s>|[^&]+>)[^\d&]*)*$)/;var NUMBER_REG=/\d+/;var LANGUAGE_REG=/^#*\s*([^,]+)/
body{text-align:left!important}#answer-list,#language-list{padding:10px;width:290px;float:left}table thead{font-weight:700}table td{padding:5px}
<script src=https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js></script><link rel=stylesheet type=text/css href="//cdn.sstatic.net/codegolf/all.css?v=83c949450c8b"><div id=answer-list><h2>Leaderboard</h2><table class=answer-list><thead><tr><td></td><td>Author<td>Language<td>Size<tbody id=answers></table></div><div id=language-list><h2>Winners by Language</h2><table class=language-list><thead><tr><td>Language<td>User<td>Score<tbody id=languages></table></div><table style=display:none><tbody id=answer-template><tr><td>{{PLACE}}</td><td>{{NAME}}<td>{{LANGUAGE}}<td>{{SIZE}}<td><a href={{LINK}}>Link</a></table><table style=display:none><tbody id=language-template><tr><td>{{LANGUAGE}}<td>{{NAME}}<td>{{SIZE}}<td><a href={{LINK}}>Link</a></table>
n
потому что Brainfuck не может взять 2-символьную строку, вам нужно будет ввести первый байт, затем второй для первого значения, а затем сделать это снова для второго значения, всего 4 ввода. Их может быть сколько угодно.Ответы:
Желе ,
2421 байтВыбранные значения:
[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)
Как?
источник
1F
), то есть мне не нужно «правильно» интерпретировать шестнадцатеричные входы или добавить 16, чтобы дать мне две шестнадцатеричные цифры для преобразования обратно.JavaScript (ES6),
1181151121028281 байтСохранено 1 байт благодаря ETHproductions
Выбранные значения:
0x04
/0x0f
).0x00
(минимальное значение).0x15
(максимальное значение).Предыдущая версия (97 байт)
Генерация псевдослучайного списка «истинных» шестнадцатеричных значений:
Последовательность:
источник
[a,b]=prompt().split(' ')
в командной строке. Во всяком случае, мой обновленный ответ должен исправить это.JavaScript (ES6),
107 152137 байтПоказать фрагмент кода
Выбранные значения:
Входы:
0x14
InternalError: too much recursion
NaN
за пределами.Предыдущие решения:
152 байта:
107 байт, неверное решение (отсутствуют входные данные):
источник
console.log(...)
хотя. ;)var
и последнее;
не являются частью ответа. Это только для фрагмента, поэтому я добавил перенос строки. Я отредактирую ответ.Питон,
888786 байт1 байтовое сохранение благодаря @JonathanAllan
1 байтовое сохранение снова в @JonathanAllan
Также изменилась база кода, теперь намного приятнее.
Выбранные значения:
00
для всего.Та же идея, что и у моего C ответа. На этот раз, однако, код получает один ввод от пользователя, требующий пробела между обоими значениями, разделяет их, приводит к шестнадцатеричным значениям и печатает каждый гекс в
l
массиве, включая и между двумя введенными значениями. Поскольку в Python есть великолепная система обнаружения ошибок, переполнения буфера не происходит, и поэтому код намного более безопасен. Программа безопасна от неопределенного поведения в том смысле, что она не будет выполняться, когда более высокое значение будет передано перед более низким значением.Это должно работать на Python 2.x и 3.x; Пожалуйста, исправьте меня, если я ошибаюсь, поскольку у меня нет доступа к обоим переводчикам, потому что моя система не поддерживает их обоих.
источник
C ++,
989593 байтаМои выбранные значения - все 0
источник
04
и06
я получил только два значения назад. Я подозреваю, что это05
и06
ценности. Вам необходимо указать все значения между введенными значениями, включая их.Perl,
794541 байт"минимальное значение $ 10" - пример имеет минимум $ 00 - это опечатка?
Вот довольно скучный perl-ответ в 41 байт (было 46, а потом я продолжал видеть пробелы, паренсы, которые я мог выбить). Принимает ввод в две строки.
Данные списка 04..1A
Раньше я был слишком умен с упаковкой и распаковкой. Его входные байты вводятся сразу же вместе, например, «020E» будет печатать 2-й-14-й записи
Можете попробовать сыграть в гольф больше, используя все 0
substr
, иprintf'%*vX'
... Нет, это делает мой ответ длиннее. 48 символов (используя строку ascii '7', шестнадцатеричный 37 в качестве данных)источник
CJam, 22 байта
Выбранные значения:
Попробуйте онлайн
источник
Скала, 45 байт
Ungolfed:
Использование
00
вFF
качестве значений, но работает до 2147483647.источник
error: ')' expected but string literal found.
вa.to(b).map(
С
176175161 байтСпасение 1 байта благодаря @JonathanAllan Огромная
помощь благодаря @Downvoter за спасение мне 14 байтов!
Попробуйте онлайн!
Выбранные значения:
00
для всего.Ответ не в гольф:
Хитрость в том, чтобы взять два входа и попытаться преобразовать их в шестнадцатеричные строки, а затем привести к целым числам. Так как нет проверки ошибок или чего-либо подобного, неопределенное поведение просто вызывает ошибки и нарушает работу программы. Пользователь должен ввести два ввода, однако мой компилятор Eclipse CDT, кажется, позволяет мне вводить их оба в одной строке с пробелом между ними.
Они должны быть в правильном порядке, так как запрос большего значения, прежде чем меньшее значение не запустит
while
-loop вообще.Дело в том, что также отсутствует защита от переполнения буфера, поэтому я могу просто запросить что-то абсурдное, например, диапазон от $ 0 до $ FFFF, и я получу все в памяти моего компьютера с самого начала выделения памяти для
a[44]
массива. , вплоть до 65536 значений позже.источник
%x
напрямую?char s[2]
вместоmalloc
материала? Кастингmalloc
«s возвращаемого значения не является необходимым в C в любом случае.printf("%d%d ", ...)
части, заменив форматирование просто%x
возвращает0
«вместо00
», а не размечает их.scanf
.GNU sed, 209 + 1 (флаг r) = 210 байт
Попробуйте онлайн!В выводе присутствует один ведущий пробел, надеюсь, это разрешено.
Запустите примеры:
Объяснение: 22 сохраненных шестнадцатеричных значения совпадают со значениями из примера OP
Начальный и конечный индексы читаются в отдельных строках. Выходные данные представляют собой одну строку со значениями таблицы в этом диапазоне индекса (включительно). Неопределенный ввод напишет несколько строк неверного вывода.
источник
PHP,
106 105 10496 + 2 байтаили
Беги с
php -nr '<code>' <lowindex> <highindex>
; экранировать одинарные кавычки в коде.... или проверить это онлайн .
dechex
интерпретирует ввод как шестнадцатеричные строки, поскольку символы являются шестнадцатеричными цифрами,0
если ввод начинается с чего-то еще.ничего не печатает, если первое значение больше второго.
выбранные значения:
(первые 22 кода ASCII выполненного кода)
или
с этими значениями:
источник
<?php
чанк?-r
. И если мне нужно сохранить его в файл, я использую тэг open open<?
.a
,z
иProgramingPuzles_CGolf
не определены. ВProgramingPuzles_CGolf
любом случае, откуда? : /stderr
к ,/dev/null
если вы не похожие на них. PHP оценивает неопределенные константы в строки.Apple II 6502 в сборе, 75 байт
Байт-код:
Разборка:
Он формирует массив в памяти, который выглядит как вывод. Выбранные значения:
Пользователь нажимает четыре клавиши, чтобы установить входы.
источник