Introdução
Enquanto estudava, tentei encontrar várias maneiras de enganar um teste de múltipla escolha. Basicamente, é uma versão compactada das respostas de múltipla escolha. O método é o seguinte:
As respostas para o teste:
BCAABABA
Eles podem ser convertidos em três matrizes diferentes, o que indica verdadeiro ou falso se a letra atual for a resposta:
B C A A B A B A
A: [0, 0, 1, 1, 0, 1, 0, 1]
B: [1, 0, 0, 0, 1, 0, 1, 0]
C: [0, 1, 0, 0, 0, 0, 0, 0]
Interpretar esses números como binários comprimiria muito isso. Mas isso pode realmente ser compactado um pouco mais. Se você conhece as posições de A e B, não precisa das posições de C. Isso pode ser feito com um operador NOT bit a bit:
A: [0, 0, 1, 1, 0, 1, 0, 1]
B: [1, 0, 0, 0, 1, 0, 1, 0]
A+B: [1, 0, 1, 1, 1, 1, 1, 1]
C: [0, 1, 0, 0, 0, 0, 0, 0]
A conversão das matrizes A e B em números binários resultaria em:
A: 00110101
B: 10001010
Isso significa que 8 respostas de múltipla escolha podem ser compactadas para dois bytes!
Tarefa
Dados dois números em binário, ou duas matrizes que consistem em apenas 0 e 1 com o mesmo comprimento, produzem as respostas de múltipla escolha
Regras
- A entrada pode estar na forma que você quiser, como
[1, 0, 0, 1]
ou1001
. - Você pode fornecer um programa ou uma função.
- Você pode assumir que a entrada é sempre válida.
- Você também pode imprimir como uma lista, separada por espaços, etc.
- As respostas de múltipla escolha consistem apenas em A, B e C. No entanto, você pode usar letras minúsculas.
- Isso é código-golfe , então a submissão com a menor quantidade de bytes ganha!
Casos de teste
Input: [1, 0, 0, 1, 0, 0, 1] [0, 1, 0, 0, 1, 0, 0]
Output: ABCABCA
Input: [0, 0, 0, 0, 1, 0, 1, 1] [1, 0, 1, 0, 0, 0, 0, 0]
Output: BCBCACAA
Input: [0, 0, 0, 0, 0, 0, 0, 0, 0, 0] [0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
Output: CCCCCCCCCC
Entre os melhores
var QUESTION_ID=69770,OVERRIDE_USER=34388;function answersUrl(e){return"http://api.stackexchange.com/2.2/questions/"+QUESTION_ID+"/answers?page="+e+"&pagesize=100&order=desc&sort=creation&site=codegolf&filter="+ANSWER_FILTER}function commentUrl(e,s){return"http://api.stackexchange.com/2.2/answers/"+s.join(";")+"/comments?page="+e+"&pagesize=100&order=desc&sort=creation&site=codegolf&filter="+COMMENT_FILTER}function getAnswers(){jQuery.ajax({url:answersUrl(answer_page++),method:"get",dataType:"jsonp",crossDomain:!0,success:function(e){answers.push.apply(answers,e.items),answers_hash=[],answer_ids=[],e.items.forEach(function(e){e.comments=[];var s=+e.share_link.match(/\d+/);answer_ids.push(s),answers_hash[s]=e}),e.has_more||(more_answers=!1),comment_page=1,getComments()}})}function getComments(){jQuery.ajax({url:commentUrl(comment_page++,answer_ids),method:"get",dataType:"jsonp",crossDomain:!0,success:function(e){e.items.forEach(function(e){e.owner.user_id===OVERRIDE_USER&&answers_hash[e.post_id].comments.push(e)}),e.has_more?getComments():more_answers?getAnswers():process()}})}function getAuthorName(e){return e.owner.display_name}function process(){var e=[];answers.forEach(function(s){var r=s.body;s.comments.forEach(function(e){OVERRIDE_REG.test(e.body)&&(r="<h1>"+e.body.replace(OVERRIDE_REG,"")+"</h1>")});var a=r.match(SCORE_REG);a&&e.push({user:getAuthorName(s),size:+a[2],language:a[1],link:s.share_link})}),e.sort(function(e,s){var r=e.size,a=s.size;return r-a});var s={},r=1,a=null,n=1;e.forEach(function(e){e.size!=a&&(n=r),a=e.size,++r;var t=jQuery("#answer-template").html();t=t.replace("{{PLACE}}",n+".").replace("{{NAME}}",e.user).replace("{{LANGUAGE}}",e.language).replace("{{SIZE}}",e.size).replace("{{LINK}}",e.link),t=jQuery(t),jQuery("#answers").append(t);var o=e.language;/<a/.test(o)&&(o=jQuery(o).text()),s[o]=s[o]||{lang:e.language,user:e.user,size:e.size,link:e.link}});var t=[];for(var o in s)s.hasOwnProperty(o)&&t.push(s[o]);t.sort(function(e,s){return e.lang>s.lang?1:e.lang<s.lang?-1:0});for(var c=0;c<t.length;++c){var i=jQuery("#language-template").html(),o=t[c];i=i.replace("{{LANGUAGE}}",o.lang).replace("{{NAME}}",o.user).replace("{{SIZE}}",o.size).replace("{{LINK}}",o.link),i=jQuery(i),jQuery("#languages").append(i)}}var ANSWER_FILTER="!t)IWYnsLAZle2tQ3KqrVveCRJfxcRLe",COMMENT_FILTER="!)Q2B_A2kjfAiU78X(md6BoYk",answers=[],answers_hash,answer_ids,answer_page=1,more_answers=!0,comment_page;getAnswers();var SCORE_REG=/<h\d>\s*([^\n,]*[^\s,]),.*?(\d+)(?=[^\n\d<>]*(?:<(?:s>[^\n<>]*<\/s>|[^\n<>]+>)[^\n\d<>]*)*<\/h\d>)/,OVERRIDE_REG=/^Override\s*header:\s*/i;
body{text-align:left!important;font-family:Arial}#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><td>Language</td><td>Size</td></tr></thead> <tbody id="answers"> </tbody> </table> </div><div id="language-list"> <h2>Winners by Language</h2> <table class="language-list"> <thead> <tr><td>Language</td><td>User</td><td>Score</td></tr></thead> <tbody id="languages"> </tbody> </table> </div><table style="display: none"> <tbody id="answer-template"> <tr><td>{{PLACE}}</td><td>{{NAME}}</td><td>{{LANGUAGE}}</td><td>{{SIZE}}</td><td><a href="{{LINK}}">Link</a></td></tr></tbody> </table> <table style="display: none"> <tbody id="language-template"> <tr><td>{{LANGUAGE}}</td><td>{{NAME}}</td><td>{{SIZE}}</td><td><a href="{{LINK}}">Link</a></td></tr></tbody> </table>
Study.
. Seis bytes. Bata isso.Respostas:
Geléia,
76 bytesDigitando no telefone. Irá adicionar descrição.(1,0)
vai paraA
,(0,1)
paraB
e(0,0)
paraC
. As matrizes no Jelly são baseadas em 1 e a função de indexação funcionaị
ciclicamente. Portanto, podemos apenas dobrar a subtração sobre a entrada.Experimente aqui .
fonte
Retina , 44 bytes
O avanço de linha à direita é significativo. Entrada é como
Experimente online!
Explicação
Comece ligando
0
s paraB
e1
é emA
. Isso corrige a primeira metade, exceto que listaB
quando deve conterC
. Podemos identificar essesB
s errados , verificando se há umB
na mesma posição da segunda string:O lookahead é uma técnica clássica de contagem de grupos para equilibrar as posições dos dois
B
segundos. A(.)*
contagem do sufixo após a primeira éB
inserida uma captura no grupo1
para cada personagem. Em seguida,(?<-1>.)*
aparece a partir desse grupo novamente. Os$
garante que podemos chegar ao final da string como essa, e as(?(1)!)
garante que nós realmente esgotado todo o grupo.Finalmente, nos livramos do espaço de separação e da segunda string:
fonte
J, 8 bytes
Uso:
Experimente online aqui.
fonte
JavaScript ES6, 36 bytes
Muito simples e provavelmente óbvio o suficiente para entender: Mapeie cada item e indexe
a
para o char na posição (x*2
+ item no indexy
inb
) em"CBA"
.fonte
CBA
faz isso. Além disso, ele não pode, de qualquer maneira, porquedo
é uma palavra-chave reservada, portanto, é uma sintaxe inválida.MATL ,
149 bytesUsa a versão atual (10.1.0)
Experimente online!
Explicação
Resumo do que o código faz
Explicação detalhada de como funciona
fonte
Java, 81 bytes
Sem reputação de comentar a solução Java já existente, então aqui vai:
fonte
brainfuck, 52 bytes
Requer um intérprete que permite ir para a esquerda da célula 0 e possui células de quebra automática de 8 bits. Ao contrário da maioria das minhas respostas, o comportamento da EOF não importa.
Recebe entrada de bytes, com
0xFF
como delimitador. Um fluxo de bytes representando a primeira entrada em "Casos de teste" seria assim:Eu poderia salvar alguns bytes tendo
0x00
como delimitador e usando0x01
e0x02
como 0 e 1 respectivamente, mas isso parecia trapaça: PDepois que eu descobri minha estratégia, escrever este programa foi muito fácil. Para encontrar a enésima letra da saída, comece com
0x43
(capital C em ASCII) e subtraia ((enésimo elemento da primeira sequência) * 2 + enésimo elemento da segunda sequência)Para o que vale a pena, aqui está o programa de 52 bytes dividido em 3 linhas e com algumas palavras ao lado:
fonte
Haskell, 29 bytes
Uma função anônima. Use como:
Tentei deixar a função livre de pontos, mas fiquei totalmente confusa.
fonte
zipWith((!!).(["CB","AC"]!!))
Pitão,
181610 bytes3 RD tentar: 10 bytes
Agradeço a FryAmTheEggman por me lembrar da existência de
G
!A entrada é do formato [[0,0,1,1,0,1,0,1], [1,0,0,0,1,0,1,0]], que é essencialmente uma matriz: linha para escolha e coluna para número da pergunta.
Pseudocódigo pitônico compilado à mão:
2 nd tentativa: 16 bytes
A entrada é do formato [[0,0,1,1,0,1,0,1], [1,0,0,0,1,0,1,0]], que é essencialmente uma matriz: linha para escolha e coluna para número da pergunta.
Isso compila para
Ok, eu sei que isso parece confuso, então vamos compilar manualmente com o pseudocódigo python
1 st tentativa: 18 bytes
Com entrada do formulário [0,0,1,1,0,1,0,1,1,0,0,0,1,0,1,0], essencialmente concatenação de duas listas. Isso compila para
Mais uma vez, compilando manualmente
E lá vai o primeiro codegolf da minha vida !!! Eu aprendi Pyth ontem, e é a primeira vez que participei de um código de golfe.
fonte
.)
para sere
, e eu acho que pode ser golfed um pouco mais. Considere a variávelG
que contém o alfabeto em minúsculas, acredito que você pode obter cerca de 10 bytes usando-o, feliz golfe! :)Python 3, 39 bytes.
Guardou 1 byte graças a FryAmTheEggman.
Economizou 2 bytes graças ao histocrat.
Não foi possível resolver com um forro há algum tempo!
Aqui estão os meus casos de teste. Também mostra como estou assumindo que essa função é chamada.
Ele usa
zip
para percorrer as matrizes em pares e, em seguida, indexa em uma sequência para escolher a letra correta. Tudo isso acontece na compreensão de uma lista, tornando-se automaticamente uma lista. O núcleo desta solução é que as únicas combinações possíveis dea
eb
são[0, 1], [1, 0], [0, 0]
. Portanto, se subtraímos eles, obtemos um deles,-1, 0, 1
o último, primeiro, elemento do meio, respectivamente.fonte
Mathematica,
30242219 bytes3 bytes salvos devido a @alephalpha .
Bem simples.
fonte
{A,B,C}[[3-2#-#2]]&
Ruby, 35 bytes
Uso:
Obtém o (xy) th caractere zero indexado de "CAB". (1-0) fornece 1 e, portanto, A. (0-0) fornece 0 e, portanto, C. (0-1) fornece -1, que envolve B.
Solução mais curta alternativa com saída mais estranha:
A saída é citada por seqüências de caracteres separadas por novas linhas, o que parece ser uma ponte longe demais.
fonte
Japonês, 13 bytes
Experimente online!
Como funciona
fonte
Oitava, 19 bytes
Teste:
Acrescentarei uma explicação mais tarde quando tiver um computador na minha frente. Isso foi escrito e testado em oitava on-line no meu celular.
fonte
TI-BASIC,
5957503736 bytesRetira uma lista de
Ans
e a outra dePrompt L₁
. Economizou 13 bytes graças à sugestão de Thomas Kwa de mudar de ramificação parasub(
.Vou ter que procurar o que Thomas Kwa disse que encontrou nos comentários amanhã. ¯ \ _ (ツ) _ / ¯
fonte
Prompt L₁
porPrompt X
eL₁
por∟X
. Há ainda mais, mas deixarei você encontrá-lo.Ferrugem, 79
Economizou 8 bytes graças ao Shepmaster.
Economizou 23 bytes graças a ker.
Estou certo de que isso poderia ser muito praticado, mas esta é a primeira vez que escrevo um programa completo de Rust.
Aqui está o código não-protegido e os casos de teste, caso alguém queira tentar reduzi-lo.
A abordagem é bastante semelhante à minha resposta em Python. A principal diferença é que não posso indexar diretamente as strings, portanto não posso fazer o
c-d
truque.fonte
a[0]
ea[1]
como dois argumentos separados.64-y-2*x
truque da solução Octave economiza alguns bytes devido ao fato de poder usá-lo emu8
vez deusize
: is.gd/GNPK76Vitsy, 40 bytes
suspiro Meu bebê não foi feito para manipular array.
Espera entrada através do STDIN (algo que eu nunca faço) com uma liderança
"
.Explicação no modo detalhado (em breve disponível):
Isso está ficando melhor em breve, pessoal. Sinto muito pelo tamanho atual.
Basicamente, trato a entrada como uma string e manipulo a partir daí.
Experimente online!
fonte
W
!W
tecnicamente é rápido).CJam, 10 bytes
Introduza como uma lista de duas listas, por exemplo
Teste aqui.
Explicação
Tratando os pares como bits de um número de base 2, obtemos
2
paraA
,1
paraB
e0
paraC
.fonte
Python 3,
4845 bytesEu pensei que tinha uma solução elegante, então eu vi a resposta de @Morgan Thrapp ...
editar: salvou três bytes graças ao mencionado acima.
lambda *x:[a*'A'or b*'B'or'C'for a,b in zip(*x)]
fonte
lamba*x:
. Eu sempre acho que é o mais compacto possível, então me dizem / encontro ainda mais truques. Eu realmente gosto da sua solução, muito bom.Java,
13112211090 bytesEDIT: Agradecimentos a Bifz / FlagAsSpam pela ajuda e inspiração
Primeira submissão, solução Java ingênua. Quase certamente pode ser melhorado :)fonte
==1
pode ser>0
; também seria melhor você retornar o em vez de imprimir.void x(int[]a,int[]b){for(int i=0;i<a.length;i++)System.out.print(a[i]>0?"A":b[i]>0?"B":"C");}
(94 bytes)? Você não precisa da declaração estática nas funções.R
2916 bytesremovi a declaração de função desde que vi que é comum em outros concursos.
fonte
PowerShell, 40 bytes
Recebe entrada como duas matrizes explícitas, por exemplo.
PS C:\Tools\Scripts\golfing> .\cheating-a-multiple-choice-test.ps1 @(1,0,0,1,0,0,1) @(0,1,0,0,1,0,0)
e os armazena em$a
e$b
. Em seguida, faça um loop$a
com$a|{...}
. A cada loop, produzimos um caractere indexado na string"CBA"
, com o índice decidido pelo dobro do valor atual$_
, mais o valor$b
indexado pela nossa variável auxiliar que foi pré-adicionada e subtraída.Como exemplo, para o primeiro caso de teste,
$a = @(1,0,0,1,0,0,1)
e$b = @(0,1,0,0,1,0,0)
. A primeira iteração do loop tem$_ = 1
,$d = $null
(já que$d
não tenha sido previamente declarado). Nós pré-adicionamos$d
agora$_ = 1
e$d = 1
(no PowerShell$null + 1 = 1
), o que significa isso$b[1-1] = $b[0] = 0
. Então2 * 1 + 0 = 2
, indexamos"CBA"[2]
, ouA
.fonte
, 12 caracteres / 22 bytes
Try it here (Firefox only).
Explicação
Traduz para Javascript ES6 como
fonte
R
3634 bytesDois bytes salvos removendo chaves desnecessárias
fonte
Perl 5-47
Já tem 30 respostas e nenhum perl? Aqui está uma primeira tentativa ingênua :-) Apenas a função:
Uso:
Tenho certeza de que algo melhor poderia ser feito com regex, mas não consegui descobrir como.
fonte
JavaScript ES6, 75 bytes
Eu fui a milha extra para aceitar argumentos inteiros em vez de argumentos de matriz.
Explicação:
Crédito para @ETHproductions pela lógica de indexação de string.
Teste aqui
Pssst
Para 3 bytes extras, ele pode exibir a representação para até 30 respostas:
fonte
Retina, 46 bytes
Mescla as duas strings e escolhe as letras de acordo com os pares de dígitos.
Experimente online aqui.
fonte
Lua, 87 bytes
Simplesmente testando os valores nas matrizes, e concatenar
A
,B
ouC
.fonte
F #, 33 bytes
Essa é uma função parcialmente aplicada que utiliza duas seqüências int - duas matrizes funcionam bem - e retorna uma nova sequência de caracteres representando as respostas corretas. =)
fonte
Sério, 14 bytes
Experimente Online
Provavelmente devido a um erro na versão de segurança do interpretador, você deve adicionar um
X
para que ele funcione corretamente na versão online. Baixe a versão local para obter o programa acima funcionando corretamente como está.É muito curto para justificar uma explicação completa, então vou apenas dizer: ele usa o mesmo algoritmo que a resposta Jelly.
fonte