Isso é baseado no xkcd # 153 .
Crie um programa ou função nomeada com dois parâmetros, cada um dos quais é uma sequência de caracteres ou uma lista ou matriz de bytes ou caracteres. O segundo parâmetro conterá apenas caracteres extraídos lrfu
(ou os bytes ASCII equivalentes). Deve ser interpretado como uma série de instruções a serem executadas em uma sequência de bits representada pelo primeiro parâmetro.
O processamento realizado deve ser equivalente ao seguinte:
- Converta o primeiro parâmetro em uma única cadeia de bits formada concatenando os bits de cada caractere (interpretado como um dos ASCII de 7 bits, um ASCII estendido de 8 bits ou uma codificação Unicode padrão). Por exemplo, se o primeiro parâmetro for
"AB"
, esse seria um de 10000011000010
(7 bits), 0100000101000010
(8 bits ou UTF-8) 00000000010000010000000001000010
ou 01000001000000000100001000000000
(UTF-16 nas duas endiannesses), etc.
- Para cada caractere no segundo parâmetro, em ordem, execute a instrução correspondente:
l
gira a sequência de bits da esquerda. Por exemplo, 10000011000010
torna-se 00000110000101
.
r
gira a sequência de bits certa. Por exemplo, 10000011000010
torna-se 01000001100001
.
f
vira (ou inverte) cada bit na cadeia de bits. Por exemplo, 10000011000010
torna-se 01111100111101
.
u
inverte a cadeia de bits. Por exemplo, 10000011000010
torna-se 01000011000001
.
- Converta a sequência de bits em uma sequência ASCII que usa um caractere por bit. Por exemplo,
10000011000010
torna-se "10000011000010"
. Isso ocorre porque nem todos os conjuntos de 7/8 bits têm um caractere atribuído a eles.
Exemplo (em Python):
>>> f("b", "rfu")
01110011
Ele se transforma "b"
em sua representação binária ASCII de 8 bits 01100010
, gira-o para a direita ( 00110001
), vira cada bit ( 11001110
) e o inverte ( 01110011
).
Flexibilidade
Outros caracteres podem ser usados em vez dos personagens l
, r
, f
, e u
, mas eles devem ser claramente documentados.
Placar
Agradecemos ao @Optimizer por criar o seguinte snippet de código. Para usar, clique em "Mostrar trecho de código", role para baixo e clique em "► Executar trecho de código".
var QUESTION_ID = 45087; var answers = [], page = 1;var SCORE_REG = /\d+(?=[^\d&]*(?:<(?:s>[^&]*<\/s>|[^&]+>)[^\d&]*)*$)/;function url(index) {return "http://api.stackexchange.com/2.2/questions/" + QUESTION_ID + "/answers?page=" + index + "&pagesize=100&order=desc&sort=votes&site=codegolf&filter=!t)IWYnsLAZle2tQ3KqrVveCRJfxcRLe";}function getAnswers() {$.ajax({url: url(page++),method: "get",dataType: "jsonp",crossDomain: true,success: function (data) {answers.push.apply(answers, data.items);if (data.has_more) getAnswers();else process()}});}getAnswers();function shouldHaveHeading(a) {var pass = false;try {pass |= /^(#|<h).*/.test(a.body_markdown);pass |= ["-", "="].indexOf(a.body_markdown.split("\n")[1][0]) > -1;} catch (ex) {}return pass;}function shouldHaveScore(a) {var pass = false;try {pass |= SCORE_REG.test(a.body_markdown.split("\n")[0]);} catch (ex) {}return pass;}function getRelDate(previous) {var current = Date.now();var msPerMinute = 60 * 1000;var msPerHour = msPerMinute * 60;var msPerDay = msPerHour * 24;var msPerMonth = msPerDay * 30;var msPerYear = msPerDay * 365;var elapsed = current - previous;if (elapsed < msPerMinute) {return Math.round(elapsed/1000) + ' seconds ago';}if (elapsed < msPerHour) {return Math.round(elapsed/msPerMinute) + ' minutes ago';}if (elapsed < msPerDay ) {return Math.round(elapsed/msPerHour ) + ' hours ago';}if (elapsed < msPerMonth) {return 'approx. ' + Math.round(elapsed/msPerDay) + ' days ago';}if (elapsed < msPerYear) {return 'approx. ' + Math.round(elapsed/msPerMonth) + ' months ago';}return 'approx. ' + Math.round(elapsed/msPerYear ) + ' years ago';}function process() {answers = answers.filter(shouldHaveHeading);answers = answers.filter(shouldHaveScore);answers.sort(function (a, b) {var aB = +(a.body_markdown.split("\n")[0].match(SCORE_REG) || [Infinity])[0],bB = +(b.body_markdown.split("\n")[0].match(SCORE_REG) || [Infinity])[0];return aB - bB});answers.forEach(function (a) {var answer = $("#answer-template").html();answer = answer.replace("{{BODY}}", a.body).replace("{{NAME}}", a.owner.display_name).replace("{{REP}}", a.owner.reputation).replace("{{VOTES}}", a.score).replace("{{DATE}}", new Date(a.creation_date*1e3).toUTCString()).replace("{{REL_TIME}}", getRelDate(a.creation_date*1e3)).replace("{{POST_LINK}}", a.share_link).replace(/{{USER_LINK}}/g, a.owner.link).replace('{{img}}=""', "src=\"" + a.owner.profile_image + '"');answer = $(answer);if (a.is_accepted) {answer.find(".vote-accepted-on").removeAttr("style");}$("#answers").append(answer);});}
body { text-align: left !important}
<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="answers"></div><div id="answer-template" style="display: none"><div class="answer" ><table><tbody><tr><td class="votecell"><div class="vote"><span style="cursor: pointer;" title="Total Votes" itemprop="upvoteCount" class="vote-count-post ">{{VOTES}}</span><span style="display: none" class="vote-accepted-on load-accepted-answer-date" title="The question owner accepted this as the best answer">accepted</span></div></td><td class="answercell"><div class="post-text" itemprop="text">{{BODY}}</div><table class="fw"><tbody><tr><td class="vt"><div class="post-menu"><a href="{{POST_LINK}}" title="short permalink to this answer" class="short-link">share</a></div></td><td class="post-signature" align="right"><div class="user-info "><div class="user-action-time">answered <span title="{{DATE}}" class="relativetime">{{REL_TIME}}</span></div><div class="user-gravatar32"></div><div class="user-details"><br></div></div></td><td class="post-signature" align="right"><div class="user-info user-hover"><div class="user-action-time"></div><div class="user-gravatar32"><a href="{{USER_LINK}}"><div class="gravatar-wrapper-32"><img {{img}} alt="" height="32" width="32"></div></a></div><div class="user-details"><a href="{{USER_LINK}}">{{NAME}}</a><br><span class="reputation-score" title="reputation score " dir="ltr">{{REP}}</span></div></div></td></tr></tbody></table></td></tr></tbody></table></div></div>
"rrfrburb"
? Além disso, quando alguém muda ou reverte os bits, o faz para cada letra individual ou para a cadeia como um todo? Mais casos de teste tornariam isso mais claro.Respostas:
CJam,
3432 bytesEle usa os seguintes caracteres para obter instruções:
A entrada é retirada de STDIN com a palavra na primeira linha e a sequência de instruções na segunda linha.
Teste aqui.
Explicação
Obter a sequência de bits é realmente apenas uma questão de interpretar os códigos de caracteres como os dígitos de um número de base 256 (e obter sua representação de base 2). O difícil é que a última conversão de base não irá preencher o resultado com 0s à esquerda. Portanto, adiciono um 1 inicial à entrada inicial e, em seguida, separo esse 1 novamente na representação binária. Como exemplo, se for a entrada
ab
, transformo isso em uma matriz[1 'a 'b]
, interpreto isso como base-256 (os caracteres são convertidos automaticamente em códigos de caracteres), que é90466
e a base-2, que é[1 0 1 1 0 0 0 0 1 0 1 1 0 0 0 1 0]
. Agora, se eu remover essa liderança1
, tenho o fluxo de bits que estou procurando.É isso que essa parte do código faz:
Agora, leio a lista de instruções e executo um bloco para cada caractere na sequência de instruções:
A primeira coisa a fazer é avaliar o caráter e inteiros reais
0
,1
,2
ou3
. Agora, a verdadeira mágica do golfe ... dependendo da instrução, quero executar um pequeno pedaço de código que implementa a operação:Eu poderia armazená-los em uma matriz de blocos e escolher o bloco certo para executar, mas codificá-los em uma string é realmente mais curto:
Primeiro, eu uso o número inteiro associado à instrução para cortar o início da string. Portanto, para rotação à esquerda, a string não é alterada; para rotação à direita, o primeiro caractere é descartado e assim por diante. Então eu seleciono cada quarto caractere da string, começando do primeiro, com
4%
. Observe como os quatro trechos de código são distribuídos por toda a cadeia. Finalmente, apenas avalio a string como código~
.A sequência de bits é impressa automaticamente no final do programa.
fonte
1m<
que ao invés de(+
? Você está trabalhando em uma matriz e não em um número, não está?CJam, 34 bytes
Outra abordagem no CJam.
O texto de entrada está na primeira linha e as instruções estão na segunda linha.
Instruções:
fonte
f~
não foi implementada, não é? ;)Pitão 33
Usos:
Pyth github
Experimente online aqui.
Este é um programa que aceita a cadeia de caracteres como seu primeiro argumento e a cadeia de comandos como o segundo argumento. Na versão online, você deve fornecer as strings separadas por uma nova linha, assim:
Explicação:
Algo que eu não conseguia entender: o Pyth
reduce
usa automaticamenteG
para o valor anterior eH
para o próximo valor.fonte
lrfu
, mas devem ser claramente documentadas". (ênfase minha)Scala - 192
fonte
Matlab (166 bytes)
Isso usa letras em
abcd
vez delrfu
respectivamente.Alguns truques usados aqui para economizar espaço:
abcd
letras me permite subtrair97
uma vez, e, em seguida, as letras tornam-se0
,1
,2
,3
. Isso economiza espaço nas cláusulasswitch
-case
.circshift
como uma função anônima de uma letra também economiza espaço, pois é usada duas vezes.D
consiste em'0'
e'1'
caracteres (códigos ASCII48
e49
), a instruçãoD=char(97-D)
corresponde à inversão entre'0'
e'1'
valores. Observe que isso97
não tem nada a ver com o mencionado acima.'
é usada em vez da transposição.'
.fonte
Python 2 - 179
fonte
C #, 418 bytes
Formatado:
fonte
J, 164
Formatado:
Exemplo
fonte
JavaScript (E6), 163
167Totalmente usando a flexibilidade de entrada, uma função nomeada com 2 parâmetros de matriz.
A função retorna uma sequência de caracteres composta de '1' e '0'
Exemplo de
f("b", "rfu")
conversão paraF([98],[82,70,85])
, resultado é0111001
Observe que o uso de cadeias de caracteres é muito mais longo em javascript! Contagem de bytes 186
Exemplo
F("b", "RFU")
, resultado é0111001
novamentefonte
Ruby, 151
Bastante direto. Loops através dos personagens
s
e executam uma ação para qualquer um deles.fonte
Python 2, 142
Semelhante à minha resposta pyth na abordagem: eu construo uma lista de todas as seqüências de caracteres e o indexo com base no valor da sequência de instruções que eu itero usando usando reduzir.
Usos:
fonte