Escreva um programa ou função que, quando recebida uma string, filtre o máximo de bytes distintos possível e retorne a string limpa. No entanto, como seu programa os odeia, nenhum desses bytes pode estar presente em seu próprio código.
Sua pontuação será o número de bytes distintos que o seu programa filtra da entrada, e quanto maior, melhor. Essa é uma pontuação máxima de 255 (já que seu programa deve ter no mínimo um byte). O desempatador é o comprimento do seu código, com menor sendo melhor.
Por exemplo, se o seu programa filtra os bytes 0123456789
, ele recebe uma pontuação de 10, mas o próprio programa não pode conter esses bytes.
Regras
- Bytes significam octetos.
- Você também tem a opção de receber a entrada como uma lista de números inteiros, com valores variando de 0 a 255. Eles correspondem aos bytes equivalentes.
- Sua saída deve estar na mesma forma que sua entrada
- Não é possível ler seu código fonte
- Seu código não deve estar vazio
- Sim, eu sei que haverá uma resposta de linguagem / unária. Mas pelo menos golfe, por favor?
;)
Editar regra:
- Você pode optar por ignorar um byte, por exemplo, se ele for indistinguível do byte final de uma string ou de EOF. No entanto, isso significa que você não pode usá-lo em sua inscrição, nem conta para sua pontuação. Se você optar por fazer isso, sua pontuação máxima será 254, mas você não precisará lidar com esse byte em sua entrada.
code-challenge
restricted-source
self-referential
Brincadeira
fonte
fonte
Respostas:
Japt
-P
, pontuação: 255 (2 bytes)f => filter, second f => everything but 'f'
Experimente online!
Japt , pontuação: 255 (2 bytes)
From @Shaggy
o => remove everything but, second o => 'o'
Experimente online!
fonte
oo
também funcionaria, sem a-P
bandeira.Python 2 , pontuação 249, 1732 bytes
Experimente online!
Remove tudo, menos as
exc%="
novas linhas. A geração do código é do xsot . Duvido que seja otimizado, então há muitos bytes para salvar aqui!fonte
Haskell, pontuação
249250,1088335 bytesDefine uma função
!:
que pega uma lista de números inteiros e filtra todos10,33,40,41,58,61
, exceto os códigos ASCII de\n ! ( ) : =
.Experimente online!
Como funciona: Primeiro vamos renomear as funções e parâmetros para nomes sãos:
A idéia principal é ter uma lista de duas funções diferentes (
listOfFunctions
), uma para manter um elemento (k
) e outra para eliminá-lo (d
). A lista é indexada pelo elemento atual da lista de entrada (x
) e a função que ela escolhe determina se deve ser mantido ou descartado o elemento. No índice 0, temosd
, porque queremos diminuir 0s, o primeirok
está no índice 10, porque queremos manter 10s (novas linhas). Ambosk
ed
recebem dois parâmetros:x
e o resultado de uma chamada recursiva com o restante da lista (xs
).k
prependsx
à chamada recursice ed
apenas retorna a chamada recursiva.A lista literal de funções termina no índice 61 (char
=
, o últimok
da lista) e é seguida por um número infinito ded
. Isso não apenas salva muitos explícitosd
, mas também nos impede de terminar uma lista finita com a[]
qual seriam necessários caracteres adicionais.Editar: obrigado a @ Ørjan Johansen pela pontuação +1 e -753 bytes.
fonte
|
para pontuação 250, 335 bytes . Também definiu um sinônimo pararepeat (!)
encurtar a lista (drasticamente, uma vez que|
era muito maior que o segundo maior caracter excluído.(!):
seqüências provavelmente também ajudaria.!():=
. Extrair[]
de uma lista existente, por exemplo, a lista de entrada, não funcionará porque tem tipo[Int]
, mas precisamos[a->[a]->[a]]
.!
écurry snd
, e=!
é uma lista infinita deles, mas é tudo que consigo entender disso.(=!)
, algo como(!=)(=:)=(!):(!):(!):(!):(!):(=:)
ou (mais alto nível, pode ser passado((!):)
ou uma seção em si)(!)!=(=:)=(!)((!)((!)((!)(=:))))
. Muitas opções para ajustar. Número de repetições, que tipo de segundo (ou mesmo terceiro) argumento, se houver, e até mesmo se é mais ideal usar a compactação\n
ou;
(comprimentos de bloco10 22 6 16 2
vs.33 6 16 1
).JavaScript (ES6), pontuação: 242 (142 bytes)
Uma abordagem bastante ingênua usando uma matriz de bytes para E / S.
Experimente online!
Quão?
Os 14 caracteres que não são filtrados são
'().=>[]efilrt
. Eles são marcados com ume
na cadeia de pesquisa. Para caracteres acimat
(código ASCII 116) que não estão definidos nesta cadeia,'f'>undefined
é falso .fonte
t=>t.filter(t=>'f'>'fffffffffffffffffffffffffffffffffffffffeeeffffeffffffffffffffeeffffffffffffffffffffffffffffefefffffffeeffeffefffffefe'[t])
. Aqui está uma declaração de teste do TIO:console.log(f([...Array(256).keys()]).map(c => String.fromCharCode(c)))
APL (Dyalog Unicode) , pontuação: 253, desempatador: 8 bytes SBCS
Função de prefixo tácito anônimo
Experimente online!
∩
interseção do argumento∘
e'∩∘'''
os três caracteres no código (∩∘'
)fonte
Shell POSIX , pontuação 249, 18 bytes
Experimente online!
tr
Comando simples que exclui todos os caracteres, exceto-\cdrt
espaço. São necessárias quatro barras invertidas porque o shell e otr
comando usam escapes de barra invertida. A quinta barra invertida escapa ao seguinte caractere de espaço.Se
tr -cd
fosse considerada uma linguagem de programação, seria possível escrever um programa de um byte com pontuação 255.fonte
tr
possui classes de caracteres usadas nas expressões regulares, mas nenhuma expressão regular completa.tr -cd \ cdrt\\-\
Experimente online!C (gcc) , pontuação
232235239241242,260407352249243249 bytesExperimente online!
Uma função que leva um ponteiro para o início e o fim de uma matriz int (em que end é o primeiro caractere não incluído), um ponteiro para um buffer e um ponteiro para outro ponteiro int. Ele grava o resultado no buffer e o ponteiro final do resultado no último ponteiro.
fonte
Regex, Pontuação: 255, 2 bytes
Corresponde ao personagem
\
.Experimente online!
fonte
Geléia , pontuação 254 (4 bytes)
Experimente online!
⁾xy
é uma abreviação de“xy”
(uma cadeia de dois caracteres).Nós
f
Ilter a cadeia de entrada para apenas os personagens que ocorre em“f⁾”
.fonte
f⁾⁾f
mas decidi fazer a pergunta sobre como usar seqüências de caracteres Unicode antes de postar.Ruby -p, pontuação 248 (8 bytes únicos / 483 bytes)
Experimente online!
fonte
Python 2 , Pontuação
244245246,133901575 bytesLeva uma lista de números inteiros
Experimente online!
Isso avalia a seguinte linha de código:
Esta resposta é obviamente teórica. A estrutura é
Em teoria, isso executaria o mesmo que:
Python 3 , pontuação
240241, 54 bytes1 graças a Jonathan Allan .
Experimente online!
fonte
\
na sua versão do Py 3 usando aspas triplasb''' ':[]abdfilmnor'''
. No Python 2, você poderia fazer um programa completo na mesma linha para 242:,print(''.join(p for p in input() if p in ''' '().fijnoprtu'''))
embora não tão bom quanto oexec
.Limpo , pontuação 247,
234213208 bytes-5 bytes graças a Ørjan Johansen
Experimente online!
Usa uma função recursiva de correspondência de padrão para remover caracteres. Nem precisa
StdEnv
.fonte
=\
vez de===
.t
ett
na segunda última linha.==
at
, mas mantendo==
como um sinônimo para ele.Perl 5
-p
, pontuação 251, 13 bytesExperimente online!
fonte
05AB1E , pontuação:
252253 (43 bytes distintos usados; 8 bytes no total)Experimente online.
Explicação:
Observe que a ordem das
ÃJ
e„J
nas cadeias de caracteres de 2 caracteres é importante, porque„
também é usada para palavras do dicionário , onde cada dois caracteres é uma palavra do dicionário (exceto alguns caracteres selecionados, como letras, dígitos-
e outros). Assim„JÃ
seria 'uma palavra'J
, assim como uma palavra do dicionárioÃ
+ o próximo caractere (neste caso„
), que aparentemente é a palavra"causing"
.fonte
Perl 5, pontuação 251 (5 bytes distintos, total de 8058 bytes)
Experimente online!
Usa o
<>^es
subconjunto completo de Turing do Perl . O código acima foi obtida através da execuçãoprint<>=~y<<>^es><>cdr
através de meu conversor .fonte
Brachylog , pontuação 249, 16 bytes
Experimente online!
Não tenho muita certeza de como isso funciona com as regras, e com o Brachylog com sua própria página de códigos especial e tudo, mas ainda posso explicar como funciona:
fonte
Oitava , Pontuação
248249(50 bytes)Não tinha que haver uma maneira melhor ... e há!
Experimente online!
Filtra tudo, menos
@al()'=
. Aall
função é superiorany
, porque usa apenas dois bytes distintos. Observe queany(...)
é igual anot(all(not(...)))
. Então, começamos com o programaEm vez de
~
(not
) também podemos escrever0==
. Claro, isso significaria que também precisamos filtrar0
. Em vez disso, observe que a seguinte expressão também é falsa (zero)Se a compatibilidade do MATLAB não for um problema, posso ir para 47 bytes
fonte
Linguagem (com
stty +brkint -ignbrk
), pontuação 255, 3890951 bytesO programa consiste em 3890951 bytes NUL (tornando-o um dos programas Lenguage mais curtos de todos os tempos; 3890951 bytes é facilmente pequeno o suficiente para caber no meu disco, então, na verdade, eu o executei em um intérprete Lenguage). O OP queria que a solução Lenguage / Unary fosse jogada, então aqui vamos nós. (Observe que o Unary seria muito mais longo porque requer o uso de, em
0
vez de permitir, o uso de NUL.)Observe que o Lenguage, apesar do que implica sua documentação, age como o cérebro do mal; A E / S funciona de maneira totalmente diferente (algo que notei ao testar este programa). Em particular, o Lenguage se recusa a receber entrada de qualquer coisa que não seja um terminal; portanto, os bytes que estão sendo filtrados são os bytes brutos enviados pela conexão do terminal (observe também que, ao filtrar os bytes brutos, você não verá o teclas que você digita). Na prática, isso significa que o programa absorverá qualquer tipo de entrada enviada a ele, exceto o byte NUL (normalmente digitado como Ctrl- @), que será repetido literalmente (nesse ponto, a grande maioria dos terminais o ignorará, como o byte NUL é o equivalente do terminal de uma instrução NOP). Para verificar se o programa funciona, é '
O que acontece no EOF? Bem, se o terminal está enviando uma série de bytes, não há como enviar EOF; todos os 256 bytes possíveis são interpretados literalmente e não há mais nada que você possa inserir no fluxo do terminal. No entanto, se você estiver usando um terminal serial antiquado, poderá pressionar o botão "break" no seu terminal para enviar propositalmente dados incorretos, permitindo um 257º código possível; esse "intervalo" é o único equivalente plausível de um EOF, pois é enviado fora de banda e indica algo diferente de dados válidos. Se a configuração do seu terminal tiver o sinalizador "interrupção na interrupção" definido (e o intérprete do Lenguage não alterar, tanto quanto eu sei, essa configuração), o envio do sinal de interrupção causará uma falha no interpretador do Lenguage, que atua convenientemente como uma maneira de implementar o comportamento EOF desejado. Não tenho certeza se essa é uma configuração padrão (porque atualmente ninguém usa terminais seriais, basicamente nunca aparece), então mencionei isso no cabeçalho como parte da especificação do interpretador de idioma que está sendo usado.
Explicação
O loop interno sairá somente quando NUL for digitado no terminal; depois disso, ecoamos imediatamente o caractere digitado (ou seja, o NUL). A adição de 1 nesse ponto garantirá que o elemento de fita 0 não seja zero novamente, para que o loop externo não possa sair (até que uma entrada de interrupção trate o intérprete) e voltaremos ao loop interno.
É mais golfista usar a subtração para entrar no loop externo, mas a adição continua a girar em torno dele; A adição possui uma codificação mais curta, mas não pode aparecer no início do programa (pois a codificação pareceria zeros à esquerda e, portanto, seria ignorada).
fonte
truncate
não está criando arquivos esparsos para mim (talvez o sistema de arquivos não os suporte?). No entanto, até onde eu sei, o intérprete Lenguage de referência lê o arquivo de entrada uma linha de cada vez (!); Portanto, se o programa não contiver caracteres de nova linha, um programa suficientemente longo acabará esgotando a memória disponível. Obviamente, isso pode ser corrigido com um novo intérprete.C # (compilador interativo do Visual C #) , pontuação 245, 111 bytes
Experimente online!
C # (compilador interativo do Visual C #) , pontuação 243, 33 bytes
Solução ingênua usando
Intersect
Experimente online!
fonte
Retina 0.8.2 , 12 bytes, pontuação: 250
Experimente online! Filtra todos os personagens, exceto para nova linha,
[
,\
,]
,^
en
. Embora os caracteres[\]^
sejam consecutivos, o uso de um intervalo custaria um byte e também reduziria minha pontuação.fonte
Japt , 249 pontos, 20 bytes
Experimente online!
fonte
oQ+"+oQ"Q
ou simplesmente,oo
mas isso é apenas uma variação da solução de Luis.PHP, pontuação 234,
5862 bytesExecute como pipe
-nF
ou experimente online .fonte
Ruby
-paF[^$_=F*']
, pontuação 250, 8 bytesNão sei se isso é legal sob as regras atuais do site para sinalizadores de linha de comando, pois o "sinalizador" aqui é uma espécie de passagem de código que inclui bytes proibidos. O
F
sinalizador define um regex separador de entrada que consiste em todos os caracteres que não estão no código apropriado. O código apropriado define a saída para a concatenação de todos os registros de entrada.fonte
MATL , pontuação 252
Experimente online!
Explicação (para entrada
input
)fonte
Pitão , pontuação 249, 16 bytes
Filtra todos os personagens, exceto
f
,s
,T
,z
,"
,/
, e\
Experimente online!
fonte
K, pontuação 246, 23 bytes
{x@&~x in"\"~ in@&{x}"}
{..} é uma lambda com arg x
lido como 'retorna x em que não x na string'
A cadeia contém \ "~ em @ e {x} (os dez bytes usados no programa)
fonte
sfk , pontuação 239, 133 bytes
Experimente online!
Executa substituições na entrada (gravadas como
[delim][from][delim][to][delim]
), alterando todos os caracteres usados no programa para si mesmos, o que remove as posições dos caracteres da consideração da entrada para a substituição final,x[byte]xx
que mapeia todos os bytes para a sequência vazia.fonte
JavaScript, score 250,
9557359273 bytesUma solução JS levemente concentrada que é executada no algoritmo do JSFuck . Muitos bytes, mas uma boa pontuação.
Original:
A renderização do JSFuck tem 59273 caracteres:
fonte
s=>s.replace(/[^![\]+()]/g,'')
deve funcionarbrainfuck , partitura: 248, 162 bytes
Experimente online!
Normalmente, eu não respondo minhas próprias perguntas, mas as pessoas parecem ter lido minha página de perfil, especialmente onde diz
If someone comments on a question "I wish there was a brainfuck solution", I feel obliged to provide one.
Os bytes filtrados são
-<>[],.
e ignoram o byte NUL, pois é indistinguível do EOF. Isso está um pouco mais longo do que o normal, pois estou evitando deliberadamente o uso+
para obter uma pontuação um pouco melhor. Mesmo assim, posso jogar a parte da geração de números para economizar alguns bytes.fonte
Espaço em branco , pontuação: 253 (3 bytes distintos usados, 97 bytes no total)
Letras
S
(espaço),T
(tabulação) eN
(nova linha) adicionadas apenas como destaque.[..._some_action]
adicionado apenas como explicação.Experimente online (apenas com espaços brutos, guias e novas linhas). Um bônus interessante é que eu posso usar esse código para transformar o código destacado acima no programa Whitespace bruto (que fiz neste TIO como exemplo), para o qual geralmente uso o Notepad ++. :)
Explicação:
Bem direto. Aqui o pseudo-código:
fonte