Escriba un programa o función que, cuando se le da una cadena, filtra tantos bytes distintos como sea posible y devuelve la cadena limpia. Sin embargo, dado que su programa los odia, ninguno de estos bytes puede estar presente en su propio código.
Su puntaje será el número de bytes distintos que su programa filtra de la entrada, cuanto mayor sea, mejor. Este es un puntaje máximo de 255 (ya que su programa debe tener un mínimo de un byte). El desempate es la longitud de su código, con menor es mejor.
Por ejemplo, si su programa filtra los bytes 0123456789
, recibe una puntuación de 10, pero su programa en sí no puede contener estos bytes.
Reglas
- Bytes significan octetos.
- También tiene la opción de tomar la entrada como una lista de enteros, con valores que van de 0 a 255. Estos corresponden a los bytes equivalentes.
- Su salida debe estar en la misma forma que su entrada
- No leer su código fuente
- Tu código no debe estar vacío
- Sí, sé que habrá una respuesta Lenguage / Unary. Pero al menos golf por favor?
;)
Editar regla:
- Puede elegir ignorar un byte, por ejemplo, si no se puede distinguir del byte de terminación para una cadena o para EOF. Sin embargo, esto significa que no puede usarlo en su envío, ni cuenta para su puntaje. Si elige hacerlo, su puntaje máximo será 254, pero no tiene que manejar ese byte que está en su entrada.
Respuestas:
Japt
-P
, puntuación: 255 (2 bytes)f => filter, second f => everything but 'f'
Pruébalo en línea!
Japt , puntuación: 255 (2 bytes)
De @Shaggy
o => remove everything but, second o => 'o'
Pruébalo en línea!
fuente
oo
También funcionaría, sin la-P
bandera.Python 2 , puntaje 249, 1732 bytes
Pruébalo en línea!
Elimina todo menos
exc%="
y líneas nuevas. La generación del código es de xsot . Dudo que esté optimizado, ¡así que hay muchos bytes para guardar aquí!fuente
Haskell, puntaje
249250,1088335 bytesDefine una función
!:
que toma una lista de enteros y filtra todos excepto10,33,40,41,58,61
los códigos ASCII de\n ! ( ) : =
.Pruébalo en línea!
Cómo funciona: Primero cambiemos el nombre de las funciones y parámetros a nombres sanos:
La idea principal es tener una lista de dos funciones diferentes (
listOfFunctions
), una para mantener un elemento (k
) y otra para soltarlo (d
). El elemento actual indexa la lista a partir de la lista de entrada (x
) y la función que selecciona determina si se debe mantener o descartar el elemento. En el índice 0 tenemosd
, porque queremos dejar 0s, el primerok
está en el índice 10, porque queremos mantener 10s (nuevas líneas). Ambosk
yd
toman dos parámetros:x
y el resultado de una llamada recursiva con el resto de la lista (xs
).k
antecedex
a la llamada recursiva yd
solo devuelve la llamada recursiva.La lista literal de funciones termina en el índice 61 (char
=
, el últimok
en la lista) y es seguida por un número infinito ded
. Esto no solo guarda muchos datos explícitosd
, sino que también nos impide tener que finalizar una lista finita con la[]
que se requerirían caracteres adicionales.Editar: gracias a @ Ørjan Johansen por +1 puntaje y -753 bytes.
fuente
|
por puntuación de 250, 335 bytes . También definió un sinónimo pararepeat (!)
acortar la lista (drásticamente, ya que|
era mucho más grande que el segundo personaje excluido más grande.(!):
secuencias largas probablemente también ayudaría.!():=
. Extraer[]
de una lista existente, por ejemplo, la lista de entrada, no funcionará porque tiene tipo[Int]
, pero necesitamos[a->[a]->[a]]
.!
escurry snd
, y=!
es una lista infinita de estos, pero eso es todo lo que puedo entender de esto.(=!)
algo como(!=)(=:)=(!):(!):(!):(!):(!):(=:)
o (más alto nivel, se puede pasar((!):)
o una sección de sí mismo)(!)!=(=:)=(!)((!)((!)((!)(=:))))
. Muchas opciones para ajustar. Número de repeticiones, qué tipo de segundo (o incluso tercer) argumento, si lo hay, e incluso si es más óptimo para usar la compresión\n
o;
(longitudes de bloque10 22 6 16 2
vs.33 6 16 1
).JavaScript (ES6), puntuación: 242 (142 bytes)
Un enfoque bastante ingenuo que utiliza una matriz de bytes para E / S.
Pruébalo en línea!
¿Cómo?
Los 14 caracteres que no se filtran son
'().=>[]efilrt
. Están marcados con une
en la cadena de búsqueda. Para los caracteres anteriorest
(código ASCII 116) que no están definidos en esta cadena,'f'>undefined
es falso .fuente
t=>t.filter(t=>'f'>'fffffffffffffffffffffffffffffffffffffffeeeffffeffffffffffffffeeffffffffffffffffffffffffffffefefffffffeeffeffefffffefe'[t])
. Aquí hay una declaración de prueba TIO:console.log(f([...Array(256).keys()]).map(c => String.fromCharCode(c)))
APL (Dyalog Unicode) , puntaje: 253, desempate: 8 bytes SBCS
Función de prefijo tácito anónimo
Pruébalo en línea!
∩
intersección del argumento∘
y'∩∘'''
los tres caracteres en el código (∩∘'
)fuente
Shell POSIX , puntuación 249, 18 bytes
Pruébalo en línea!
tr
Comando simple que elimina todos los caracteres pero-\cdrt
y el espacio. Se necesitan cuatro barras invertidas porque tanto el shell como eltr
comando usan escapes de barra invertida. La quinta barra diagonal inversa escapa al siguiente carácter de espacio.Si
tr -cd
se considerara un lenguaje de programación, se podría escribir un solo programa de bytes con una puntuación de 255.fuente
tr
tiene clases de caracteres tal como se usan en expresiones regulares, pero no tienen expresiones regulares completas.tr -cd \ cdrt\\-\
Pruébelo en línea!C (gcc) , puntaje
232235239241242,260407352249243249 bytesPruébalo en línea!
Una función que lleva un puntero al principio y al final de una matriz int (donde end es el primer carácter no incluido), un puntero a un búfer y un puntero a otro puntero int. Escribe el resultado en el búfer y el puntero final del resultado en el último puntero.
fuente
Regex, Puntuación: 255, 2 bytes
Coincide con el personaje
\
.Pruébalo en línea!
fuente
Jelly , puntaje 254 (4 bytes)
Pruébalo en línea!
⁾xy
es la abreviatura de“xy”
(una cadena de dos caracteres).Nos
f
Ilter la cadena de entrada hasta sólo los caracteres que ocurren en“f⁾”
.fuente
f⁾⁾f
pero decidí hacer la pregunta sobre tomar cadenas Unicode antes de publicar.Ruby -p, puntaje 248 (8 bytes únicos / 483 bytes)
Pruébalo en línea!
fuente
Python 2 , Score
244245246,133901575 bytesToma una lista de enteros
Pruébalo en línea!
Esto evalúa la siguiente línea de código:
Esta respuesta es obviamente teórica. La estructura es
En teoría esto ejecutaría lo mismo que:
Python 3 , puntaje
240241, 54 bytes+1 gracias a Jonathan Allan .
Pruébalo en línea!
fuente
\
en su versión de Py 3 usando comillas triplesb''' ':[]abdfilmnor'''
. En Python 2 podría hacer un programa completo en la misma línea para 242:print(''.join(p for p in input() if p in ''' '().fijnoprtu'''))
aunque no tan bueno como elexec
.Limpiar , puntuación 247,
234213208 bytes-5 bytes gracias a Ørjan Johansen
Pruébalo en línea!
Utiliza una función recursiva de coincidencia de patrones para eliminar caracteres. Ni siquiera lo necesita
StdEnv
.fuente
=\
lugar de===
.t
ytt
en la segunda última línea.==
det
, pero manteniendo==
como sinónimo de ella.Perl 5
-p
, puntaje 251, 13 bytesPruébalo en línea!
fuente
05AB1E , puntuación:
252253 (43 distintos bytes utilizados; 8 bytes en total)Pruébalo en línea.
Explicación:
Tenga en cuenta que el orden de
ÃJ
y„J
en las cadenas de 2 caracteres son importantes, ya„
que también se utiliza para las palabras del diccionario , donde cada dos caracteres es una palabra del diccionario (a excepción de algunos caracteres seleccionados como letras, dígitos-
y demás). Entonces„JÃ
sería 'una palabra'J
, así como una palabra del diccionarioÃ
+ el siguiente carácter (en este caso„
), que aparentemente es la palabra"causing"
.fuente
Perl 5, puntaje 251 (5 bytes distintos, 8058 bytes en total)
Pruébalo en línea!
Utiliza el
<>^es
subconjunto completo de Turing de Perl . El código anterior se obtuvo mediante la ejecuciónprint<>=~y<<>^es><>cdr
a través de mi convertidor .fuente
Brachylog , puntaje 249, 16 bytes
Pruébalo en línea!
No estoy completamente seguro de cómo funciona esto con las reglas, qué con Brachylog tiene su propia página de códigos especial y todo, pero aún puedo explicar cómo funciona:
fuente
Octava , puntaje
248249 (50 bytes)No tenía que haber una manera mejor ... y no hay!
Pruébalo en línea!
Filtra todo menos eso
@al()'=
. Laall
función es superiorany
, porque solo usa dos bytes distintos. Tenga en cuenta queany(...)
es igual anot(all(not(...)))
. Entonces, comenzamos con el programaEn lugar de
~
(not
) también podemos escribir0==
. Por supuesto, eso significaría que también tenemos que filtrar0
. En cambio, tenga en cuenta que la siguiente expresión también es falsa (cero)Si la compatibilidad con MATLAB no es un problema, puedo ir a 47 bytes
fuente
Lenguage (con
stty +brkint -ignbrk
), puntuación 255, 3890951 bytesEl programa consta de 3890951 bytes NUL (lo que lo convierte en uno de los programas de Lenguage más cortos de la historia; 3890951 bytes es fácilmente lo suficientemente pequeño como para caber en mi disco, por lo que realmente ejecuté esto en un intérprete de Lenguage). El OP quería que la solución Lenguage / Unary se jugara, así que aquí vamos. (Tenga en cuenta que Unary sería mucho más largo porque requiere
0
el uso de NUL en lugar de permitirlo).Tenga en cuenta que Lenguage, a pesar de lo que implica su documentación, no actúa como Brainfuck; I / O funciona de manera completamente diferente (algo que noté al probar este programa). En particular, Lenguage se niega a recibir información de otra cosa que no sea un terminal, por lo que los bytes que se están filtrando son los bytes sin procesar enviados a través de la conexión del terminal (tenga en cuenta también que al filtrar los bytes sin procesar, no verá el teclas que escriba en absoluto). En la práctica, esto significa que el programa absorberá cualquier tipo de entrada que se le envíe, excepto el byte NUL (típicamente escrito como Ctrl- @), que se repetirá literalmente (en ese punto, la gran mayoría de los terminales lo ignorarán). ya que el byte NUL es el equivalente terminal de una instrucción NOP). Para verificar que el programa funciona, '
¿Qué pasa en EOF? Bueno, si el terminal está enviando una serie de bytes, no hay forma de enviar EOF; Los 256 bytes posibles se interpretan literalmente, y no hay nada más que pueda insertar en la secuencia del terminal. Sin embargo, si está utilizando un terminal en serie antiguo, puede presionar el botón de "interrupción" en su terminal para enviar intencionalmente datos mal codificados, permitiendo un código 257º posible; Este "descanso" es el único equivalente plausible de un EOF, ya que se envía fuera de banda e indica algo más que datos válidos. Si la configuración de su terminal tiene el indicador de "interrupción en pausa" establecido (y el intérprete de Lenguage no, por lo que puedo decir, altera esa configuración), el envío de la señal de interrupción hará que el intérprete de Lenguage se bloquee, que convenientemente actúa como una forma de implementar el comportamiento EOF deseado. No estoy seguro de si esta es una configuración predeterminada (porque en la actualidad nadie usa terminales seriales, básicamente nunca aparece), así que lo mencioné en el encabezado como parte de la especificación del intérprete de idiomas que se utiliza.
Explicación
El bucle interno solo saldrá cuando se escriba NUL en la terminal; después de esto, inmediatamente hacemos eco del carácter escrito (es decir, el NUL). Agregar 1 en este punto asegurará que el elemento de cinta 0 vuelva a ser distinto de cero, de modo que el bucle externo no pueda salir (hasta que una entrada de interrupción bloquee el intérprete), y volveremos al bucle interno.
Es más divertido usar la resta para ingresar al bucle externo, pero además de continuar haciendo un bucle alrededor; la adición tiene una codificación más corta, pero no puede aparecer al inicio del programa (ya que la codificación se vería como ceros a la izquierda y, por lo tanto, se ignorará).
fuente
truncate
no está creando archivos dispersos para mí (¿tal vez el sistema de archivos no los admite?). Sin embargo, por lo que puedo decir, el intérprete de Lenguage de referencia lee el archivo de entrada línea por línea (!), Por lo que si el programa no contiene caracteres de nueva línea, un programa suficientemente largo terminará agotando la memoria disponible. Por supuesto, esto podría solucionarse con un nuevo intérprete.C # (compilador interactivo de Visual C #) , puntaje 245, 111 bytes
Pruébalo en línea!
C # (compilador interactivo de Visual C #) , puntaje 243, 33 bytes
Solución ingenua usando
Intersect
Pruébalo en línea!
fuente
Retina 0.8.2 , 12 bytes, puntuación: 250
Pruébalo en línea! Filtra todos los personajes a excepción de nueva línea,
[
,\
,]
,^
yn
. Aunque los caracteres[\]^
son consecutivos, usar un rango realmente costaría un byte y también reduciría mi puntaje.fuente
Japt , puntaje 249, 20 bytes
Pruébalo en línea!
fuente
oQ+"+oQ"Q
o simplemente,oo
pero eso es solo una variación de la solución de Luis.PHP, puntaje 234,
5862 bytesEjecutar como tubería con
-nF
o probarlo en línea .fuente
Ruby
-paF[^$_=F*']
, puntaje 250, 8 bytesNo estoy seguro de que esto sea legal según las reglas actuales del sitio para las banderas de línea de comandos, ya que la "bandera" aquí es una especie de código que incluye bytes prohibidos. La
F
bandera define una expresión regular de separador de entrada que consiste en todos los caracteres que no están en el código propiamente dicho. El código propiamente dicho establece la salida en la concatenación de todos los registros de entrada.fuente
MATL , Score 252
Pruébalo en línea!
Explicación (para entrada
input
)fuente
Pyth , puntaje 249, 16 bytes
Filtra todos los personajes, excepto
f
,s
,T
,z
,"
,/
, y\
Pruébalo en línea!
fuente
K, puntaje 246, 23 bytes
{x@&~x in"\"~ in@&{x}"}
{..} es una lambda con arg x
leer como 'devuelve x en donde no x en la cadena'
La cadena contiene \ "~ en @ & {x} (los diez bytes utilizados en el programa)
fuente
sfk , puntaje 239, 133 bytes
Pruébalo en línea!
Realiza reemplazos en la entrada (escrita como
[delim][from][delim][to][delim]
) cambiando todos los caracteres utilizados en el programa a sí mismos, lo que elimina las posiciones de los caracteres de la consideración para la entrada al reemplazo finalx[byte]xx
que asigna todos los bytes a la cadena vacía.fuente
JavaScript, puntaje 250,
9557359273 bytesUna solución JS ligeramente desarrollada que luego se ejecuta a través del algoritmo de JSFuck . Muchos bytes, pero una buena puntuación.
Original:
La representación de JSFuck tiene 59273 caracteres:
fuente
s=>s.replace(/[^![\]+()]/g,'')
debería funcionarbrainfuck , Puntuación: 248, 162 bytes
Pruébalo en línea!
Por lo general, no respondo mis propias preguntas, pero la gente parece haber leído mi página de perfil, especialmente donde dice
If someone comments on a question "I wish there was a brainfuck solution", I feel obliged to provide one.
Los bytes filtrados son
-<>[],.
e ignoran el byte NUL, ya que no se puede distinguir de EOF. Esto es un poco más largo de lo habitual, ya que deliberadamente evito usarlo+
para obtener una puntuación ligeramente mejor. Aun así, podría ser capaz de jugar golf en la parte de generación de números para ahorrar unos pocos bytes.fuente
Espacio en blanco , puntuación: 253 (3 bytes distintos utilizados, 97 bytes en total)
Se agregaron letras
S
(espacio),T
(tabulación) yN
(nueva línea) solo como resaltado.[..._some_action]
agregado solo como explicación.Pruébelo en línea (solo con espacios en bruto, pestañas y nuevas líneas). Una buena ventaja es que puedo usar este código para transformar el código resaltado arriba en el programa de espacio en blanco sin procesar (que hice en este TIO como ejemplo), para el cual generalmente uso Notepad ++. :)
Explicación:
Muy claro. Aquí el pseudocódigo:
fuente