var QUESTION_ID=82938,OVERRIDE_USER=48934;function answersUrl(e){return"https://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"https://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+(?:\.\d+)?)(?=[^\n\d<>]*(?:<(?:s>[^\n<>]*<\/s>|[^\n<>]+>)[^\n\d<>]*)*<\/h\d>)/,OVERRIDE_REG=/^Override\s*header:\s*/i;
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><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>
Respostas:
Dominó , 122.000 bytes ou 72 blocos
A contagem de bytes é o tamanho do arquivo salvo que é
0.122 MB
.A computação dominó foi a inspiração. Eu testei tudo isso até simetria (e além!) Através de um jogo Steam de realidade virtual chamado Tabletop Simulator .
Detalhes
True
ou1False
ou0100%
Portões
644343151132171376761615TL; DR
Eu estava esperando / querendo um desafio de dominó e, quando vi isso, não pude deixar passar. O único problema era que aparentemente ninguém mais possui dominó! Então, finalmente, desisti e comprei um Double Twelve . Este conjunto possui 91 peças, o que me deu a idéia de ter uma 'chamada de função' / iniciar dominó em vez do método normal (longo) de 'atraso de tempo'. O crédito para a curva de 90 graus pertence ao canal dominoesdouble07 .
Depois de construí-las com dominós físicos, foi decidido que as soluções válidas deveriam ser digitais. Então eu recriei esses portões no Tabletop Simulator . Infelizmente, TS e realidade não concordam com a física de dominó. Isso exigiu que eu adicionasse 11 dominós, mas também salvei 8. No geral, os dominós virtuais são cerca de 150 vezes mais eficazes em termos de construção e teste ( Ctrl+ Z).
Atualizar
xor xnor nand
xnor
exor
xor
exnor
). O bloqueio na mesa requer apenas 1 dominó, em vez de 2.fonte
Hexagonia , 89 bytes
Agradecemos a FryAmTheEggman por alguma inspiração necessária para a solução XOR.
Todos os programas usam
0
para false e1
true.Experimente online! Este não é um conjunto de testes, você deverá copiar os diferentes programas e entradas.
A solução acima está dentro de 2 bytes de otimização (a menos que relaxemos a interpretação da verdade / falsidade, eu acho). Eu deixei uma pesquisa de força bruta correr para perto de dois dias sobre todos os programas que se encaixam no lado de comprimento 2, ou seja, até 7 bytes (não completamente todos os programas - Eu fiz algumas suposições sobre o que todas as necessidades programa válido eo que não programa válido poderia ter). A pesquisa encontrou soluções para 15 dos 16 portões possíveis - e muitas vezes muito mais do que apenas um. Você pode encontrar uma lista de todas as soluções alternativas nesta pasta onde também as agrupei por comportamento equivalente. As que estou mostrando acima selecionei porque são a solução mais simples ou a mais interessante, e adicionarei explicações para elas amanhã.
Quanto ao 16º portão: XOR é o único portão que aparentemente não pode ser implementado em 7 bytes. Infelizmente, uma pesquisa de força bruta em programas maiores não é viável com o código que tenho atualmente. Então o XOR teve que ser escrito à mão. O mais curto que encontrei até agora é o programa de 10 bytes acima, que se baseia em uma tentativa falha (mas muito próxima) do FryAmTheEggman. É possível que exista uma solução de 8 ou 9 bytes, mas fora isso, todas as soluções devem ser ótimas.
Explicações
Aviso: parede de texto. Se alguém estiver interessado em saber como esses programas Hexagony altamente compactados realmente funcionam, incluí explicações abaixo para cada um deles. Tentei escolher a solução mais simples para cada porta nos casos em que existe mais de um programa ideal, a fim de manter as explicações razoavelmente curtas. No entanto, alguns deles ainda confundem a mente, então pensei que eles merecem um pouco mais de elaboração.
0000
: FalseNão acho que precisaremos de um diagrama para este:
Como toda a grade de memória é inicializada em zeros,
!
simplesmente imprime um zero e@
finaliza o programa.Essa também é a única solução de 2 bytes.
0001
: EIsso basicamente implementa curto-circuito . O diagrama cinza abaixo mostra o início do programa, onde a primeira entrada é lida
?
e o ponteiro de instrução (IP) envolve o canto esquerdo, onde o|
espelho o reflete. Agora, o canto atua como condicional; portanto, existem dois caminhos de execução diferentes, dependendo do valor da primeira entrada. O diagrama vermelho mostra o fluxo de controle paraA = 0
e o diagrama verde paraA = 1
:Como você pode ver, quando o
A
é0
, simplesmente o imprimimos e terminamos (lembre-se de que todos.
são não-ops). Mas quandoA
é1
, o IP percorre a primeira linha novamente, lendoB
e imprimindo isso.No total, existem dezesseis soluções de 5 bytes para esse gate. Quatorze deles são essencialmente os mesmos que os anteriores, usando em
>
vez de|
ou substituindo o.
comando por um comando efetivamente não operacional ou colocando?
na segunda posição:E existem outras duas soluções (que são equivalentes entre si). Eles também implementam a mesma lógica de curto-circuito, mas os caminhos de execução são um pouco mais loucos (e são deixados como um exercício para o leitor):
0010
: A e não BIsso também implementa uma forma de curto-circuito, mas devido ao uso do
#
fluxo de controle é muito mais complicado.#
é um comutador IP condicional. Na verdade, o Hexagony vem com seis IPs rotulados0
como5
, que começam nos seis cantos da grade, apontando ao longo de sua borda no sentido horário (e o programa sempre começa com IP0
). Quando a#
é encontrado, o valor atual é obtido no módulo6
e o fluxo de controle continua com o IP correspondente. Não sei ao certo qual ataque de loucura me fez adicionar esse recurso, mas certamente permite alguns programas surpreendentes (como este).Vamos distinguir três casos. Quando
A = 0
, o programa é bastante simples, porque o valor é sempre0
quando#
é encontrado, de forma que nenhuma alternância de IP ocorre:#
não faz nada,?
lêA
(ou seja, também não faz nada),#
ainda não faz nada,!
imprime0
,)
incrementa (isso é importante, caso contrário, o IP não iria para a terceira linha),@
finaliza o programa. Simples o suficiente. Agora vamos considerar o caso(A, B) = (1, 0)
:O caminho vermelho ainda corresponde ao IP
0
, e eu adicionei o caminho verde para o IP1
. Vemos que, após as?
leiturasA
(1
desta vez), as#
opções para o IP iniciam no canto superior direito. Isso significa que?
pode lerB
(0
). Agora)
incrementa isso para1
, de modo que o#
canto superior esquerdo não faça nada e permanecemos com IP1
. As!
impressões1
e o IP envolvem a diagonal esquerda.#
ainda não faz nada e@
finaliza o programa.Finalmente, o caso realmente estranho em que ambas as entradas são
1
:Desta vez, a segunda entrada também é
1
e a)
incrementa2
. Isso significa que o#
canto superior esquerdo causa outro switch IP para IP2
, indicado em azul. Nesse caminho, primeiro incrementamos ainda mais3
(embora isso seja irrelevante) e depois passamos pela?
terceira vez. Como agora atingimos o EOF (ou seja, a entrada está esgotada),?
retorna0
,!
imprime isso e@
finaliza o programa.Notavelmente, esta é a única solução de 6 bytes para esse gate.
0011
: UMAIsso é simples o suficiente para não precisarmos de um diagrama:
?
lêA
,!
imprime,@
termina.Essa é a única solução de 3 bytes para esse gate. (Em princípio, também seria possível
,;@
, mas a pesquisa não incluiu;
, porque acho que nunca poderá salvar bytes!
para esta tarefa.)0100
: B e não AEste é muito mais simples que o seu "irmão"
0010
. O fluxo de controle é realmente o mesmo que vimos acima para0001
(E). SeA = 0
, o IP percorre a linha inferior, lendoB
e imprimindo isso antes de terminar. Se,A = 1
então, o IP percorrer a primeira linha novamente, também lendoB
, mas+
adiciona duas bordas de memória não utilizadas, de modo que tudo o que faz é redefinir o valor atual para0
, para que!
sempre seja impresso0
.Existem várias alternativas de 6 bytes para isso (42 no total). Primeiro, há uma tonelada de soluções equivalentes às anteriores. Podemos novamente escolher livremente entre
|
e>
, e+
podemos ser substituídos por qualquer outro comando que nos dê uma vantagem vazia:Além disso, também podemos usar em
]
vez de?
.]
move para o próximo IP (ou seja, seleciona IP1
), para que esse ramo reutilize o?
no canto superior direito. Isso dá outras 18 soluções:E há outras seis soluções que funcionam de maneira diferente com níveis variados de loucura:
0101
: BWoohoo, outro simples: ler
A
, lerB
, imprimirB
, encerrar. Na verdade, existem alternativas para isso. ComoA
é apenas um caractere, também podemos lê-lo com,
:E também há a opção de usar um único
?
e um espelho para percorrê-lo duas vezes:0110
: XorComo eu disse acima, esse foi o único portão que não caberia no lado 2, então essa é uma solução escrita à mão por FryAmTheEggman e por mim e há uma boa chance de que não seja o ideal. Existem dois casos para distinguir. Se
A = 0
o fluxo de controle for bastante simples (porque, nesse caso, precisamos apenas imprimirB
):Começamos no caminho vermelho.
?
lêA
,<
é um ramo que desvia o zero restante. O IP_
passa para o fundo, então é outro espelho e, quando atinge o canto, ele passa para o canto superior esquerdo e continua no caminho azul.?
lêB
,!
imprime. Agora o(
diminui. Isso é importante porque garante que o valor não seja positivo (seja agora0
ou seja-1
). Isso faz com que o IP seja quebrado no canto direito, onde@
finaliza o programa.Quando as
A = 1
coisas ficam um pouco mais complicadas. Nesse caso, queremos imprimirnot B
, o que por si só não é muito difícil, mas o caminho da execução é um pouco complicado.Dessa vez, ele
<
desvia o IP corretamente e, em seguida,<
age apenas como um espelho. Portanto, o IP percorre o mesmo caminho ao contrário, lendoB
quando encontra?
novamente. O IP passa pelo canto direito e continua no caminho verde. It próximos encontros(~
que é "decremento, multiplicar por -1", que troca0
e1
e, por conseguinte, calculanot B
.\
é apenas um espelho e!
imprime o resultado desejado. Em seguida,?
tenta retornar outro número, mas retorna zero. O IP agora continua no canto inferior esquerdo no caminho azul.(
diminui,<
reflete,(
diminui novamente, para que o valor atual seja negativo quando o IP atingir o canto. Ele se move pela diagonal inferior direita e, finalmente, pressiona@
para finalizar o programa.0111
: OuMais curto-circuito.
O
A = 0
caso (o caminho vermelho) é um pouco confuso aqui. O IP é desviado para a esquerda, passa para o canto inferior esquerdo, é imediatamente refletido pelo<
e retorna?
à leituraB
. Em seguida, envolve o canto rígido, imprimeB
com!
e termina.O
A = 1
caso (o caminho verde) é um pouco mais simples. A<
ramificação desvia o IP para a direita, então simplesmente imprimimos!
, voltamos para o canto superior esquerdo e terminamos em@
.Existe apenas uma outra solução de 5 bytes:
Funciona essencialmente da mesma forma, mas os caminhos de execução reais são bem diferentes e usa um canto para ramificação em vez de a
<
.1000
: NemEste pode ser o meu programa favorito encontrado nesta pesquisa. O mais interessante é que essa implementação
nor
realmente funciona para até 5 entradas. Vou ter que entrar um pouco nos detalhes do modelo de memória para explicar este. Assim, como uma atualização rápida, o modelo de memória do Hexagony é uma grade hexagonal separada, onde cada aresta possui um valor inteiro (inicialmente todo zero). Há um ponteiro de memória (MP) que indica uma aresta e uma direção ao longo dessa aresta (de modo que há duas arestas vizinhas na frente e atrás da aresta atual, com vizinhos significativos à esquerda e à direita). Aqui está um diagrama das arestas que usaremos, com o MP começando como mostrado em vermelho:Vamos primeiro considerar o caso em que ambas as entradas são
0
:Começamos no caminho cinza, que simplesmente incrementa a borda A para
1
que o#
comutador para IP,1
que é o caminho azul, comece no canto superior direito.\
não faz nada lá e?
lê uma entrada. Envolvemos no canto superior esquerdo, onde)
incrementa essa entrada. Agora, desde que a entrada seja zero, isso resultará em um1
, para que#
não faça nada. Em seguida,{
move-se o MP para a esquerda, isto é, sobre a primeira iteração de um de B . Como essa borda ainda tem seu zero inicial, o IP volta ao canto superior direito e a uma nova borda de memória. Portanto, esse loop continuará enquanto?
lê zeros, movendo o MP ao redor do hexágono de Bpara C para D e assim por diante. Não importa se?
retorna um zero porque era uma entrada ou porque era EOF.Após seis iterações através deste circuito,
{
retorna a um . Dessa vez, a borda já mantém o valor1
desde a primeira iteração; portanto, o IP é movido para o canto esquerdo e continua no caminho verde.!
simplesmente imprime isso1
e@
finaliza o programa.Agora, e se alguma das entradas for
1
?Em seguida,
?
lê isso1
em algum momento e o)
incrementa para2
. Isso significa#
que agora vamos mudar de IP novamente e continuaremos no canto direito no caminho vermelho.?
lê outra entrada (se houver), o que realmente não importa e{
move uma borda ainda mais. Isso deve ser uma borda não utilizada, portanto, isso funciona para até 5 entradas. O IP passa para o canto superior direito, onde é imediatamente refletido e para o canto esquerdo.!
imprime0
na borda não utilizada e#
volta para IP0
. Esse IP ainda estava esperando no#
sudoeste (caminho cinza), então ele imediatamente bate no@
e termina o programa.No total, existem sete soluções de 7 bytes para esse gate. 5 deles funcionam da mesma forma que isso e simplesmente usam outros comandos para mover para uma aresta não utilizada (e podem caminhar em torno de um hexágono diferente ou em uma direção diferente):
E há outra classe de soluções que funciona apenas com duas entradas, mas cujos caminhos de execução são ainda mais confusos:
1001
: IgualdadeIsso também faz um uso muito inteligente da seleção de IP condicional. Precisamos distinguir novamente entre
A = 0
eA = 1
. No primeiro caso, queremos imprimirnot B
, no segundo, queremos imprimirB
. PoisA = 0
também distinguimos os dois casos paraB
. Vamos começar comA = B = 0
:Começamos no caminho cinza.
(~
pode ser ignorado, o IP passa para o canto esquerdo (ainda no caminho cinza) e lêA
com?
.(
diminui isso, então obtemos um-1
IP wrap no canto inferior esquerdo. Agora, como eu disse anteriormente,#
pega o módulo de valor6
antes de escolher o IP, então um valor de-1
realmente sai do IP5
, que começa no canto esquerdo no caminho vermelho.?
lêB
,(
diminui isso também, para que continuemos no IP5
quando acertarmos#
novamente.~
nega o, de-1
modo que o IP passe para o canto inferior direito, imprima1
e termina.Agora, se
B
for o caso1
, o valor atual será0
quando atingirmos#
a segunda vez; portanto, voltamos ao IP0
(agora no caminho verde). Isso atinge?
uma terceira vez, produzindo0
,!
imprime e@
termina.Finalmente, o caso em que
A = 1
. Desta vez, o valor atual já é zero quando atingimos#
pela primeira vez, portanto, isso nunca muda para IP5
em primeiro lugar. Simplesmente continuamos imediatamente no caminho verde.?
agora não basta dar um zero, mas retornarB
.!
imprime e@
termina novamente.No total, existem três soluções de 7 bytes para este gate. Os outros dois funcionam de maneira muito diferente (até um do outro) e fazem uso ainda mais estranho
#
. Em particular, eles leem um ou mais valores com,
(lendo um código de caractere em vez de um número inteiro) e depois usam esse valor módulo 6 para escolher um IP. É muito louco.1010
: Não serEste é bastante simples. O caminho da execução é o ramo horizontal que já conhecemos
and
anteriormente.??
lêA
e depois imediatamenteB
. Após refletir|
e ramificar,B = 0
executaremos o ramo inferior, onde)
incrementa o valor pelo1
qual é impresso!
. No ramo superior (seB = 1
),?
basta redefinir a borda para a0
qual também é impressa!
.Existem oito programas de 6 bytes para este gate. Quatro deles são praticamente iguais, usando em
>
vez de|
ou em1
vez de)
(ou ambos):Dois usam um único
?
que é usado duas vezes devido a um espelho. A negação acontece como fizemosxor
com um(~
ou outro~)
.E, finalmente, duas soluções usam um comutador IP condicional, porque por que usar da maneira simples se a complicada também funciona:
1011
: B implica AIsso usa algumas opções de IP bastante elaboradas. Vou começar com o
A = 1
caso desta vez, porque é mais simples:Começamos no caminho cinza, que lê
A
com?
e depois bate no#
. DesdeA
é1
este muda para IP1
(caminho verde). Ele!
imprime imediatamente que, o IP passa para o canto superior esquerdo, lêB
(desnecessariamente) e termina.Quando as
A = 0
coisas ficam um pouco mais interessantes. Primeiro vamos considerarA = B = 0
:Desta vez, o
#
não faz nada e permanecemos no IP0
(caminho vermelho a partir desse ponto).?
lêB
e1
transforma em um1
. Depois de empacotar no canto superior esquerdo, atingimos#
novamente, então terminamos no caminho verde, afinal, e imprimimos1
como antes, antes de terminar.Finalmente, aqui está
(A, B) = (0, 1)
o caso falso:Observe que removi o caminho cinza inicial para maior clareza, mas o programa começa da mesma maneira e terminamos no caminho vermelho como antes. Então desta vez o segundo
?
retorna1
. Agora encontramos o1
. Neste ponto, é importante entender o que os dígitos realmente fazem no Hexagony (até agora os usamos apenas em zeros): quando um dígito é encontrado, o valor atual é multiplicado por 10 e, em seguida, o dígito é adicionado. Isso normalmente é usado para escrever números decimais literalmente no código-fonte, mas significa queB = 1
na verdade é mapeado para o valor11
. Então, quando atingimos#
, esse módulo é usado6
para dar5
e, portanto, passamos para IP5
(em vez de1
como antes) e continuamos no caminho azul. Batendo?
uma terceira vez retorna um zero, então!
imprime que, e depois de mais duas?
, o IP passa para o canto inferior direito onde o programa termina.Existem quatro soluções de 7 bytes para isso e todas elas funcionam de maneira diferente:
1100
: Não AApenas um linear simples: ler
A
com?
, nega com(~
, imprimir com!
, termina com@
.Há uma solução alternativa, que é negar
~)
:1101
: A implica BIsso é muito mais simples do que a implicação oposta da qual acabamos de falar. É novamente um daqueles programas de ramificação horizontal, como esse
and
. SeA
for0
, simplesmente é incrementado para1
o ramo inferior e impresso. Caso contrário, a ramificação superior é executada novamente onde?
lêB
e depois!
imprime.Há uma tonelada de alternativas aqui (66 soluções no total), principalmente devido à livre escolha de no-ops eficazes. Para começar, podemos variar a solução acima da mesma maneira que
and
podemos e também podemos escolher entre)
e1
:E há uma versão diferente usando a seleção condicional de IP, onde o primeiro comando pode ser escolhido quase arbitrariamente, e também há uma opção entre
)
e1
para algumas dessas opções:1110
: NandO último complicado. Se você ainda está lendo, quase conseguiu. :) Vamos olhar
A = 0
primeiro:?
lêA
e depois batemos$
. Este é um comando de salto (como o de Befunge#
) que pula a próxima instrução para que não terminemos no@
. Em vez disso, o IP continua em#
. No entanto, uma vez queA
é0
, isso não faz nada.)
o incrementa para1
que o IP continue no caminho inferior onde1
é impresso. Ele<
desvia o IP para a direita, onde ele fica no canto esquerdo e o programa termina.Em seguida, quando a entrada é apresentada,
(A, B) = (1, 0)
temos esta situação:É essencialmente o mesmo que antes, exceto que no
#
que mudar para IP1
(caminho verde), mas desde queB
é0
que voltar para IP0
quando bateu#
uma segunda vez (caminho agora azul), onde ele imprime1
como antes.Finalmente, o
A = B = 1
caso:Desta vez,
#
na segunda vez, o valor atual ainda é1
para que não alteremos o IP novamente. O<
reflete e, na terceira vez que atingimos?
, obtemos um zero. Portanto, o IP passa para o canto inferior esquerdo, onde!
imprime o zero e o programa termina.Existem nove soluções de 7 bytes no total para isso. A primeira alternativa simplesmente usa, em
1
vez de)
:Depois, há duas soluções que farão sua cabeça com a quantidade de comutação de IP que está acontecendo:
Isso realmente me impressionou: a parte interessante é que a comutação de IP pode ser usada como uma condicional adiada. As regras de comutação de IP do idioma são tais que o IP atual dá outro passo antes que o comutador aconteça. Se essa etapa passar por um canto, o valor atual decidirá em qual filial o IP continuará se voltarmos a ele. Exatamente isso acontece quando a entrada é
A = B = 1
. Embora tudo isso seja consistente com a maneira como eu projetei a linguagem, nunca estive ciente dessa implicação da especificação, por isso é bom quando minha linguagem me ensina alguns novos truques: D.Depois, há uma terceira solução cuja quantidade de comutação de IP é ainda pior (embora não faça uso desse efeito condicional adiado):
E depois há outro:
E existem essas quatro soluções equivalentes, que usam alguma troca de IP não condicional e, em vez disso, implementam toda a lógica por meio de ramificações e cantos:
1111
: VerdadeiroVocê ganhou algo simples para o final: defina a borda para
1
, imprima com!
, encerre com@
. :)Claro, há uma alternativa:
Como sempre, todos os diagramas de fluxo de controle criados com o HexagonyColorer de Timwi e o diagrama de memória com seu EsotericIDE .
fonte
APL,
222018 bytesAs entradas verdadeiras e falsas são programas completos e as outras 14 são funções. (Obrigado a Adám.)
Experimente aqui.
fonte
0
e1
.Xadrez / medíocre jogador de xadrez no final do jogo, 70 peças
Inspirado por essa resposta dominó, decidi que outro jogo deveria ter essa honra.
Observe que eu tomei algumas regras sobre como as peças se movem. Como não tenho vontade de estudar as jogadas ideais para todas as situações, as regras para jogadas brancas são simples: fique fora de controle, capture a parte mais alta do ranking que ele puder, enquanto perde o mínimo de material possível e pare um peão de promover, nessa ordem de prioridade. Se houver dois espaços para os quais ele possa se mudar, com o mesmo favorecimento, ele poderá se mudar para qualquer um deles (portanto, nesses, se ele puder se mover para mais de um quadrado, eles terão a mesma cor). Observe que o branco capturará com algo mesmo que seja capturado, se a peça que estiver atacando tiver um valor mais alto do que a perdida. Os valores estão aqui:
pawn<knight=bishop<rook<queen
A entrada é se uma torre está presente ou não. Observe que as torres são rotuladas apenas com os nomes A e B quando importa: se o portão se comporta da mesma maneira quando as torres são trocadas, elas não são rotuladas.
A saída é a cor do quadrado branco rei termina em: Branco = 1, preto = 0
Antes das imagens, quero me desculpar por imagens ruins. Não sou muito bom em segurar a câmera com firmeza.
Falso, 4:
E 4:
A e não B, 5 (acho que posso reduzir para três, mas não tenho placa no momento):
A, 4:
Não A e B, 5 (acho que posso reduzir para três, mas não tenho placa no momento):
B, 4:
Xor, 5 (conheço uma maneira de fazer 4, mas não tenho o quadro no momento):
Ou 4:
Nem 4:
Xnor, 5 (conheço uma maneira de fazer 4, mas não tenho o quadro no momento):
Não B, 4:
B implica A, 5 (acho que posso reduzir para três, mas não tenho placa no momento):
Não A, 4:
A implica B, 5 (acho que posso reduzir isso para três, mas não tenho placa no momento):
Nand, 4:
Verdadeiro, 4:
fonte
Geléia , 19 bytes
Experimente online!
fonte
¤
e¬
são 2 bytes, não 1.0 0 1 0 > 1 byte Greater than.
isso não falharia se a segunda entrada fosse negativa?Portões lógicos NAND - 31 portões
Como criador da série original de perguntas do NAND gate , não pude deixar passar a oportunidade de usar esses portões para resolver outro problema do portão lógico.
Em cada um desses diagramas, a entrada superior é A enquanto a entrada inferior é B.
fonte
Tag cíclico bit a bit , 118 bits = 14,75 bytes
O Bitwise Cyclic Tag é talvez o idioma mais completo de Turing já criado. Há uma fita de programa e uma fita de dados, ambas consistindo em uma lista de bits. A fita do programa é interpretada ciclicamente até que a fita de dados esteja vazia, da seguinte maneira:
0
: exclua o primeiro bit da fita de dados.1x
: se o primeiro bit da fita de dados for 1, anexe-ox
à fita de dados.Inicializamos a fita de dados com 1 seguido dos dois bits de entrada (o 1 é necessário porque não há como criar um 1 se a fita de dados consiste inteiramente de 0s) e usamos o bit final de dados excluído como saída do gate .
false
):001
and
):1001001
A and not B
):0110100
A
):1001
not A and B
):0100
B
):0
xor
):0110110010
or
):0110
nor
):1101001000
xnor
):110101001100
not B
):1100100
B implies A
):110101101000
not A
):11010000
A implies B
):11010011001
nand
):10110100100010
true
):1100
fonte
1
sobrefalse
necessário?0
a à fita para que ela possa ser excluída por último.Python 2, 137 bytes
Toma entradas como
min(True,False)
(ou comomin(1,0)
). Aproveita bastante as saídas, precisando apenas do valor Truthy-Falsey certo. Sempre que possível, usa um built-in para evitar um custolambda
. Eu usei o código para procurar por embutidos que funcionem.O meu favorito é o
{0:1}.get
que pensei à mão. O dicionário{0:1}
mapeia a chave0
para o valor1
. Seuget
método usa uma chave e um padrão, produzindo o valor correspondente à chave ou o padrão, se não houver essa chave. Portanto, a única maneira de gerar a0
é a{0:1}.get(1,0)
, com chave1
e padrão ausentes0
. Pode-se obter outras variantes com dicionários diferentes, mas apenas este foi o mais curto.fonte
__lt__
ou__eq__
? Isso diminuirá ainda mais a contagem de bytes: emint.__gt__
vez delambda a,b:b<1
, emint.__eq__
vez delambda a,b:a==b
etc.int
as comparações de descarregamento paracmp
. Eu não tentei isso para o Python 3.not
para0001
,False
- ideonenot
isso não atende aos requisitos de uma função porque você não pode fazer issof=not;f(3,4)
. A stringnot
funciona porque os argumentos da suposta função se parecem com uma tupla, da mesma forma3+
que funcionaria como3+(4)
se3+
não fosse uma função que pode ser4
usada como entrada.Go (jogo), 33 pedras, 73 cruzamentos
Se dominó e xadrez são aceitáveis, então isso. Não pode ser muito complicado em um tabuleiro Go completo de 19x19. Então eu usei pequenas tábuas retangulares. A entrada é se as pedras marcadas 1 e 2 estão presentes. A saída é se o preto vence. Ele usa pontuação de área, 0,5 komi, superko situacional, sem suicídio. Tudo preto para jogar. Alguns recebem várias soluções.
Vitórias brancas (2, 1x5):
1 e 2 (3, 2x3):
1 e não 2 (2, 1x5):
1 (2, 1x5):
Não 1 e 2 (2, 1x5):
2 (2, 1x5):
1 xou 2 (2, 2x3):
1 ou 2 (2, 1x5):
1 nem 2 (2, 1x4):
1 = 2 (2, 1x7):
Não 2 (2, 1x3):
1 ou não 2 (2, 1x4):
Não 1 (2, 1x3)
Não 1 ou 2 (2, 1x4):
1 e 2 (2, 1x3):
Vitórias negras (2, 1x3):
Esta página me ajudou um pouco: http://www.mathpuzzle.com/go.html
Talvez alguém possa encontrar uma solução de 2 pedras para 1 e 2 em uma placa 1x9 ...
fonte
Javascript ES6, 124 bytes
Eu odeio seriamente lambdas agora.
fonte
a=>b=>0
paraa=>0
e dizer a gramática chamado é(a=>0)(a,b)
, apenas para os 4 entradas.Math.min
em vez dea=>b=>a&b
.Math.max
em vez dea=>b=>a|b
.Math.pow
em vez dea=>b=>a>=b
.parseInt
vez dea=>b=>a>b
.!NaN
=>true
,!!NaN
=>false
Retina ,
6239 bytes23 bytes graças a @MartinEnder !
Toma entrada como
PQ
.Produz um número inteiro entre
0
a3
.0
é falsey, outros são verdadeiros.Explicação
Eles são todos apenas regexes .
Por exemplo,
01|10
apenas combina01
ou10
.In
0000
,2
nunca estará na entrada, portanto nunca coincide.Em
1111
, ele corresponde à string vazia, que existe4
.fonte
^1|0$
deve corresponder apenas a 1 sequência de caracteres. Oque esta acontecendo aqui?1
no início da entrada] OU [0
no final da entrada]. Levei um minuto para obtê-lo também ...^1|0$
é mais difícil de ler do que1.|.0
. Parece para tornar a leitura mais difícil em todosStack Cats , 67 + 64 = 131 bytes
Observe que o +64 é da aplicação dos
-nm
sinalizadores em cada programa.-n
indica E / S numérica e-m
reflete o código-fonte no último caractere - nem todos os envios precisam desses sinalizadores tecnicamente, mas por consistência e simplicidade, eu os escuto da mesma maneira.()
no Stack Cats verifica se um elemento é positivo ou não positivo (ou seja, 0 ou negativo), por isso estamos usando isso para verdade / falsidade, respectivamente. A segunda coluna é apenas para o interesse e lista os melhores portões com0
/1
s como saídas (com pontuação total 90).A entrada é bits separados por delimitador via STDIN. Experimente online!
Stack Cats é uma linguagem esotérica reversível, onde os programas têm simetria reflexiva. Dado um trecho
f
(por exemplo>[[(!-)/
), a imagem espelhada (por exemplo\(-!)]]<
) calcula o inversof^-1
. Assim, programas de comprimento par não fazem nada (ou ficam presos em um loop infinito), e os únicos programas não triviais têm comprimento ímpar, calculandof g f^-1
ondeg
está o operador central.Como metade do código-fonte é sempre redundante, ele pode ser deixado de fora, e a execução do código com o
-m
sinalizador indica que o código-fonte deve ser espelhado sobre o último caractere para recuperar o código-fonte real. Por exemplo, o programa*<X
é realmente*<X>*
simétrico.Jogar golfe no Stack Cats é altamente pouco intuitivo, portanto os programas acima tiveram que ser encontrados por força bruta. A maioria deles é surpreendentemente complexa, mas explicarei alguns e acrescentarei a essa resposta quando tiver tempo. Por enquanto, algumas explicações e soluções alternativas para as versões
0
/1
podem ser encontradas no repositório do Github aqui .fonte
Note that the +64 is from applying the -nm flags to each program.
3 * 16 = 48 ou 16 2 * = 32, 64 de qualquer forma é forma haiHaskell,
787675 bytes_#_=2<1
&&
>
pure
<
_#b=b
/=
||
(not.).max
==
_#b=not b
>=
a#_=not a
<=
(not.).min
_#_=1<2
Edit: -1 byte graças a @cole.
fonte
_#_
não é um operador padrão!" E então eu percebi ... Muito bem.pure
pure
foi introduzidoPrelude
em 2015, então estava disponível no momento deste desafio.Braquilog ,
3634 bytesIsso espera
0
como valor falso e1
como valor verdadeiro . Retornatrue
oufalse
. p éInput
e q éOutput
.fonte
Input
eOutput
por convenção, mas você pode definir valores para ambos ou retornar valores de ambos.Prolog,
147145 bytesGanhou 2 bytes graças a @SQB
Consulta
x(P,Q).
comx
sendo a letra apropriada eP
eQ
definido para 0 ou 1.Returns
true
oufalse
.Exemplo SWISH incluindo testes - entre
runTest.
para executar.fonte
a(2,2).
falso?a(a,a).
(ou qualquer outra letra) também funciona ea
não é uma contribuição aceitável para a veracidade, então isso é bom. Obrigado pela sugestão.NTFJ, 86 bytes
Experimente aqui! Mas leia abaixo primeiro.
A entrada está implícita na pilha. O resultado é deixado na pilha. Adicione 16 bytes (um
*
ao final de cada) se desejar0x00
ou0x01
produza representando 0 e 1. Adicione 160 bytes adicionais se desejar a0
ou a1
impressão. (Coloque~~##~~~#{@
antes de cada um*
.)O único operador binário do NTFJ é o NAND, portanto, cada um deles é escrito no formato NAND.
Vamos analisar cada um deles.
0: false
~
representa um bit falso. Simples o suficiente. Como a entrada está implícita na parte inferior da pilha, ela é deixada na parte superior da pilha.1: peq
NTFJ opera em uma pilha.
:
é o comando para duplicado. Observe-se quep and q
≡not (p nand q)
e quenot q = q nand q
.(Note, então,
:|
pode ser considerado uma negação e|:|
uma conjunção )2: pe não q
Observe que isso é apenas uma negação
:|
e uma conjunção|:|
.3: p
$
aparece um item da pilha. Então sim.4: não peq
É a mesma coisa que 2, exceto com
#{
no início.#
empurra 1 (o bit verdadeiro) e{
gira a pilha para a esquerda uma vez. Simples o suficiente.5: q
Gire para a esquerda uma vez e solte.
6: xor
Observar:
No entanto, não há como duplicar completamente a pilha. Então, vamos ter que trazer cada um
p
,q
para o topo e duplicá-lo.E assim, temos o nosso xor.
7: p ou q
Negue o topo, traga de baixo para cima, negue isso e junte-os. Basicamente
p or q = (not p) nand (not q)
.8: não p e não q
Isso é simplesmente a negação do 7. Fácil.
9: eq
Isso é apenas xnor , ou não xor. Simples de novo.
10: não q
Negação de 5.
11: p ou não q
Negue p, nand.
(not p) nand q = not ((not p) and q) = p or (not q) (by De Morgan's laws)
.12: não p
Solte, pare e negue.
13: não p ou q
Leis de De Morgan para salvar o dia, novamente! Mesmo processo que 11, apenas negando em
q
vez dep
.14: não p ou não q
Isso é apenas uma imitação.
15: true
#
é o verdadeiro pedaço.fonte
:|
?Minecraft, 89 blocos
Em todas as fotos a seguir, os blocos azuis são para a Entrada A e os blocos laranja são para a Entrada B
16. portão VERDADEIRO - 1 quadra
15. portão NAND - 1x2x3 = 6 blocos
14. A => B - 1x2x3 = 6 blocos
13. NÃO A - 2 quarteirões
12. B => A - 1x2x3 = 6 blocos
11. NÃO B - 2 blocos
10. XNOR - 1x3x4 = 12 blocos
9. NOR - 1x2x3 = 6 blocos
8. OU - 1 bloco
7. XOR - 1x3x4 = 12 blocos
6. B - 1 bloco
5.! A&B - 1x2x5 = 10 blocos
4. A - 1 quadra
3. A &! B - 1x2x5 = 10 blocos
2. AND - 2x2x3 = 12 blocos
1. FALSO - 1 quadra
fonte
Mathematica, 67 bytes
Cada uma delas avalia uma função, para que você possa usá-las como
Ah, se apenas números inteiros fossem verdadeiros / falsos no Mathematica, esses quatro mais longos poderiam ter sido encurtados consideravelmente.
fonte
MATL,
3423 bytesEspero ter acertado o pedido! Zero é falsey, diferente de zero é verdade. Cada função recebe duas entradas implícitas (embora possa ignorar algumas entradas). A primeira entrada é A e a segunda é B. Você pode inserir
0
/1
para verdadeiro / falso ouT
/F
.Aqui está um exemplo TryItOnline para o caso de teste 3.
Salvei 4 bytes usando
*
forand
e outros 4 usando>
/ em<
vez de~wY&
/w~Y&
depois que eu vi a resposta de Dennis!fonte
-
dc, 37 bytes
dc
("calculadora de mesa") é um comando unix padrão, uma calculadora postfix baseada em pilha. Faltam operações de bit e os operadores de comparação podem ser usados apenas para executar macros (que não valem os bytes). A divisão inteira compensa parte disso.Esses scripts esperam
0
e1
valores na pilha e deixam o resultado na pilha.fonte
Labirinto , 85 bytes
Agradecimentos ao Sp3000 por salvar 2 bytes.
Todos esses são programas completos, lendo dois números inteiros
0
ou1
de STDIN (usando qualquer separador que não seja um dígito) e imprimindo o resultado como0
ou1
para STDOUT.Experimente online! (Não é um conjunto de testes, você precisará experimentar diferentes programas e entradas manualmente.)
Quanto às explicações, estas são todas bastante diretas. Todos os programas são lineares e os comandos em uso fazem o seguinte:
Observe que eu estou usando
#
é sempre usado para combiná-lo com$
, ou sejaXOR 1
, calcular ou, em outras palavras, negação lógica. Somente em alguns casos eu consegui usá-lo~
, porque o subsequente&
descarta todos os bits indesejados do-1
or ou resultante-2
.fonte
Código de máquina IA-32, 63 bytes
Hexdump do código, com a desmontagem:
O código é mais longo do que poderia ser, porque usa uma convenção de codificação padrão: input in
ecx
eedx
, e output inal
. Isso pode ser expresso em C comoParece que o MS Visual Studio não entende o
SALC
código de operação não documentado , então tive que usar o código dele, em vez do nome.Obrigado l4m2 por melhorar algumas das amostras de código!
fonte
1110 8D4411FE LEA EAX, [ECX+EDX-2]
C 34 bytes
Onde n é o número da função a ser usado, mas acho que seria recusado, então proponho este outro:
C 244 bytes (usando memória)
usa matriz indexada dupla.
n[0][1]
é(A implies B)(0,1)
Quartos 138 bytes
Acabei de aprender Forth. Suponho que seja compatível com Ansi Forth, pois também é executado no gforth.
A função z cria uma nova função com o nome fornecido e, em seguida, coloca o número da porta lógica da parte superior da pilha no novo endereço da função. Ele deixa a próxima função de porta lógica (n + 1) na pilha para a próxima declaração.
você pode testá-lo:
e AB
("." imprimir a parte superior da pilha "cr" é um retorno de cariage)
fonte
C, 268 bytes
Macros parecem mais curtas que funções.
fonte
Brian & Chuck , 183 bytes
Agradecimentos ao Sp3000 por salvar 4 bytes.
Alguns dos programas contêm um caractere não imprimível. Em particular, todos
\x01
devem ser substituídos pelo<SOH>
caractere de controle (0x01):A entrada e a saída usam valores de bytes , portanto, a entrada deve ter dois bytes de 0x00 ou 0x01 (sem separador) e a saída será um desses bytes. Essa também é, na verdade, a definição mais sensata de verdade / falsidade para B&C porque o único comando de fluxo de controle
?
considera zeros como falsidade e tudo o resto.Explicações
Primeiro, um rápido iniciador B&C:
,
comando (input byte) e apenas Chuck pode usar o.
comando (output byte).[]
loop de Brainfuck não existe. Em vez disso, o único fluxo de controle que você possui é o?
que alterna o controle para a outra instância se o valor atual sob a cabeça da fita for diferente de zero.>
e<
, há{
e}
que são essencialmente equivalentes aos trechos de Brainfuck[<]
e[>]
, isto é, eles movem a cabeça da fita para a próxima posição zero nessa direção. A principal diferença é que{
também pode ser parado na extremidade esquerda da fita, independentemente do valor que ela possui._
s no código fonte é substituído por bytes nulos (pois são muito úteis em programas não triviais para capturar{
e}
).Observe que em todos os programas, a fita de Chuck começa com a
#
. Isso poderia realmente ser qualquer coisa.?
funciona de forma que o cabeçote da fita mova uma célula antes de iniciar a execução (para que a própria condição não seja executada se for um comando válido). Portanto, nunca podemos usar a primeira célula do Chuck para código.Existem cinco classes de programas, que explicarei em detalhes mais adiante. Por enquanto, estou listando-os aqui em ordem crescente de complexidade.
0000
,1111
: Funções constantesEstes são muito simples. Mudamos para Chuck incondicionalmente. Chuck move a cabeça da fita para a célula não utilizada à direita e a imprime diretamente ou a incrementa primeiro para imprimir
1
.0011
,0101
,1010
,1100
: Funções dependendo apenas uma entradaDependendo de começarmos
,
ou,,
trabalharmos comA
ouB
. Vejamos o primeiro exemplo0011
(ieA
). Depois de ler o valor, usamos?
como condicional esse valor. SeA = 1
, isso muda para Chuck, que move a cabeça da fita para a direita e imprime o1
byte literalmente incorporado . Caso contrário, o controle permanece em Brian. Aqui, o byte de 1 é um no-op. Em seguida, incrementamos bem a entrada+
para garantir que não seja zero e depois mudamos para Chuck com?
. Desta vez,>
move-se para uma célula não utilizada à direita, que é impressa como0
.Para negar um dos valores, simplesmente o diminuímos
-
. Esta transforma1
em0
e0
em-1
, que é diferente de zero e, portanto, truthy tanto quanto?
está em causa.0001
,0010
,0100
,1000
: Funções binários com um resultado truthyEsta é uma extensão da ideia anterior para trabalhar com duas entradas. Vejamos o exemplo de
1000
(NOR). (Potencialmente) lemos as duas entradas com,?
. Se um desses for1
, o?
comutador para Chuck. Ele move a cabeça da fita até o fim com}
(para a célula vazia após o código de Brian), move outra célula com>
(ainda zero) e a imprime.
.No entanto, se as duas entradas forem zero, o controle ainda estará com Brian.
>
depois move a cabeça da fita para}
que este comando não seja executado quando mudarmos para Chuck with?
. Agora tudo o que Chuck faz é>.
que apenas se move para a1
célula -e imprime isso.Podemos obter facilmente as outras três funções negando uma ou ambas as entradas, conforme necessário.
0111
,1011
,1101
,1110
: Funções binários com três resultados truthyUma pequena modificação da idéia anterior, a fim de negar o resultado (ou seja, imprimir
0
quando passamos por Brian e1
outros). Vejamos0111
(OR) como um exemplo. Observe que o1
byte incorporado é um no-op, então isso ainda começa com,?,?
. Se qualquer uma das entradas for1
, mudamos para Chuck, que move a cabeça da fita de volta ao início{
.>.
move a cabeça da fita para esse1
byte e a imprime.Se as duas entradas forem zero, permaneceremos com Brian, mova a cabeça da fita
{
para pular e depois mude para Chuck. Quando ele executa>.
esse tempo, ele se move para a célula vazia após o código de Brian e imprime o0
.Novamente, obtemos facilmente as outras funções negando uma ou ambas as entradas.
0110
,1001
: Funções binárias com dois resultados de verdadeEste é um pouco mais complicado. As funções anteriores eram razoavelmente simples porque podem estar em curto-circuito - o valor da primeira entrada pode decidir a saída e, se não, então examinamos a outra entrada. Para essas duas funções, sempre precisamos examinar as duas entradas.
A idéia básica é usar a primeira entrada para decidir se a segunda entrada escolhe entre
0
e /1
ou entre1
e0
. Vamos tomar0110
(XOR) como um exemplo:Considere
A = 0
. Neste caso, queremos produzirB
como estão.,
lêA
,?
não faz nada.>
passa para a próxima célula (diferente de zero), o que}
nos leva ao_
Chuck on. Aqui, podemos lerB
com,
e usar?
novamente. SeB
foi0
assim, ainda estamos no Brian.>
pula o}
Chuck e?
alterna para que>.
imprima o0
incorporado no código-fonte de Brian. SeB
foi1
, por outro lado, Chuck não executar o}
que se move no_
no código de Brian já, de modo que o>.
então imprime o1
-byte vez.Se
A = 1
, então, mudaremos imediatamente para Chuck, que executará}+{>?
. O que isso faz é mover para o_
código-fonte de Brian, transformá-lo em um1
também+
e depois voltar ao início{
e pular o de Brian?
movendo uma célula para a direita>
antes de devolver o controle a ele. Desta vez, depois que Brian leuB
, seB = 0
e Chuck usa>.
a célula ao lado de Brian,?
será em1
vez de0
. Além disso, quandoB = 1
Chuck}
pula o que costumava ser uma lacuna e se move todo o caminho até o final da fita, de modo que>.
imprime um zero. Dessa forma, estamos imprimindonot B
.Para implementar a equivalência, simplesmente negamos
A
antes de usá-la como condição. Observe que, devido a isso, também precisamos adicionar outro>
ao Chuck para pular isso-
também ao voltar ao início.fonte
ClojureScript,
88 84 7674 bytesnil
efalse
são falsas, todos os outros valores são verdadeiros. Booleanos coagem a 0/1 para aritmética e desigualdades. Funções podem receber o número errado de argumentos.fonte
0
falso?not not(0)
comoFalse
, qual é o valor de falsey.#f
,f
,false
, etc) é falso. Todos os outros valores são verdadeiros na maioria das linguagens funcionais.Brainfuck ,
184178174 bytesA entrada / saída usa U + 0000 e U + 0001.
fonte
0001
você não poderia simplesmente fazer,[,>]<.
(dado um intérprete que permite ir para a esquerda da célula inicial)?Flak cerebral ,
418, 316 bytesExperimente online!
Deixe que as entradas sejam os dois principais números da pilha no início do programa (zero para falso um para verdadeiro) e a saída esteja no topo da pilha no final do programa (zero para falso ou falso).
false, 4 bytes (Cortesia de Leaky Nun )
(<>)
e 36 bytes
(({}{}[(())()])){{}{}(((<{}>)))}{}{}
A e não B, 40 bytes
((({}){}{}[(())()])){{}{}(((<{}>)))}{}{}
A, 6 bytes
({}<>)
não A e B, 38 bytes
((({}){}{}[(())])){{}{}(((<{}>)))}{}{}
B, 2 bytes
{}
xor, 34 bytes
(({}{}[(())])){{}{}(((<{}>)))}{}{}
ou 6 bytes
({}{})
nem 34 bytes
(({}{}<(())>)){{}{}(((<{}>)))}{}{}
xnor, 10 bytes
({}{}[()])
não B, 34 bytes
{}(({}<(())>)){{}{}(((<{}>)))}{}{}
B implica A, 14 bytes
(({}){}{}[()])
não A, 34 bytes
(({}<{}(())>)){{}{}(((<{}>)))}{}{}
A implica B, 16 bytes
(({}){}{}[()()])
e 12 bytes
({}{}[()()])
verdadeiro, 6 bytes
<>(())
Explicação
Como a maioria delas é muito parecida, não vou explicar exatamente como cada uma delas funciona. Tento o meu melhor para deixar claro, no entanto, como todos os dezesseis funcionam.
Primeiro, são os portões que retornam três do mesmo valor (ou seja, 2, 3, 5, 8, 9, 12, 14 e 15). Todos eles seguem o mesmo padrão. Primeiro, você converte a entrada em um número de dois bits com a como os dois lugares e B como esses. Isso é feito com este trecho
(({}){}{})
. Você subtrai o valor da entrada de dois bits que deseja isolar({}[value])
. (No código real, a subtração e a conversão são feitas em uma etapa para salvar bytes). Isto pode ser combinado com um não, se necessário:(({}<(())>)){{}{}(((<{}>)))}{}{}
.A seguir: e, nem, ou, xor e xnor. Estes funcionam de forma semelhante aos acima. De fato, alguns deles estão incluídos acima, porém esse método é mais curto. O truque que usei aqui é que cada um corresponde a uma soma de A B. Por exemplo, xor avalia como verdadeiro se A + B = 1 e falso de outra forma. Primeiro você adiciona AB e subtrai a quantia relevante. Expressado como
({}{}[0,1,2 or 3])
. Então, se necessário, conduza umA seguir: A, B, não A e não B. Estes são praticamente auto-explicativos. Começamos removendo o valor desnecessário e depois negamos ou terminamos.
Por fim, são os dois simplórios: verdadeiro e falso. Para estes, colocamos o valor correto na pilha off. O
<>
nilad retorna zero, para que possamos salvar dois bytes usando a opção como valor zero.Não é a solução mais eficiente disponível no mercado (talvez a mais eficiente no Brain-Flak), mas me diverti bastante escrevendo isso e imploro que você tente encurtá-las.
fonte
(<>)
é suficiente parafalse
; Também,(<{}{}>)
é de 8 bytes(<>)
deixará as entradas e colocará o zero na outra pilha.<>
suficientefalse
devido a zeros implícitos? Além disso, acho quea
pode ser o programa vazio.true
pode ser<>[][]
(não salva bytes, mas parece legal: P).ProgFk ,
18,517,5 bytesComo as instruções do ProgFk são especificadas em mordidelas, o código abaixo é fornecido em hexadecimal, um portão lógico por linha e com espaços entre os bytes.
Explicação
ProgFk é um esolang baseado em fita (semelhante ao Brainfuck), em que cada célula é um pouco e as instruções são fornecidas como petiscos (4 bytes). As instruções operam na célula apontada pelo ponteiro da instrução. A entrada é fornecida na primeira e na segunda célula (com
A
eB
sendo a primeira e a segunda células, respectivamente), e o ponteiro da instrução começa na primeira célula. A saída é armazenada na primeira célula.Cada instrução usada é explicada abaixo.
Guardou um byte graças a @LeakyNun!
fonte
Na verdade, 24 bytes
Esses programas recebem entrada como
A\nB
(\n
representando uma nova linha), que deixa B no topo da pilha, com A abaixo.False
é representado por0
eTrue
é representado por qualquer número inteiro positivo.Agradecimentos a Leaky Nun por 3 bytes
fonte