En matemáticas, un signo de exclamación a !
menudo significa factorial y viene después del argumento.
En la programación, un signo de exclamación a !
menudo significa negación y viene antes del argumento.
Para este desafío solo aplicaremos estas operaciones a cero y uno.
Factorial
0! = 1
1! = 1
Negation
!0 = 1
!1 = 0
Tome una cadena de cero o más !
, seguido de 0
o 1
, seguido de cero o más !
( /!*[01]!*/
).
Por ejemplo, la entrada puede ser !!!0!!!!
o !!!1
o !0!!
o 0!
o 1
.
Los !
's antes de 0
o 1
son negaciones y los !
' s después son factoriales.
El factorial tiene mayor prioridad que la negación, por lo que los factoriales siempre se aplican primero.
Por ejemplo, !!!0!!!!
realmente significa !!!(0!!!!)
, o mejor aún !(!(!((((0!)!)!)!)))
.
Salida de la aplicación resultante de todos los factoriales y negaciones. La salida siempre será 0
o 1
.
Casos de prueba
0 -> 0
1 -> 1
0! -> 1
1! -> 1
!0 -> 1
!1 -> 0
!0! -> 0
!1! -> 0
0!! -> 1
1!! -> 1
!!0 -> 0
!!1 -> 1
!0!! -> 0
!!!1 -> 0
!!!0!!!! -> 0
!!!1!!!! -> 0
El código más corto en bytes gana.
Respuestas:
Mathematica,
2517 bytesToma información de un aviso del usuario. Asume el entorno de cuaderno de Mathematica para la impresión implícita. Para convertirlo en un script de línea de comandos, envuélvalo
Print[...]
o para que sea una función sin argumentos (que luego toma la entrada del indicador), agregue&
.Mathematica tiene los dos operadores requeridos (con la precedencia requerida), por lo que podemos simplemente "evaluar" la entrada (que se realiza automáticamente por
Input[]
), pero el operador de negación lógica no funciona en enteros (por lo que permanecerá sin evaluar). Si!x
queda algo en el resultado, lo reemplazamos con1-x
.Un par de datos divertidos sobre la evaluación:
!!
, que computan*(n-2)*(n-4)*...
, pero se aplica0
o1
todavía da1
, por lo que no importa que0!!!!!
realmente se analice como((0!!)!!)!
.!0
y no se!1
evalúa, sí sabe que!
es autoinverso, por lo que cancelará automáticamente todos los pares de guía!
. Después de laToExpression
que estamos siempre quedamos con uno de0
,1
,!0
,!1
.fuente
x=${x/[01]!*/1};echo $(($x))
: no se permite publicar una respuesta adecuada :([Bash] + utilidades Unix,
2117 bytesEsto debe guardarse en un archivo y ejecutarse como un programa. Si intentas ingresar el comando directamente desde la línea de comando, ¡no funcionará porque! se expande debido a que la sustitución del historial se habilita en el modo interactivo de bash. (Alternativamente, puede desactivar la sustitución del historial con
set +H
).El caso de prueba funciona:
fuente
mkdir -p 's/.!!'{bunch,of,different,directories}\$/1
? Luego obtendrá Pathname Expansion y Sed intentará leer directorios como si fueran archivos, en lugar de leer la entrada estándar, ¡y no generará nada! :)Retina ,
201514 bytesGracias a Leo por guardar 1 byte.
Pruébalo en línea!
Explicación
Conviértete
0!
en1
. No nos interesan otros!
s finales , el número resultante es el mismo que si hubiéramos aplicado todos los factoriales.Cancelar pares de negaciones. Esto también puede cancelar algunos factoriales, pero eso es irrelevante.
Cuente el número de coincidencias de esta expresión regular, que es o
1
o0
y da el resultado deseado.fuente
\d.+
...^
antes!0
Suciedad ,
14 129 bytesPruébalo en línea!
Explicación
Esto hace coincidir la entrada con un patrón, imprimiendo
1
por coincidencia y0
sin coincidencia.La idea es esta. Si la entrada comienza con un dígito, entonces la parte recursiva
\!_
siempre falla y\0!
tiene éxito a menos que tengamos un solo0
. Su xor tiene éxito a menos que la entrada sea única0
. Si la entrada comienza con a!
,\0!
siempre tiene éxito, y\!_
tiene éxito si la coincidencia recursiva tiene éxito. Su xor tiene éxito exactamente cuando la coincidencia recursiva falla, lo que lo niega.fuente
Brainfuck,
8572 (84) bytespara volver numéricamente, o
para texto ASCII. > también puede tener el prefijo para evitar el ajuste de memoria.
Pruébalo en línea!
O para la respuesta de texto, reemplace la última línea con
fuente
Brainfuck - camino a muchos bytes (232 bytes)
Claramente, el idioma equivocado para ganar en código golf. Principalmente noté la falta de alguien usando este esolang. Hay un buen intérprete en línea bf interpeter o puedes ver lo que hace el programa usando este visualizador bf .
fuente
Python,
-44-42 bytes¡Ahorré 2 bytes gracias a Zgarb!
Paso a paso:
x[-1]!='0'
si
x
termina con1
o!
⇔x
no termina con0
, la parte factorial debe tener valor1
, de lo contrario0
^len(x.rstrip('!'))%2
explotar la propiedad de xor como un "condicional no". La condición en este caso es si la longitud de
!
s inicial es impar. Sin embargo,.rstrip
no elimina el número de la cadena, por lo que la longitud calculada se compensa en 1, por lo tanto, la condición se invierte!=
a==
en el paso 1. Zgarb sugirió usar un operador de comparación de diferencias en lugar de aplicar otra inversión, ahorrando 2 bytes.Pruébalo en línea!
fuente
!!0
; Actualmente está volviendo1
.lambda x:(x[-1]=='0')^len(x.rstrip('!'))%2
evita la inversión extra.JavaScript (ES6),
434129 bytesMétodo no regex (
4131 bytes)A continuación se muestra mi enfoque inicial. Es un poco más interesante, pero
significativamente más largoaún un poco más, incluso después de una optimización significativa por parte de Neil (10 bytes guardados) .Casos de prueba
Mostrar fragmento de código
fuente
f=([c,...s])=>1/c?c|s>'':1-f(s)
.Jalea , 5 bytes
Pruébalo en línea!
Función monádica esperando una cadena. Las entradas con
!
s iniciales hacen1
que se imprima a STDOUT en el camino, por lo que el enlace TIO que doy es un arnés de prueba que imprime los pares de entrada-salida debajo de la primera línea de salida.¿Cómo?
fuente
05AB1E , 9 bytes
Código:
Utiliza la codificación CP-1252 . Pruébalo en línea! o Verifique todos los casos de prueba!
Explicación:
fuente
Retina , 13 bytes
Un enfoque algo extraño, pero es corto y funciona.
Con las dos primeras líneas reemplazamos un final
0
con!1
: con este reemplazo ahora sabemos que la parte de nuestra cadena desde el dígito en adelante es igual a 1.En las siguientes dos líneas, elimine los pares de
!
: la doble negación se borra a sí misma, y ya tomamos en cuenta el factorial con el paso anterior.Última línea, haga coincidir un dígito al comienzo de la cadena y devuelva el número de coincidencias: si se han eliminado todas las negaciones, encontraremos una coincidencia (y, como dijimos antes, sabemos que es igual a 1), si todavía hay una negación que esto no coincidirá.
Pruébalo en línea!
fuente
1
lugar de\d
.0!
permanecerá sin cambios hasta la última líneaRuby, 12 + 1 =
39241513 bytesUsa la
-n
bandera. ¡Gracias a @GB por -9 bytes!fuente
0
o el final de la línea!*$
es más corto por dos!Perl , 20 bytes
19 bytes de código +
-p
bandera.Pruébalo en línea!
Declaraciones de negación de Perl
undef
o1
, lo que el uso0+
de numerify el resultado0+undef
rendimientos0
. Además de eso, no hay mucho que decir sobre el código.fuente
C,
68626153 bytesExprimí algunos bytes más con algunos abusos
Pruébalo en línea!
fuente
int
de la función y puede cambiar el*a==33
a*a<34
.*a%2
es más corto que*a-48
for(;*a<34;a++)
puede acortarse parafor(;*a++<34;)
ahorrar 1 bytePerl 6 ,
322823 bytesCómo funciona
fuente
Haskell , 39 bytes
Define una función
f
, que toma una cadena y devuelve un carácter. Pruébalo en línea!Explicación
Hay tres casos: la entrada comienza con
!
, la entrada tiene longitud 1 y todo lo demás.fuente
f('!':b)=[1,0]!!f b;f"0"=0;f _=1
.Befunge, 24 bytes
Pruébalo en línea!
Esto comienza contando el número de
!
caracteres leídos de stdin. El primer carácter que no!
sea un será un0
o1
, pero en el proceso de prueba!
habremos restado 33, haciéndolo 15 o 16. Luego leemos un carácter más, que será un!
o EOF, y compare si eso es menor que 0 (es decir, EOF).Tomando esos tres puntos de datos (el conteo de exclamación ( c ), el valor del dígito, ( d ) y la condición de fin de archivo ( e )) podemos calcular el resultado de la siguiente manera:
Multiplicar el valor del dígito por la condición de fin de archivo significa que se convertirá a cero si el dígito fue seguido por a
!
, lo que le da el mismo valor de módulo 2 que a1
(que recuerde se ha convertido a 16). Pero antes de aplicar el módulo 2, agregamos el recuento de exclamación inicial, que efectivamente alterna el resultado del módulo 2 tantas veces como sus!
prefijos. Y finalmente no somos el resultado ya que nuestros valores de referencia para0
y1
son lo opuesto a lo que necesitamos.Mirando el código con más detalle:
fuente
Haskell , 27 bytes
Pruébalo en línea!
Cada encabezado
!
complementa la salida para el resto de la expresión, hecha como1-
. Seguimos volteando hasta que alcanzamos un dígito. Si el resto es justo"0"
, el resultado es 0. De lo contrario, es un1
o es seguido por uno o más!
, por lo que el resultado es 1.fuente
Ruby,
22 2120 bytesExplicación:
(-1 byte robando la idea de @Value Ink)
fuente
Jalea , 8 bytes
Pruébalo en línea!
Esta es una función (enlace monádico) que toma un argumento y regresa a través de su valor de retorno. (También a menudo escribe basura en la salida estándar como un efecto secundario, pero eso no nos importa).
Explicación
Primero, tenga en cuenta que, como la entrada siempre consiste en un número de
!
, seguido de un dígito, seguido de más!
, que si eliminamos el final!
y tomamos la longitud, terminaremos con uno más el número de líderes!
en el programa. Tomar la paridad de esto devolverá 0 si hubo un número impar de!
, o 1 si hubo un número par de!
. Comparar con 0 es una función "no", mientras que comparar con 1 es la función de identidad; por tanto,œr”!LḂ=
pone en práctica con eficacia el "tratamiento conduce!
NO operadores como" parte de la pregunta.En cuanto a la segunda mitad, el manejo de factoriales
!
es una operación factorial en Jelly, por lo que si el programa no tiene liderazgo!
, podemos resolver el problema directamente con un simpleeval
(V
). Si el programa no tiene que conduce!
, aquellos se interpretarán como tomar el factorial de 0 (posiblemente varias veces), produciendo un valor de retorno de 1, que será impreso en la salida estándar y se desecha una vez que se ve un dígito; por lo tanto, no tienen impacto en el valor de retorno de la función que es mi presentación a la pregunta.fuente
Python, 38 bytes
TryItOnline!
Una función sin nombre que toma una cadena de entrada
s
y devuelve un entero0
o1
.s[1::2]
es un segmento de la cadena de entrada que comienza en el índice 1 y tiene un tamaño de paso de dos:'Like this' -> 'ieti'
s[::2]
es similar pero comienza en el índice predeterminado de 0:'Like this' -> 'Lk hs'
La prueba
(s[1::2]>s[::2])
verifica si el índice basado en 0 de'0'
o'1'
es impar, es decir, si necesitamos complementar.Esto funciona porque el orden de las cadenas se verifica lexicográficamente con cualquier cadena no vacía mayor que la cadena vacía, y con el orden ASCII, por lo tanto
'1'>'0'>'!'
. Este es un byte más corto que el más simples.index(max(s))%2
.Las
ord(s[-1])%2
comprobaciones para ver si el último carácter no es un'0'
(para entrada válida), y los resultados en un número entero (mientras que la misma longitud(s[-1]!='0')
devolvería un booleano).Esto funciona porque el último carácter de la entrada,
s[-1]
será a'0'
,'1'
o'!'
que tenga los puntos de código ASCII 48, 49 y 33 respectivamente, que son 0, 1 y 1 módulo 2.El
^
realiza entonces una bitwise operación O exclusiva sobre los dos valores anteriores, devolver un número entero desde una entrada, la correcta, es un número entero. Si la izquierda es True, se devuelve el complemento de la derecha, si la izquierda es False, se devuelve la derecha, según sea necesario.fuente
Java 7,
1058281 bytesPruébalo en línea!
Antigua solución regex-ish
fuente
c^=1
Es super inteligente. Es un operador no utilizado si alguna vez he visto uno.CJam ,
1211 bytesPruébalo en línea! Conjunto de pruebas (imprime un
1
para cada caso de prueba correcto).fuente
Haskell ,
6765 bytesPruébalo en línea! Uso:
f "!!!0!!!!"
Guardado dos bytes gracias a @nimi.
fuente
Brainfuck, 115 bytes
Pruébalo en línea!
Sin golf:
fuente
Lote, 62 bytes
Toma entrada en STDIN. En realidad, Batch entiende
!
correctamente los mensajes iniciales para este desafío, pero!
es necesario tratar los mensajes finales , que requieren tres pasos:0!
a1
!!
(esto también es seguro para la!!
s antes del dígito)!
(que ahora solo puede ser después de a1
)fuente
sed,
363331 bytesSed puro, sin bc / shell utilidades. Funciona en GNU sed <4.3; 33 bytes en BSD y GNU 4.3+.
Lo suficientemente directo si está familiarizado con
sed
; comentado para aquellos que no son:Prueba:
fuente
sed
permiten usar la cadena nula como nombre de etiqueta. Si puede hacer que eso funcione aquí, le ahorraría dos bytes. En realidad, no estoy seguro de que la etiqueta sea necesaria; a menos que me haya perdido algo, la primera línea es idempotente, por lo que es posible que pueda volver al inicio del programa en lugar de necesitar una etiqueta.:
(más de un error tomado como característica), en cuyo caso tanto elt
yb
! los comandos saltan a la posición de la etiqueta. Además, un código sed debe funcionar para al menos una versión de sed, similar a otros lenguajes, por lo que no necesita crear código que funcione también para BSD.PHP 7.1,
5855543735 bytesNota: utiliza la codificación IBM-850
Corre así:
Explicación
Ajustes
-R
(que está$argn
disponible)fuente
Fórmula IBM / Lotus Notes - 77 bytes
No hay TIO para Notes Formula, por lo que a continuación se muestra una captura de pantalla de todos los casos de prueba:
Cómo funciona
@Eval()
evalúa una cadena como una expresiónPrimero verificamos si la cadena de entrada en el campo (entrada)
a
contiene1
o0
y tomamos todos los caracteres a la izquierda de lo que sea, que será una cadena de!
caracteres. No nos importa cuántos.@Eval()
se encargará de eso.Luego miramos para ver si hay un
!
al final de la cadena. Si existe, agregamos1
a la!
cadena (0!
y1!
ambos son 1, no importa cuántos!
caracteres haya al final), de lo contrario, agregamos el último carácter sin cambios porque no es a!
y podría ser a1
o a0
.Ahora tenemos una cadena que contiene las inversiones iniciales más un número definido por si hay caracteres factoriales para poder alimentar esto
@Eval()
y obtener los resultados anteriores.fuente
Bean , 24 bytes
Hexdump:
JavaScript equivalente:
Perdón por pisar los pies, Arnauld .
Explicación:
Toma primera línea de entrada como una cadena sin formato en
a
, y sustituye cualquier dígito seguido por uno o más!
con1
, por lo que el resto se puedeeval
'D mediante JavaScript.Prueba la demo o el conjunto de pruebas
fuente