Desafio
Recentemente, entrei em computadores de 8 bits e sou fascinado com o funcionamento deles e de outros; portanto, o objetivo desse código de golfe é replicar uma parte do Woz Monitor, projetada por Steve Wozniak para o Apple I.
Você deve armazenar uma matriz de 22 valores hexadecimais com uma largura de dois bytes (valor mínimo $ 10 , valor máximo $ FF ) e, em seguida, n- quantidade de entradas. (Normalmente dois; idiomas como Brainfuck podem ter dificuldade).
As entradas referem-se ao local da matriz para iniciar a impressão e para onde parar; uma entrada com comportamento definido terá seu valor inicial menor ou igual ao valor final. Seu programa deve ser capaz de imprimir todos os valores hexadecimais entre e incluindo os hexadecimais inseridos.
Um exemplo disso:
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
Agora, a parte interessante deste exercício é que você pode usar o que quiser para verificar os limites da entrada do usuário. Entradas de pessoas hello
e seu programa tem comportamento indefinido? Desiste sem aviso prévio? Ambos são válidos.
As únicas regras são:
1. Você deve incluir os valores dos 22 valores hexadecimais como parte do seu programa antes de iniciar (não pode pedir entradas ao usuário).
2. A saída dos valores hexadecimais deve seguir o formato exato:
00 FF 00 FF 00
Espaços, tabulações ou linhas à direita estão OK. Personagens não são.
3. O programa não precisa solicitar as entradas com uma mensagem. Deixe a "mensagem" em branco, se desejar. O usuário deve inserir os limites hexadecimais no entanto.
4. Como você decide com os valores dos 22 hexadecimais, você deve criar um programa que realmente busque os valores do armazenamento, em vez de imitar um programa simplesmente imprimindo valores. (como uma lista de US $ 00 ).
5) n-quantidade de entradas, refere-se à quantidade de entradas necessária para o seu idioma de escolha reconhecer um hexadecimal de dois bytes de largura. por exemplo. (O Brainfuck precisará de duas entradas por hexadecimal, tornando-a quatro para as duas).
Fique à vontade para comentar se precisar de esclarecimentos.
Isso é código de golfe, então a resposta mais curta no número de bytes é o vencedor.
Entre os melhores
Aqui está um cabeçalho de geração de snippet, cortesia de Martin Ender .
Para garantir que sua resposta seja exibida, inicie-a com um título, usando o seguinte modelo de remarcação:
# Language Name, N bytes
onde N
está o tamanho do seu envio. Se você melhorar sua pontuação, poderá manter as pontuações antigas no título, identificando-as. Por exemplo:
# 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
como o Brainfuck não pode receber uma sequência de 2 caracteres, você precisaria inserir o primeiro byte, depois o segundo para o primeiro valor e, em seguida, fazê-lo novamente para o segundo valor, 4 entradas no total. Eles podem ser quantos você quiser.Respostas:
Geléia ,
2421 bytesValores escolhidos:
[00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 1F 10 11 12 13 14 15]
TryItOnline
Se a segunda entrada for menor que a primeira, ela emitirá a sequência reversa.
O comportamento fora dos limites é indefinido (por exemplo, "foo", "14" retorna 38 valores, a maioria nem mesmo na matriz e muitos com o comprimento 2)
Quão?
fonte
1F
), o que significa que não era necessário "interpretar corretamente" as entradas hexadecimais ou adicionar 16 para fornecer dois dígitos hexadecimais para converter novamente.JavaScript (ES6),
1181151121028281 bytesEconomizou 1 byte graças à ETHproductions
Valores escolhidos:
0x04
/0x0f
).0x00
(valor mínimo).0x15
(valor máximo).Versão anterior (97 bytes)
Gerando uma lista pseudo-aleatória de valores hexadecimais 'verdadeiros':
Seqüência:
fonte
[a,b]=prompt().split(' ')
na linha de comando. De qualquer forma, minha resposta atualizada deve corrigir isso.JavaScript (ES6),
107 152137 bytesMostrar snippet de código
Valores escolhidos:
Entradas:
0x14
InternalError: too much recursion
NaN
fora dos limites.Soluções anteriores:
152 bytes:
107 bytes, solução inválida (falta de entradas):
fonte
console.log(...)
. ;)var
e o último;
não fazem parte da resposta. É apenas para o trecho, é por isso que adicionei quebra de linha. Vou editar a resposta.Python,
888786 bytes1 byte save graças a @JonathanAllan
1 byte save novamente a @JonathanAllan
Também mudou a base do código, muito melhor agora.
Valores escolhidos:
00
para tudo.Mesma ideia que a minha resposta C. Desta vez, no entanto, o código recebe uma única entrada do usuário, exigindo um espaço entre os dois valores, dividi-los, convertê-los em valores hexadecimais e imprimir todos os hexadecimais da
l
matriz, incluindo e entre os dois valores inseridos. Como o Python possui um sistema magnífico de captura de erros, nenhum estouro de buffer está presente e, portanto, o código é muito mais seguro. O programa está protegido contra comportamentos indefinidos, no sentido de que não será executado quando um valor mais alto for submetido antes de um valor mais baixo.Isso deve funcionar no Python 2.xe 3.x; Corrija-me se estiver errado, pois não tenho acesso aos dois intérpretes devido ao meu sistema não suportar os dois.
fonte
C ++,
989593 bytesMeus valores escolhidos são todos os 0s
fonte
04
e06
, só recebi dois valores. Estou suspeitando estes são os05
e06
valores. Você precisa fornecer todos os valores entre e incluindo os valores inseridos.Perl,
794541 bytes"valor mínimo de US $ 10" - o exemplo tem um mínimo de US $ 00 - é um erro de digitação?
Aqui está uma resposta perl bastante chata em 41 bytes (tinha 46 anos e eu continuava vendo espaços, parênteses que eu podia evitar). Recebe entrada em duas linhas.
Os dados são uma lista 04..1A
Antes eu estava sendo muito esperto em embalar e descompactar. Seus bytes de entrada são inseridos ao mesmo tempo juntos, por exemplo, "020E 'imprime as 2ª e 14ª entradas
Pode tentar jogar mais usando todos os zeros
substr
, eprintf'%*vX'
... não, isso está aumentando minha resposta. 48 caracteres (usando uma sequência de caracteres ascii '7', hex 37 como dados)fonte
CJam, 22 bytes
Valores escolhidos:
Experimente online
fonte
Scala, 45 bytes
Ungolfed:
Usos
00
paraFF
como valores, mas funciona até 2147483647.fonte
error: ')' expected but string literal found.
ata.to(b).map(
C,
176175161 bytes1 byte save graças a @ JonathanAllan
Ajuda maciça graças a @Downvoter por me salvar 14 bytes!
Experimente online!
Valores escolhidos:
00
para tudo.Resposta sem golfe:
O truque é pegar duas entradas e tentar convertê-las em seqüências hexadecimais e depois converter em números inteiros. Como não há verificação de erros ou algo semelhante, o comportamento indefinido é simplesmente gerar erros e interromper o programa. O usuário precisa digitar duas entradas, no entanto, meu compilador Eclipse CDT parece permitir que eu insira ambas na mesma linha com um espaço entre elas.
Eles devem estar na ordem correta, pois solicitar um valor maior antes que um valor menor não execute o
while
loop.O problema é que também não há proteção contra buffer overflow; portanto, posso simplesmente solicitar algo absurdo, como um intervalo de US $ 0 a US $ FFFF, e receberei tudo na memória de meus computadores desde o início da alocação de memória para o
a[44]
array , até 65536 valores posteriormente.fonte
%x
diretamente?char s[2]
vez dasmalloc
coisas? Omalloc
valor de retorno da transmissão não é necessário em C de qualquer maneira.printf("%d%d ", ...)
peça, substituindo a formatação por%x
apenas retornos0
, em vez de retornos00
, e não os espaça.scanf
.GNU sed, 209 + 1 (sinalizador r) = 210 bytes
Experimente online! Um espaço principal está presente na saída, espero que seja permitido.
Execute exemplos:
Explicação: os 22 valores hexadecimais armazenados são os mesmos do exemplo do OP
Os índices inicial e final são lidos em linhas separadas. A saída é uma única linha com os valores da tabela nesse intervalo de índice (inclusive). A entrada indefinida gravará várias linhas de saída inválida.
fonte
PHP,
106 105 10496 + 2 bytesou
Corra com
php -nr '<code>' <lowindex> <highindex>
; escape das aspas simples no código.... ou testá-lo online .
dechex
interpreta a entrada como seqüências hexadecimais até os caracteres serem dígitos hexadecimais,0
se a entrada começar com outra coisa.imprime nada se o primeiro valor for maior que o segundo.
valores escolhidos:
(primeiros 22 códigos ASCII do código executado)
ou
com estes valores:
fonte
<?php
pedaço?-r
. E se eu precisar armazená-lo em um arquivo, eu uso a pequena tag aberta<?
.a
,z
eProgramingPuzles_CGolf
são indefinido. De ondeProgramingPuzles_CGolf
veio afinal? : /stderr
para/dev/null
se você não gostar deles. O PHP avalia as constantes indefinidas em strings.Montagem do Apple II 6502, 75 bytes
Código de bytes:
Desmontagem:
Ele forma uma matriz na memória que se parece com a saída. Os valores escolhidos são:
O usuário pressiona quatro teclas para definir as entradas.
fonte