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>
Respuestas:
Dominó , 122,000 bytes o 72 fichas
El recuento de bytes es el tamaño del archivo guardado que es
0.122 MB
.La informática de Domino fue la inspiración. He probado todo esto hasta la simetría (¡y más allá!) A través de un juego de Steam de realidad virtual llamado Tabletop Simulator .
Detalles
True
o1False
o0100%
Puertas
644343151132171376761615TL; DR
Había estado esperando / queriendo un desafío amigable para el dominó y cuando vi esto, no pude dejarlo pasar. ¡El único problema era que aparentemente ya nadie posee fichas de dominó! Así que finalmente cedí y compré un Doce Dobles . Este conjunto tiene 91 mosaicos, lo que me dio la idea de tener una 'función call' / start domino en lugar del método normal (largo) 'time delay'. El crédito por el giro de 90 grados pertenece al canal de dominoesdouble07 .
Después de construirlos con dominó físico, se determinó en meta que las soluciones válidas deberían ser digitales. Así que recreé estas puertas en Tabletop Simulator . Lamentablemente, TS y la realidad no están de acuerdo en la física del dominó. Esto me obligó a agregar 11 fichas de dominó, pero también ahorré 8. En general, las fichas de dominó virtuales son aproximadamente x150 más efectivas en términos de creación y prueba ( Ctrl+ Z).
Actualizar
xor xnor nand
xnor
yxor
xor
yxnor
). El bloqueo en Tabletop solo requiere 1 dominó, en lugar de 2.fuente
Hexagonía , 89 bytes.
Gracias a FryAmTheEggman por la inspiración necesaria para la solución XOR.
Todos los programas se usan
0
para falso y1
para verdadero.Pruébalo en línea! Este no es un conjunto de pruebas, tendrá que copiar los diferentes programas y entradas usted mismo.
La solución anterior está dentro de los 2 bytes de la optimización (a menos que relajemos la interpretación verdadero / falso, supongo). He dejado un bruto barrido de búsqueda vigor durante cerca de dos días más de todos los programas que encaja en el lado de longitud 2, es decir, hasta 7 bytes (no bastantes Todos los programas - Hice algunas suposiciones sobre lo que las necesidades de cada programa válido y lo que hay programa válido podría tener). La búsqueda encontró soluciones para 15 de las 16 puertas posibles, y a menudo mucho más que solo una. Puede encontrar una lista de todas las soluciones alternativas en este pastebin donde también las he agrupado por comportamiento equivalente. Las que muestro arriba las he seleccionado porque son la solución más simple o la más interesante, y agregaré explicaciones para ellas mañana.
En cuanto a la 16ª puerta: XOR es la única puerta que aparentemente no se puede implementar en 7 bytes. Desafortunadamente, una búsqueda de fuerza bruta en programas más grandes no es factible con el código que tengo actualmente. Entonces XOR tuvo que ser escrito a mano. Lo más corto que he encontrado hasta ahora es el programa anterior de 10 bytes, que se basa en un intento fallido (pero muy cercano) de FryAmTheEggman. Es posible que exista una solución de 8 bytes o 9 bytes, pero aparte de eso, todas las soluciones deberían ser óptimas.
Explicaciones
Advertencia: muro de texto. En caso de que alguien esté interesado en cómo funcionan realmente estos programas de Hexagonía altamente comprimidos, he incluido explicaciones para cada uno de ellos a continuación. Intenté elegir la solución más simple para cada puerta en los casos en que existe más de un programa óptimo, para mantener las explicaciones razonablemente cortas. Sin embargo, algunos de ellos todavía aturden la mente, así que pensé que merecían un poco más de elaboración.
0000
: FalsoNo creo que necesitemos un diagrama para este:
Como toda la cuadrícula de memoria se inicializa en ceros,
!
simplemente imprime un cero y@
finaliza el programa.Esta es también la única solución de 2 bytes.
0001
: YEsto básicamente implementa cortocircuito . El siguiente diagrama gris muestra el comienzo del programa, donde se lee la primera entrada
?
y el puntero de instrucción (IP) se ajusta a la esquina izquierda donde lo|
refleja el espejo. Ahora la esquina actúa como condicional, por lo que hay dos rutas de ejecución diferentes según el valor de la primera entrada. El diagrama rojo muestra el flujo de control paraA = 0
y el diagrama verde paraA = 1
:Como puede ver, cuando
A
está0
, simplemente lo imprimimos y terminamos (recuerde que todos.
son no-ops). Pero cuandoA
es así1
, la IP atraviesa la primera fila de nuevo, leyendoB
e imprimiendo eso.En total hay dieciséis soluciones de 5 bytes para esta puerta. Catorce de ellos son esencialmente los mismos que los anteriores, ya sea usando en
>
lugar de|
o reemplazando.
con un comando que es efectivamente un no-op, o colocando?
en la segunda posición:Y luego hay otras dos soluciones (que son equivalentes entre sí). Estos también implementan la misma lógica de cortocircuito, pero las rutas de ejecución son un poco más locas (y se dejan como ejercicio para el lector):
0010
: A y no BEsto también implementa una forma de cortocircuito, pero debido al uso del
#
flujo de control es mucho más complicado.#
es un conmutador de IP condicional. Hexagony realidad viene con seis direcciones IP marcadas0
a5
, que comienzan en las seis esquinas de la rejilla, apuntando a lo largo de su borde hacia la derecha (y el programa siempre comienza con IP0
). Cuando#
se encuentra a, el valor actual se toma módulo6
y el flujo de control continúa con la IP correspondiente. No estoy seguro de qué ataque de locura me hizo agregar esta función, pero ciertamente permite algunos programas sorprendentes (como este).Distinguiremos tres casos. Cuando
A = 0
, el programa es bastante simple, porque el valor siempre es0
cuando#
se encuentra de tal manera que no se produce el cambio de IP:#
no hace nada,?
leeA
(es decir, tampoco hace nada),#
sigue sin hacer nada,!
imprime0
, lo)
incrementa (esto es importante, de lo contrario la IP no saltaría a la tercera línea),@
finaliza el programa. Suficientemente simple. Ahora consideremos el caso(A, B) = (1, 0)
:La ruta roja todavía corresponde a IP
0
, y he agregado la ruta verde para IP1
. Vemos que después de las?
lecturasA
(1
esta vez),#
cambia a la IP que comienza en la esquina superior derecha. Eso significa que?
puede leerB
(0
). Ahora)
incrementa eso a1
tal que la#
esquina superior izquierda no hace nada y nos quedamos con IP1
. El!
imprime1
y el IP se envuelve alrededor de la diagonal izquierda.#
Todavía no hace nada y@
finaliza el programa.Finalmente, el caso realmente extraño donde ambas entradas son
1
:Esta vez, la segunda entrada también es
1
y la)
incrementa a2
. Eso significa que#
en la esquina superior izquierda causa otro cambio de IP a IP2
, indicar en azul. En ese camino, primero lo incrementamos aún más3
(aunque eso es irrelevante) y luego pasamos la?
tercera vez. Como ahora hemos alcanzado EOF (es decir, la entrada está agotada),?
devuelve0
,!
imprime eso y@
finaliza el programa.Notablemente, esta es la única solución de 6 bytes para esta puerta.
0011
: UNAEsto es lo suficientemente simple como para que no necesitemos un diagrama: lo
?
leeA
, lo!
imprime y@
termina.Esta es la única solución de 3 bytes para esta puerta. (En principio, también sería posible hacerlo
,;@
, pero la búsqueda no incluyó;
, porque no creo que pueda guardar bytes!
para esta tarea).0100
: B y no AEste es mucho más simple que su "hermano"
0010
. El flujo de control es en realidad el mismo que hemos visto anteriormente para0001
(Y). SiA = 0
, entonces el IP atraviesa la línea inferior, leyendoB
e imprimiendo eso antes de terminar. SiA = 1
luego, el IP atraviesa la primera línea nuevamente, también leeB
, pero+
agrega dos bordes de memoria no utilizados, por lo que todo lo que hace es restablecer el valor actual0
, para que!
siempre se imprima0
.Hay bastantes alternativas de 6 bytes para esto (42 en total). Primero, hay un montón de soluciones equivalentes a las anteriores. Nuevamente podemos elegir libremente entre
|
y>
, y+
podemos reemplazarlo con cualquier otro comando que nos dé un borde vacío:Además, también podemos usar en
]
lugar de?
.]
se mueve a la siguiente IP (es decir, selecciona la IP1
), de modo que esta rama reutiliza?
en su lugar la esquina superior derecha. Eso da otras 18 soluciones:Y luego hay otras seis soluciones que funcionan de manera diferente con diferentes niveles de locura:
0101
: BWoohoo, otro simple: leer
A
, leerB
, imprimirB
, terminar. Sin embargo, en realidad hay alternativas a esto. ComoA
solo es un carácter, también podemos leerlo con,
:Y también existe la opción de usar un solo
?
y usar un espejo para ejecutarlo dos veces:0110
: XorComo dije anteriormente, esta era la única puerta que no cabía en la longitud lateral 2, por lo que esta es una solución escrita a mano por FryAmTheEggman y yo, y hay una buena posibilidad de que no sea óptima. Hay dos casos para distinguir. Si
A = 0
el flujo de control es bastante simple (porque en ese caso solo necesitamos imprimirB
):Comenzamos en el camino rojo.
?
leeA
,<
es una rama que desvía el cero a la izquierda. La IP se ajusta a la parte inferior, luego_
es otro espejo, y cuando la IP llega a la esquina, se ajusta a la esquina superior izquierda y continúa en el camino azul.?
lo leeB
, lo!
imprime. Ahora lo(
decrementa. Esto es importante porque garantiza que el valor no sea positivo (es0
o-1
ahora). Eso hace que IP se ajuste a la esquina derecha, donde@
termina el programa.Cuando las
A = 1
cosas se ponen un poco más difíciles. En ese caso, queremos imprimirnot B
, lo que en sí mismo no es demasiado difícil, pero la ruta de ejecución es un poco extraña.Esta vez,
<
desvía la IP hacia la derecha y luego<
actúa como un espejo. Entonces, la IP atraviesa la misma ruta en reversa, leyendoB
cuando se encuentra?
nuevamente. La IP se ajusta a la esquina derecha y continúa en el camino verde. Encuentra a continuación(~
que es "decremento, se multiplica por -1", que permutas0
y1
y por lo tanto calculanot B
.\
es solo un espejo e!
imprime el resultado deseado. Luego?
intenta devolver otro número pero devuelve cero. La IP ahora continúa en la esquina inferior izquierda del camino azul.(
decrementos,<
refleja,(
disminuye nuevamente, de modo que el valor actual es negativo cuando la IP llega a la esquina. Se mueve a través de la diagonal inferior derecha y luego finalmente golpea@
para terminar el programa.0111
: OMás cortocircuito.
El
A = 0
caso (el camino rojo) es un poco confuso aquí. El IP se desvía a la izquierda, se envuelve en la esquina inferior izquierda, se refleja inmediatamente en el<
y vuelve a la?
lecturaB
. A continuación, envuelve a la esquina rigt, imprimeB
con!
y termina.El
A = 1
caso (el camino verde) es un poco más simple. La<
rama desvía la IP hacia la derecha, por lo que simplemente imprimimos!
, volvemos a la esquina superior izquierda y terminamos en@
.Solo hay otra solución de 5 bytes:
Funciona esencialmente igual, pero las rutas de ejecución reales son bastante diferentes y utiliza una esquina para ramificar en lugar de a
<
.1000
: NiEste podría ser mi programa favorito encontrado en esta búsqueda. Lo mejor es que esta implementación
nor
realmente funciona para hasta 5 entradas. Tendré que entrar un poco en los detalles del modelo de memoria para explicarlo. Entonces, como una actualización rápida, el modelo de memoria de Hexagony es una cuadrícula hexagonal separada, donde cada borde tiene un valor entero (inicialmente todo cero). Hay un puntero de memoria (MP) que indica un borde y una dirección a lo largo de ese borde (de modo que hay dos bordes vecinos delante y detrás del borde actual, con vecinos significativos izquierdo y derecho). Aquí hay un diagrama de los bordes que usaremos, con el MP comenzando como se muestra en rojo:Primero consideremos el caso donde ambas entradas son
0
:Comenzamos en la ruta gris, que simplemente incrementa el borde A para
1
que#
cambie a IP,1
que es la ruta azul, comenzando en la esquina superior derecha.\
no hace nada allí y?
lee una entrada. Nos ajustamos a la esquina superior izquierda donde)
incrementa esa entrada. Ahora, siempre que la entrada sea cero, esto dará como resultado a1
, por lo que eso#
no hace nada. Entonces{
se mueve la MP a la izquierda, es decir, en la primera iteración de A a B . Dado que este borde aún tiene su cero inicial, la IP vuelve a la esquina superior derecha y en un nuevo borde de memoria. Entonces, este bucle continuará mientras?
lea ceros, moviendo el MP alrededor del hexágono desde Ba C a D y así sucesivamente. No importa si?
devuelve un cero porque era una entrada o porque era EOF.Después de seis iteraciones a través de este bucle,
{
vuelve a A . Esta vez, el borde ya contiene el valor1
desde la primera iteración, por lo que la IP se ajusta a la esquina izquierda y continúa en el camino verde.!
simplemente imprime eso1
y@
finaliza el programa.Ahora, ¿qué pasa si alguna de las entradas es
1
?Luego
?
lee eso1
en algún momento y lo)
incrementa a2
. Eso significa#
que ahora cambiará las direcciones IP nuevamente y continuaremos en la esquina derecha del camino rojo.?
lee otra entrada (si hay una), que realmente no importa y se{
mueve un poco más. Esto tiene que ser un borde no utilizado, por lo tanto, funciona para hasta 5 entradas. La IP se ajusta a la esquina superior derecha donde se refleja inmediatamente y se ajusta a la esquina izquierda.!
imprime0
en el borde no utilizado y#
vuelve a cambiar a IP0
. Esa IP todavía estaba esperando en el#
, yendo hacia el suroeste (camino gris), por lo que inmediatamente golpea@
y finaliza el programa.En total, hay siete soluciones de 7 bytes para esta puerta. 5 de ellos funcionan igual que esto y simplemente usan otros comandos para moverse a un borde no utilizado (y pueden caminar alrededor de un hexágono diferente o en una dirección diferente):
Y hay otra clase de soluciones que solo funciona con dos entradas, pero cuyas rutas de ejecución son incluso más desordenadas:
1001
: IgualdadEsto también hace un uso muy inteligente de la selección de IP condicional. Necesitamos distinguir nuevamente entre
A = 0
yA = 1
. En el primer caso queremos imprimirnot B
, en el segundo queremos imprimirB
. PorqueA = 0
también distinguimos los dos casos paraB
. Comencemos conA = B = 0
:Comenzamos en el camino gris.
(~
se puede ignorar, la IP se ajusta a la esquina izquierda (todavía en el camino gris) y se leeA
con?
.(
disminuye eso, por lo que obtenemos una-1
envoltura de IP en la esquina inferior izquierda. Ahora, como dije antes,#
toma el módulo de valor6
antes de elegir la IP, por lo que un valor de-1
realmente sale de IP5
, que comienza en la esquina izquierda del camino rojo.?
leeB
,(
decrementa eso también para que permanezcamos en IP5
cuando golpeemos#
nuevamente.~
niega-1
para que la IP se ajuste a la esquina inferior derecha, imprima1
y finalice.Ahora, si
B
es así1
, el valor actual será0
cuando lleguemos a#
la segunda vez, así que volveremos a IP0
(ahora en la ruta verde). Eso golpea?
por tercera vez, cediendo0
, lo!
imprime y@
termina.Finalmente, el caso donde
A = 1
. Esta vez, el valor actual ya es cero cuando golpeamos#
por primera vez, por lo que esto nunca cambia a IP5
en primer lugar. Simplemente continuamos inmediatamente en el camino verde.?
ahora no solo da un cero, sino que regresaB
.!
lo imprime y@
termina de nuevo.En total, hay tres soluciones de 7 bytes para esta puerta. Los otros dos funcionan de manera muy diferente (incluso el uno del otro), y hacen un uso aún más extraño
#
. En particular, leen uno o más valores con,
(leyendo un código de caracteres en lugar de un entero) y luego usan ese valor módulo 6 para elegir una IP. Es bastante loco.1010
: No es bEste es bastante simple. La ruta de ejecución es la rama horizontal que ya conocemos de
and
antes.??
leeA
y luego inmediatamenteB
. Después de reflexionar|
y bifurcar,B = 0
ejecutaremos la rama inferior, donde)
incrementa el valor al1
cual se imprime!
. En la rama superior (siB = 1
),?
simplemente restablezca el borde en el0
que también se imprime!
.Hay ocho programas de 6 bytes para esta puerta. Cuatro de ellos son más o menos lo mismo, usando en
>
lugar de|
o en1
lugar de)
(o ambos):Dos usan un solo
?
que se usa dos veces debido a un espejo. La negación entonces sucede como lo hicimosxor
con cualquiera(~
o~)
.Y finalmente, dos soluciones usan un conmutador de IP condicional, porque ¿por qué usar la forma simple si la enrevesada también funciona?
1011
: B implica AEsto utiliza una conmutación de IP bastante elaborada. Comenzaré con el
A = 1
caso esta vez, porque es más simple:Comenzamos en el camino gris, que lee
A
con?
y luego golpea el#
. DadoA
que1
esto cambia a IP1
(ruta verde). El!
imprime de inmediato que, la IP se ajusta a la parte superior izquierda, leeB
(innecesariamente) y termina.Cuando las
A = 0
cosas se ponen un poco más interesantes. Primero consideremosA = B = 0
:Esta vez,
#
no hace nada y permanecemos en IP0
(ruta roja desde ese punto en adelante).?
lo leeB
y lo1
convierte en a1
. Después de pasar a la esquina superior izquierda, golpeamos#
nuevamente, así que terminamos en el camino verde después de todo, e imprimimos1
como antes, antes de terminar.Finalmente, aquí está
(A, B) = (0, 1)
el caso falso:Tenga en cuenta que he eliminado la ruta gris inicial para mayor claridad, pero el programa comienza de la misma manera y terminamos en la ruta roja como antes. Entonces esta vez
?
vuelve el segundo1
. Ahora nos encontramos con el1
. En este punto, es importante comprender qué hacen realmente los dígitos en Hexagony (hasta ahora solo los hemos usado en ceros): cuando se encuentra un dígito, el valor actual se multiplica por 10 y luego se agrega el dígito. Esto normalmente se usa para escribir números decimales textualmente en el código fuente, pero significa que enB = 1
realidad está asignado al valor11
. Entonces, cuando golpeamos#
, esto se toma un módulo6
para dar5
y, por lo tanto, cambiamos a IP5
(en lugar de1
como antes) y continuamos en el camino azul. Golpear?
una tercera vez devuelve un cero, por lo!
que imprime eso, y después de otras dos?
, la IP se ajusta a la parte inferior derecha donde termina el programa.Hay cuatro soluciones de 7 bytes para esto y todas funcionan de manera diferente:
1100
: No unSolo una lineal simple: leer
A
con?
, negar con(~
, imprimir con!
, terminar con@
.Hay una solución alternativa, y eso es negar con
~)
:1101
: A implica BEsto es mucho más simple que la implicación opuesta de la que acabamos de hablar. Es nuevamente uno de esos programas de rama horizontal, como el de
and
. SiA
es así0
, simplemente se incrementa1
en la rama inferior y se imprime. De lo contrario, la rama superior se ejecuta nuevamente donde?
leeB
y luego!
imprime eso.Aquí hay un montón de alternativas (66 soluciones en total), principalmente debido a la libre elección de no-operaciones efectivas. Para empezar, podemos variar la solución anterior de la misma manera que podríamos
and
y también podemos elegir entre)
y1
:Y luego hay una versión diferente que usa la selección de IP condicional, donde el primer comando se puede elegir casi arbitrariamente, y también hay una opción entre
)
y1
para algunas de esas opciones:1110
: NandEl último complicado. Si todavía estás leyendo, casi lo logras. :) Veamos
A = 0
primero:?
leeA
y luego golpeamos$
. Este es un comando de salto (como el de Befunge#
) que omite la siguiente instrucción para que no terminemos en el@
. En cambio, la IP continúa en#
. Sin embargo, comoA
es0
, esto no hace nada.)
lo incrementa para1
que la IP continúe en la ruta inferior donde1
se imprime. El<
desvío de la IP hacia la derecha donde se ajusta a la esquina izquierda y el programa termina.Luego, cuando la entrada es
(A, B) = (1, 0)
, obtenemos esta situación:Es esencialmente lo mismo que antes, excepto que en el
#
cambio a IP1
(ruta verde), pero dadoB
que0
cambiamos a IP0
cuando golpeamos#
por segunda vez (ahora ruta azul), donde se imprime1
como antes.Finalmente, el
A = B = 1
caso:Esta vez, cuando somos
#
la segunda vez, el valor actual sigue siendo1
así que no volveremos a cambiar la IP. Lo<
refleja y la tercera vez que golpeamos?
obtenemos un cero. Por lo tanto, la IP se ajusta a la parte inferior izquierda donde!
imprime el cero y finaliza el programa.Hay nueve soluciones de 7 bytes en total para esto. La primera alternativa simplemente usa en
1
lugar de)
:Luego, hay dos soluciones que te ayudarán con la cantidad de conmutación de IP que está ocurriendo:
Esto realmente me dejó alucinado: la parte interesante es que la conmutación de IP se puede usar como un condicional diferido. Las reglas de cambio de IP del lenguaje son tales que la IP actual da otro paso antes de que ocurra el cambio. Si ese paso pasa por una esquina, entonces el valor actual decide en qué rama continuará la IP si alguna vez volvemos a ella. Exactamente esto sucede cuando la entrada es
A = B = 1
. Aunque todo esto es coherente con la forma en que diseñé el lenguaje, nunca fui consciente de esta implicación de la especificación, por lo que es bueno cuando mi lenguaje me enseña algunos trucos nuevos: D.Luego hay una tercera solución cuya cantidad de conmutación de IP es aún peor (aunque no hace uso de ese efecto condicional diferido):
Y luego hay otro:
Y luego están estas cuatro soluciones equivalentes, que utilizan una conmutación de IP no condicional y en su lugar implementan toda la lógica a través de ramas y esquinas:
1111
: CiertoTe has ganado algo simple para el final: establece el borde en
1
, imprime con!
, termina con@
. :)Por supuesto, hay una alternativa:
Como de costumbre, todos los diagramas de flujo de control creados con HexagonyColorer de Timwi y el diagrama de memoria con su EsotericIDE .
fuente
APL
222018 bytesLas entradas verdaderas y falsas son programas completos, y las otras 14 son funciones. (Gracias a Adám.)
Pruébalo aquí
fuente
0
y1
.Ajedrez / jugador de ajedrez mediocre en final de juego, 70 piezas
Inspirado por esa respuesta de dominó, decidí que otro juego debería tener este honor.
Tenga en cuenta que tomé algunas reglas sobre cómo se mueven las piezas. Debido a que no tengo ganas de estudiar los movimientos óptimos para cada situación, las reglas para el movimiento de los blancos son simples: mantente fuera de control, captura la pieza de mayor rango que pueda ese turno, mientras pierdes la menor cantidad de material posible y detienes un peón de promover, en ese orden de prioridad. Si hay dos espacios a los que puede moverse, con igual preferencia, puede moverse a cualquiera de ellos (por lo tanto, en estos, si puede moverse a más de un cuadrado, son del mismo color). Tenga en cuenta que el blanco capturará con algo, incluso si se captura, si la pieza que está atacando tiene un valor mayor que el perdido. Los valores están aquí:
pawn<knight=bishop<rook<queen
La entrada es si una torre está presente o no. Tenga en cuenta que las torres solo se etiquetan con los nombres A y B cuando es importante: si la puerta se comporta igual cuando se cambian las torres, no se etiquetan.
La salida es el color del rey blanco cuadrado termina en: Blanco = 1, negro = 0
Antes de las imágenes, quiero disculparme por las imágenes pobres. No soy muy bueno para sostener una cámara estable.
Falso 4:
Y 4:
A y no B, 5 (creo que puedo reducir esto a tres, pero no tengo tablero en este momento):
A, 4:
No A y B, 5 (creo que puedo reducir esto a tres, pero no tengo tablero en este momento):
B, 4:
Xor, 5 (sé una forma de hacerlo 4, pero no tengo el tablero en este momento):
O 4:
Ni 4:
Xnor, 5 (sé una forma de hacerlo 4, pero no tengo el tablero en este momento):
No B, 4:
B implica A, 5 (creo que puedo reducir esto a tres, pero no tengo tablero en este momento):
No A, 4:
A implica B, 5 (creo que puedo reducir esto a tres, pero no tengo tablero en este momento):
Nand, 4:
Verdadero 4:
fuente
Jalea , 19 bytes
Pruébalo en línea!
fuente
¤
y¬
son 2 bytes, no 1.0 0 1 0 > 1 byte Greater than.
¿No fallaría esto si la segunda entrada fuera negativa?Puertas lógicas NAND - 31 puertas
Como creador de la serie original de preguntas de la compuerta NAND , no podía dejar pasar la oportunidad de usar estas compuertas para resolver otro problema de compuerta lógica.
En cada uno de estos diagramas, la entrada superior es A mientras que la entrada inferior es B.
fuente
Etiqueta cíclica bit a bit, 118 bits = 14,75 bytes
Bitwise Cyclic Tag es quizás el lenguaje Turing-complete más simple jamás ideado. Hay una cinta de programa y una cinta de datos, ambas consistentes en una lista de bits. La cinta del programa se interpreta cíclicamente hasta que la cinta de datos esté vacía, de la siguiente manera:
0
: elimina el primer bit de la cinta de datos.1x
: si el primer bit de la cinta de datos es 1, agregue el bitx
a la cinta de datos.Inicializamos la cinta de datos con un 1 seguido de los dos bits de entrada (el 1 es necesario porque no hay forma de crear un 1 si la cinta de datos consta completamente de 0), y usamos el bit de datos eliminado final como salida de la puerta .
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
fuente
1
enfalse
requiere?0
a la cinta para que pueda eliminarse en último lugar.Python 2, 137 bytes
Toma entradas como
min(True,False)
(o comomin(1,0)
). Aprovecha enormemente las salidas que solo necesitan tener el valor correcto de Truthy-Falsey. Siempre que sea posible, utiliza un incorporado para evitar un costosolambda
. Usé código para buscar complementos que funcionen.Mi favorita es la
{0:1}.get
que pensé a mano. El diccionario{0:1}
asigna la clave0
al valor1
. Suget
método toma una clave y un valor predeterminado, generando el valor que coincide con la clave, o el valor predeterminado si no existe dicha clave. Entonces, la única forma de generar un a0
es como{0:1}.get(1,0)
, con clave faltante1
y predeterminada0
. Se pueden obtener otras variantes con diferentes diccionarios, pero solo esta fue la más corta.fuente
__lt__
o__eq__
? Estos disminuirán aún más cuenta de bytes:int.__gt__
en lugar delambda a,b:b<1
,int.__eq__
en lugar delambda a,b:a==b
y así sucesivamenteint
s descargan las comparaciones concmp
. No he probado esto para Python 3.not
para0001
,False
- ideonenot
no cumple con los requisitos de una función porque no puedes hacerlof=not;f(3,4)
. La cadenanot
funciona porque los supuestos argumentos de la función se ven como una tupla, del mismo modo3+
que funcionaría3+(4)
aunque3+
no sea una función que pueda tomarse4
como entrada.Go (juego), 33 piedras, 73 intersecciones
Si el dominó y el ajedrez son aceptables, entonces esto. No puede ser demasiado golfista en una tabla Go completa de 19x19. Entonces utilicé pequeñas tablas rectangulares. La entrada es si las piedras marcadas 1 y 2 están presentes. La salida es si el negro gana. Utiliza puntuación de área, 0.5 komi, superko situacional, sin suicidio. Todo negro para jugar. Algunos reciben múltiples soluciones.
Las blancas ganan (2, 1x5):
1 y 2 (3, 2x3):
1 y no 2 (2, 1x5):
1 (2, 1x5):
No 1 y 2 (2, 1x5):
2 (2, 1x5):
1 xo 2 (2, 2x3):
1 o 2 (2, 1x5):
1 ni 2 (2, 1x4):
1 = 2 (2, 1x7):
No 2 (2, 1x3):
1 o no 2 (2, 1x4):
No 1 (2, 1x3)
No 1 o 2 (2, 1x4):
1 y 2 (2, 1x3):
El negro gana (2, 1x3):
Esta página me ayudó un poco: http://www.mathpuzzle.com/go.html
Tal vez alguien podría encontrar una solución de 2 piedras para 1 y 2 en un tablero 1x9 ...
fuente
Javascript ES6, 124 bytes
En serio odio las lambdas en este momento.
fuente
a=>b=>0
aa=>0
y decir la gramática llamándolo es(a=>0)(a,b)
, sólo para esos 4 entradas.Math.min
en lugar dea=>b=>a&b
.Math.max
en lugar dea=>b=>a|b
.Math.pow
en lugar dea=>b=>a>=b
.parseInt
lugar de hacerloa=>b=>a>b
.!NaN
=>true
,!!NaN
=>false
Retina ,
6239 bytes23 bytes gracias a @MartinEnder !
Toma entrada como
PQ
.Emite un número entero entre
0
a3
.0
es falsey, otros son sinceros.Explicación
Todos son solo expresiones regulares .
Por ejemplo,
01|10
solo coincide01
o10
.En
0000
,2
nunca estará en la entrada, por lo que nunca coincide.En
1111
, coincide con la cadena vacía, que hay4
.fuente
^1|0$
solo debe coincidir con cadenas de 1 carácter. ¿Que está pasando aqui?1
al comienzo de la entrada] O [0
al final de la entrada]. También me tomó un minuto entenderlo ...^1|0$
es más difícil de leer que1.|.0
. Parece hacer que la lectura sea más difícilPila de gatos , 67 + 64 = 131 bytes
Tenga en cuenta que el +64 es de aplicar las
-nm
banderas a cada programa.-n
indica E / S numéricas y-m
refleja el código fuente en el último carácter; no todas las presentaciones necesitan estas marcas técnicamente, pero por coherencia y simplicidad, las califico de la misma manera.()
en Stack Cats verifica si un elemento es positivo o no positivo (es decir, 0 o negativo), por lo que lo estamos usando para verdad / falsedad respectivamente. La segunda columna es solo de interés y enumera las mejores puertas con0
/1
s como salidas (con un puntaje total de 90).La entrada es bits separados por delimitador a través de STDIN. Pruébalo en línea!
Stack Cats es un lenguaje esotérico reversible, donde los programas tienen simetría reflexiva. Dado un fragmento
f
(p>[[(!-)/
. Ej. ), La imagen especular (p\(-!)]]<
. Ej. ) Calcula el inversof^-1
. Como tal, los programas de longitud uniforme no hacen nada (o se atascan en un bucle infinito), y los únicos programas no triviales tienen una longitud impar, calculandof g f^-1
dóndeg
está el operador central.Dado que la mitad del código fuente siempre es redundante, se puede omitir, y ejecutar el código con el
-m
indicador indica que el código fuente debe reflejarse en el último carácter para recuperar el código fuente real. Por ejemplo, el programa*<X
es en realidad*<X>*
simétrico.Jugar al golf en Stack Cats es muy poco intuitivo, por lo que los programas anteriores tuvieron que ser encontrados por la fuerza bruta. La mayoría de ellos son sorprendentemente complejos, pero explicaré algunos y agregaré a esta respuesta cuando tenga tiempo. Por ahora, algunas explicaciones y soluciones alternativas para las versiones
0
/1
se pueden encontrar en el repositorio de Github aquí .fuente
Note that the +64 is from applying the -nm flags to each program.
3 * 16 = 48 o 2 * 16 = 32, de cualquier forma 64 es haiHaskell,
787675 bytes_#_=2<1
&&
>
pure
<
_#b=b
/=
||
(not.).max
==
_#b=not b
>=
a#_=not a
<=
(not.).min
_#_=1<2
Editar: -1 byte gracias a @cole.
fuente
_#_
no es un operador estándar!" Y luego me di cuenta ... Bien hecho.pure
pure
se introdujoPrelude
en 2015, por lo que estaba disponible en el momento de este desafío.Brachylog ,
3634 bytesEsto se espera
0
como valor falso y1
como valor verdadero. Devolucionestrue
ofalse
. p esInput
y q esOutput
.fuente
Input
yOutput
por convención, pero puede establecer valores en ambos o devolver valores de ambos.Prólogo,
147145 bytesGanó 2 bytes gracias a @SQB
Consulte
x(P,Q).
conx
ser la letra adecuadaP
yQ
establecer en 0 o 1.Devuelve
true
ofalse
.Ejemplo de SWISH que incluye pruebas : ingrese
runTest.
para ejecutar.fuente
a(2,2).
con falso?a(a,a).
(o cualquier otra letra) también funciona ya
no es una entrada aceptable para la verdad, así que eso es bueno. Gracias por la sugerencia.NTFJ, 86 bytes
Pruébalo aquí! Pero lea a continuación primero.
La entrada está implícita en la pila. El resultado se deja en la pila. Agregue 16 bytes (uno
*
al final de cada uno) si lo desea0x00
o0x01
una salida que represente 0 y 1. Agregue 160 bytes adicionales si desea un0
o un1
impreso. (Poner~~##~~~#{@
antes de cada uno*
)El único operador binario de NTFJ es NAND, por lo que cada uno de estos está escrito en forma NAND.
Veamos cada uno de ellos.
0: falso
~
representa un bit falso Suficientemente simple. Como la entrada está implícita en la parte inferior de la pila, esta se deja en la parte superior.1: p y q
NTFJ opera en una pila.
:
es el comando para duplicar. Observe quep and q
≡not (p nand q)
y esonot q = q nand q
.(Nota, entonces,
:|
se puede decir que es negación y|:|
se puede decir que es conjunción )2: p y no q
Observe que esto es solo una negación
:|
y una conjunción|:|
.3: p
$
saca un elemento de la pila. Así que sí.4: no p y q
Esto es lo mismo que 2, excepto con
#{
al principio.#
empuja 1 (el bit verdadero) y{
gira la pila hacia la izquierda una vez. Suficientemente simple.5: q
Girar a la izquierda una vez, soltar.
6: xor
Observar:
Sin embargo, no hay forma de duplicar la pila por completo. Por lo tanto, vamos a tener que llevar a cada uno de
p
,q
a la parte superior y duplicarlo.Y así, tenemos nuestro xor.
7: p o q
Negar la parte superior, llevar de abajo hacia arriba, negar eso y juntarlos. Básicamente,
p or q = (not p) nand (not q)
.8: no p y no q
Esto es simplemente la negación de 7. Fácil.
9: eq
Esto es solo xnor , o no xor. Simple de nuevo.
10: no q
Negación de 5.
11: p o no q
Negate p, nand.
(not p) nand q = not ((not p) and q) = p or (not q) (by De Morgan's laws)
.12: no p
Caer, detenerse y negar.
13: no p o q
¡Las leyes de De Morgan para salvar el día, otra vez! El mismo proceso que 11, solo negando en
q
lugar dep
.14: no p o no q
Esto es solo una imitación nand.
15: cierto
#
Es la parte verdadera.fuente
:|
?Minecraft, 89 bloques
En todas las siguientes fotos, los bloques azules son para la Entrada A y los bloques naranjas son para la Entrada B
16. VERDADERA puerta - 1 cuadras
15. Puerta NAND - 1x2x3 = 6 bloques
14. A => B - 1x2x3 = 6 bloques
13. NO A - 2 bloques
12. B => A - 1x2x3 = 6 bloques
11. NO B - 2 bloques
10. XNOR - 1x3x4 = 12 bloques
9. NOR - 1x2x3 = 6 bloques
8. O - 1 bloques
7. XOR - 1x3x4 = 12 bloques
6. B - 1 bloques
5.! A&B - 1x2x5 = 10 bloques
4. A - 1 bloques
3. A &! B - 1x2x5 = 10 bloques
2. Y - 2x2x3 = 12 bloques
1. FALSO- 1 bloques
fuente
Mathematica, 67 bytes
Cada uno de estos se evalúa como una función, por lo que puede usarlos como
Ah, si solo los enteros fueran verdadero / falso en Mathematica, esos cuatro más largos podrían haberse acortado considerablemente.
fuente
MATL,
3423 bytes¡Espero haber recibido el pedido bien! Zero es falsey, non-zero es verdadero. Cada función toma dos entradas implícitas (aunque puede ignorar algunas entradas). La primera entrada es A y la segunda es B. Puede ingresar
0
/1
para verdadero / falso oT
/F
.Aquí hay un ejemplo de TryItOnline para el caso de prueba 3.
¡Ahorré 4 bytes usando
*
forand
, y otros 4 usando>
/ en<
lugar de~wY&
/w~Y&
después de que vi la respuesta de Dennis!fuente
-
cc, 37 bytes
dc
("calculadora de escritorio") es un comando estándar de Unix, una calculadora postfix basada en pila. Carece de operaciones de bits, y los operadores de comparación solo se pueden usar para ejecutar macros (lo que no vale los bytes). La división entera compensa algo de eso.Estos scripts esperan
0
y1
valores en la pila, y dejan el resultado en la pila.fuente
Laberinto , 85 bytes
Gracias a Sp3000 por guardar 2 bytes.
Todos estos son programas completos, que leen dos enteros
0
o1
de STDIN (usando cualquier separador que no sea un dígito), e imprimen el resultado como0
o1
en STDOUT.Pruébalo en línea! (No es un conjunto de pruebas, por lo que deberá probar diferentes programas y entradas manualmente).
En cuanto a las explicaciones, todo esto es bastante sencillo. Todos los programas son lineales, y los comandos en uso hacen lo siguiente:
Tenga en cuenta que lo que estoy usando
#
siempre se usa para combinarlo$
, es decir, para calcularXOR 1
, o en otras palabras, para la negación lógica. Solo en unos pocos casos pude usar~
en su lugar, porque el siguiente&
descarta todos los bits no deseados del resultado-1
o-2
.fuente
Código de máquina IA-32, 63 bytes
Hexdump del código, con el desmontaje:
El código es más larga que podría ser, ya que utiliza una convención estándar de codificación: entrada en
ecx
yedx
, y la producción enal
. Esto puede expresarse en C comoParece que MS Visual Studio no entiende el
SALC
código de operación indocumentado , así que tuve que usar su código, en lugar de su nombre.¡Gracias l4m2 por mejorar algunas de las muestras de código!
fuente
1110 8D4411FE LEA EAX, [ECX+EDX-2]
C 34 bytes
Donde n es el número de función a usar, pero creo que sería rechazado, así que propongo este otro:
C 244 bytes (usando memoria)
Utiliza doble matriz indexada.
n[0][1]
es(A implies B)(0,1)
138 bytes
Acabo de enterarme de Forth. Supongo que es compatible con Ansi Forth, ya que también se ejecuta en gforth.
La función z crea una nueva función con el nombre proporcionado y luego coloca el número de puerta lógica desde la parte superior de la pila a la nueva dirección de la función. Deja la siguiente función de puerta lógica (n + 1) en la pila para la próxima declaración.
puedes probarlo:
Y AB
("." imprime la parte superior de la pila "cr" es el retorno del carro)
fuente
C, 268 bytes
Las macros parecen más cortas que las funciones.
fuente
Brian y Chuck , 183 bytes
Gracias a Sp3000 por guardar 4 bytes.
Algunos de los programas contienen un carácter no imprimible. En particular, cada uno
\x01
debe reemplazarse con el<SOH>
carácter de control (0x01):La entrada y la salida usan valores de byte , por lo que la entrada debe ser de 0x00 o 0x01 bytes (sin separador) y la salida será uno de esos bytes. En realidad, esta es también la definición más sensata de verdad / falsedad para B&C porque el único comando de flujo de control
?
considera los ceros como falsedad y todo lo demás como verdad.Explicaciones
Primero una cartilla rápida de B&C:
,
comando (byte de entrada) y solo Chuck puede usar el.
comando (byte de salida).[]
bucle de Brainfuck no existe. En cambio, el único flujo de control que tiene es el?
que cambia el control a la otra instancia si el valor actual debajo del cabezal de la cinta no es cero.>
y<
, hay{
y}
que son esencialmente equivalentes a los fragmentos de Brainfuck[<]
y[>]
, es decir, mueven el cabezal de la cinta a la siguiente posición cero en esa dirección. La principal diferencia es que{
también se puede detener en el extremo izquierdo de la cinta, independientemente del valor que tenga._
s en el código fuente se reemplaza con bytes nulos (ya que estos son muy útiles en programas no triviales para capturar{
y}
).Tenga en cuenta que en todos los programas, la cinta de Chuck comienza con a
#
. Esto realmente podría ser cualquier cosa.?
funciona de tal manera que el cabezal de la cinta mueve una celda antes de comenzar la ejecución (de modo que la condición en sí no se ejecuta si es un comando válido). Entonces, nunca podemos usar la primera celda de Chuck para el código.Hay cinco clases de programas, que explicaré en detalle más adelante. Por ahora los estoy enumerando aquí en orden de complejidad creciente.
0000
,1111
: Funciones constantesEstos son muy simples. Cambiamos a Chuck incondicionalmente. Chuck mueve el cabezal de la cinta hacia la celda no utilizada hacia la derecha y lo imprime directamente o lo incrementa primero para imprimir
1
.0011
,0101
,1010
,1100
: Funciones dependiendo de una sola entradaDependiendo de si comenzamos con
,
o,,
estamos trabajando conA
oB
. Veamos el primer ejemplo0011
(es decirA
). Después de leer el valor, lo usamos?
como condicional en ese valor. SiA = 1
, entonces esto cambia a Chuck, que mueve el cabezal de la cinta hacia la derecha e imprime el1
byte literalmente incrustado . De lo contrario, el control permanece en Brian. Aquí, el 1 byte es un no-op. Luego incrementamos bien la entrada+
para asegurarnos de que no sea cero y luego cambiamos a Chuck con?
. Esta vez, se>
mueve a una celda no utilizada a la derecha que luego se imprime como0
.Para negar uno de los valores, simplemente lo decrementamos
-
. Esto se convierte1
en0
y0
en-1
, que no es cero y, por lo tanto, es verdad en lo que?
respecta.0001
,0010
,0100
,1000
: Funciones binarias con un resultado TruthyEsta es una extensión de la idea anterior para trabajar con dos entradas. Veamos el ejemplo de
1000
(NOR). Nosotros (potencialmente) leemos ambas entradas con,?
. Si alguno de esos es1
, los?
cambios a Chuck. Mueve la cabeza de la cinta hasta el final con}
(en la celda vacía después del código de Brian), mueve otra celda con>
(todavía cero) y la imprime con.
.Sin embargo, si ambas entradas son cero, entonces el control todavía está con Brian.
>
luego mueve la cabeza de la cinta al}
tal que este comando no se ejecuta cuando cambiamos a Chuck con?
. Ahora todo lo que hace Chuck es>.
que solo se mueve a la1
celda e imprime eso.Podemos obtener fácilmente las otras tres funciones negando una o ambas entradas según sea necesario.
0111
,1011
,1101
,1110
: Funciones binarias con tres resultados TruthyUna modificación menor de la idea anterior para negar el resultado (es decir, imprimir
0
cuando hayamos pasado por todo Brian y de1
otro modo). Veamos0111
(OR) como un ejemplo. Tenga en cuenta que el1
byte incrustado no funciona, por lo que esto todavía comienza con,?,?
. Si alguna de las entradas es,1
cambiamos a Chuck, que mueve la cabeza de la cinta al comienzo con{
.>.
mueve la cabeza de la cinta a ese1
byte e imprime.Si ambas entradas son cero, entonces permanecemos con Brian, mueve el cabezal de la cinta
{
para omitirlo y luego cambia a Chuck. Cuando ejecuta>.
esta vez, pasa a la celda vacía después del código de Brian e imprime el0
.Nuevamente, obtenemos fácilmente las otras funciones al negar una o ambas entradas.
0110
,1001
: Funciones binarias con dos resultados verdaderosEste es un poco más complicado. Las funciones anteriores eran razonablemente simples porque pueden estar en cortocircuito : el valor de la primera entrada puede decidir la salida, y si no es así, miramos la otra entrada. Para estas dos funciones, siempre necesitamos mirar ambas entradas.
La idea básica es usar la primera entrada para decidir si la segunda entrada elige entre
0
y1
o entre1
y0
. Tomemos0110
(XOR) como ejemplo:Considere
A = 0
. En este caso, queremos que salgaB
como está.,
leeA
,?
no hace nada.>
se mueve a la siguiente celda (distinta de cero) para que}
nos lleve al_
Chuck. Aquí, leemosB
con,
y utilizar?
de nuevo. SiB
fue0
así, todavía estamos en Brian.>
se salta el}
Chuck y?
cambia para que se>.
imprima0
en el código fuente de Brian. SiB
,1
por otro lado, Chuck ejecuta el}
que ya se mueve en el_
código de Brian,>.
entonces imprime el1
byte en su lugar.Si
A = 1
, entonces cambiamos a Chuck de inmediato, quién ejecutará}+{>?
. Lo que esto hace es moverse al_
código fuente de Brian, convertirlo en un1
también con+
, luego volver al inicio{
y omitir el de Brian?
moviendo una celda a la derecha>
antes de devolverle el control. Esta vez, después de que Brian leyóB
, siB = 0
, y Chuck usa>.
la celda al lado de Brian?
será en1
lugar de0
. Además, cuandoB = 1
, Chuck}
salta sobre lo que solía ser un hueco y se mueve hasta el final de la cinta, por lo que>.
imprime un cero. De esta manera estamos imprimiendonot B
.Para implementar la equivalencia, simplemente negamos
A
antes de usarla como condición. Tenga en cuenta que debido a esto también necesitamos agregar otro>
a Chuck para omitir eso-
también al regresar al inicio.fuente
ClojureScript,
88 84 7674 bytesnil
yfalse
son falsas, todos los demás valores son verdaderos. Los booleanos obligan a 0/1 para la aritmética y las desigualdades. Las funciones pueden tomar el número incorrecto de argumentos.fuente
0
falso?not not(0)
aFalse
, que es el valor de falsey.#f
,f
,false
, etc.) es falso. Todos los demás valores son verdaderos en la mayoría de los lenguajes funcionales.Brainfuck ,
184178174 bytesLa entrada / salida usa U + 0000 y U + 0001.
fuente
0001
, ¿no podría simplemente hacerlo,[,>]<.
(dado un intérprete que le permite ir a la izquierda de la celda inicial)?Brain-Flak ,
418, 316 bytesPruébalo en línea!
Deje que las entradas sean los dos números superiores en la pila al comienzo del programa (cero para falso uno para verdadero) y la salida sea la parte superior de la pila al final del programa (cero para falso más para verdadero).
falso, 4 bytes (Cortesía de Leaky Nun )
(<>)
y 36 bytes
(({}{}[(())()])){{}{}(((<{}>)))}{}{}
A y no B, 40 bytes
((({}){}{}[(())()])){{}{}(((<{}>)))}{}{}
A, 6 bytes
({}<>)
no A y B, 38 bytes
((({}){}{}[(())])){{}{}(((<{}>)))}{}{}
B, 2 bytes
{}
xor, 34 bytes
(({}{}[(())])){{}{}(((<{}>)))}{}{}
o 6 bytes
({}{})
ni 34 bytes
(({}{}<(())>)){{}{}(((<{}>)))}{}{}
xnor, 10 bytes
({}{}[()])
no B, 34 bytes
{}(({}<(())>)){{}{}(((<{}>)))}{}{}
B implica A, 14 bytes
(({}){}{}[()])
no A, 34 bytes
(({}<{}(())>)){{}{}(((<{}>)))}{}{}
A implica B, 16 bytes
(({}){}{}[()()])
nand, 12 bytes
({}{}[()()])
verdadero, 6 bytes
<>(())
Explicación
Como la mayoría de estos son muy similares, no voy a explicar exactamente cómo funciona cada uno de ellos. Sin embargo, hago todo lo posible para aclarar cómo funcionan los dieciséis.
En primer lugar, están las puertas que devuelven tres del mismo valor (es decir, 2, 3, 5, 8, 9, 12, 14 y 15). Todos estos siguen el mismo patrón. Primero, convierte la entrada en un número de dos bits con a como los dos y B como los. Esto se hace con este fragmento
(({}){}{})
. Luego resta el valor de la entrada de dos bits que desea aislar({}[value])
. (En el código real, la resta y la conversión se realizan en un solo paso para guardar bytes). Esto se puede combinar con un no, si es necesario:(({}<(())>)){{}{}(((<{}>)))}{}{}
.Siguiente: y, ni, o, xor y xnor. Estos funcionan de manera similar a los anteriores. De hecho, algunos de estos se incluyen anteriormente, sin embargo, este método es más corto. El truco que utilicé aquí es que cada uno corresponde a una suma de A B. por ejemplo, xor se evalúa como verdadero si A + B = 1 y falso de lo contrario. Primero agrega AB y resta la cantidad relevante. Expresado como
({}{}[0,1,2 or 3])
. Entonces, si es necesario, realice una noA continuación: A, B, no A y no B. Estos se explican por sí mismos. Comenzamos eliminando el valor innecesario y luego lo negamos o terminamos.
Por último, están los dos simplones: verdadero y falso. Para estos, empujamos el valor correcto al off stack. El
<>
nilad devuelve cero para que podamos guardar dos bytes usando el interruptor como el valor cero.No es la solución más eficiente que existe (quizás la más eficiente en Brain-Flak), pero me divertí mucho escribiendo esto y te imploro que intentes acortarlo.
fuente
(<>)
es suficiente parafalse
; también,(<{}{}>)
es de 8 bytes(<>)
dejará las entradas y pondrá el cero en la otra pila.<>
suficientefalse
debido a ceros implícitos? Además, creo quea
puede ser el programa vacío.true
puede ser<>[][]
(no guarda bytes, pero se ve genial: P).ProgFk ,
18.517.5 bytesComo las instrucciones de ProgFk se especifican en nibbles, el siguiente código se proporciona en hexadecimal, una puerta lógica por línea y con espacios entre los bytes.
Explicación
ProgFk es un esolang basado en cinta (similar a Brainfuck) donde cada celda es un bit y las instrucciones se dan como mordiscos (4 bytes). Las instrucciones operan en la celda señalada por el puntero de instrucciones. La entrada se proporciona en la primera y segunda celdas (siendo
A
yB
siendo la primera y la segunda celdas respectivamente), y el puntero de instrucción comienza en la primera celda. La salida se almacena en la primera celda.Cada instrucción utilizada se explica a continuación.
¡Ahorré un byte gracias a @LeakyNun!
fuente
En realidad, 24 bytes
Estos programas toman la entrada como
A\nB
(con la\n
representación de una nueva línea), que deja a B en la parte superior de la pila, con A debajo.False
está representado por0
yTrue
está representado por cualquier número entero positivo.Gracias a Leaky Nun por 3 bytes
fuente