O que nós esquecemos?

31

Sua tarefa é escrever um programa de computador não vazio composto por alguma sequência de bytes. Se escolhermos um byte específico no programa e removermos todas as instâncias do programa, o programa modificado deverá gerar o byte removido.

Por exemplo, se nosso programa fosse

aabacba

Então bcbiria produzir a, aaacaprecisaria produzir be aababaproduziria c.

Não importa o que o programa não modificado faz.

As respostas serão pontuadas em bytes, com o objetivo de minimizar o número de bytes.

Assistente de Trigo
fonte
4
Como esse desafio não está marcado como quine, podemos ler nosso próprio código-fonte?
Dennis
1
@Dennis Sure. Seja meu convidado
Assistente de Trigo
2
Se todos os bytes em nosso programa representam dígitos, podemos enviar via código de saída?
Mr. Xcoder
15
Eu acho que isso seria melhor como um desafio de código em que você precisa maximizar o número de caracteres discretos usados.
Notts90
2
Deveria ter especificado mais de 1 byte em vez de não vazio : P. Ou o que Notts90 disse.
Magic Octopus Urn

Respostas:

70

zsh, 603 594 566 561 548 440 415 399 378 370 bytes

ec
ho \\n;ca t<<<$'\x20';exi t
d$c -e8BC6P
d0c -eKp
$'\172\163\150' $'\055\143' $'\146\157\162 v \151\156 \173\043\056\056\134\175\175\073\173 \146\147\162\145\160 \055\161 $\166 '$0$'\174\174\074\074\074$\166\073\175'
$'\145v\141\154' $':\073\072\046\046\145\170\151\164';#%&()*+,/9=>?@ADEFGHIJLMNOQRSTUVWXYZ[]^_`jklmsuwy
0# $#;for b in {$..z};{ fgrep -q $b $0||<<<$b;}

Depende do coreutils + dc.

Experimente online!

Isso foi ... uma jornada.

Esta resposta tem três partes. As 4 primeiras linhas lidam com certos casos especiais para simplificar o código a seguir. As próximas 2 linhas e a última linha realizam essencialmente a mesma coisa, mas exatamente uma é executada com qualquer remoção de caractere. Eles são escritos com conjuntos de caracteres principalmente complementares, para que a remoção de qualquer caractere quebre apenas um, permitindo que o outro continue funcionando.

Olhando para a primeira parte, primeiro lidamos com

  • remoção de nova linha com ec\nho \\n
  • remoção de espaço com ca t<<<$'\x20'(seguido de exi tpara evitar a execução de código posterior, o que resultaria em saída estranha)
  • $remoção com d$c -e8BC6P( 8BC6= 9226is 36*256 + 10e 36 e 10 são os valores de bytes dos $caracteres newline e respectivamente; usamos dígitos hexadecimais em decimal para evitar a necessidade de incluí-los no grande comentário da linha 6)
  • 0remoção com d0c -eKp( Kobtém a precisão decimal, que é 0por padrão)

Na próxima parte, os únicos caracteres usados ​​(além do lixo no final da segunda linha) são $'\01234567v;espaço e nova linha. Destas, quatro foram contabilizadas, portanto o restante ( '\1234567v) não pode ocorrer na última linha. Expandindo as fugas octais ( $'\123'representa o caractere ASCII com o valor 123 8 ), obtemos:

zsh -c 'for v in {#..\}};{ fgrep -q $v '$0'||<<<$v;}'
eval ':;:&&exit'

A primeira linha percorre todos os caracteres usados ​​no programa e procura cada um em seu próprio código-fonte ( $0é o nome do arquivo do script que está sendo executado), imprimindo qualquer caractere que não seja encontrado.

A segunda linha parece um pouco estranha e parece fazer a mesma coisa que exitcom um monte de nops. No entanto, a codificação exitcomo octal resulta diretamente em $'\145\170\151\164', que não contém 2ou 3. Na verdade, precisamos tornar isso menos resistente a remoções. Isso ocorre porque, se algum '\014567vdeles for removido, quebrando a primeira linha, a segunda linha também será interrompida, permitindo a execução do restante do código. No entanto, precisamos também quebrar se 2ou 3forem removidos para que as linhas 3 e 4 possam ser executadas. Isso é conseguido pela calçadeira em :e ;, que tem 2 e 3 em sua representação octal, respectivamente.

O lixo eletrônico no final da linha 2 está simplesmente lá para garantir que todos os caracteres ASCII imprimíveis apareçam pelo menos uma vez, pois a maneira como a verificação é feita percorrendo cada um deles exige isso.

Se exitnão foi chamado na primeira seção (isto é, foi mutilado pela remoção de uma '\01234567v), passamos para a segunda, na qual devemos realizar a mesma coisa sem usar nenhum desses caracteres. A última linha é semelhante à primeira linha decodificada, exceto que podemos contratar o intervalo do loop para salvar alguns bytes, porque já sabemos que todos os caracteres, exceto os '\01234567v, foram cobertos. Ele também tem 0# $#antes, o que comenta e impede que produza uma saída estranha se 0ou $foi removido.

Maçaneta da porta
fonte
5
Uau, muito impressionante, considerando a quantidade de personagens distintos envolvidos! Definitivamente ansioso para ver essa explicação.
Kevin Cruijssen
3
@KevinCruijssen here you go :)
Maçaneta da
1
@ Doorknob, se isso não ganhar 548 internets, não sei o que ganha. Honestamente, a versão de 603 bytes é igualmente impressionante!
Magic Octopus Urn
3
A única resposta interessante até agora.
Htmlcoderexe
21

Retina , 1 byte

1

Experimente online!

Quando todas as instâncias do byte único ( 1) são removidas, a saída é 1. Simples o suficiente.

Conor O'Brien
fonte
6
Eu estava navegando no TIO para encontrar algo assim - você me venceu. Btw este é um poliglota, trabalha com Caracóis
Jayce
Na IMO, essa resposta deve ser atualizada para uma resposta poliglota como a primeira (possivelmente com uma lista de idiomas eternamente incompleta), e as outras duas votaram negativamente no esquecimento. Oh, e isso também funciona em C .
@ Roger Não sei ao certo o que você quer dizer com "isso funciona em C." você tem um compilador C que gera 1para o programa vazio? Independentemente disso, acho que as respostas em questão utilizam diferentes abordagens e comportamentos. Na OMI, uma resposta poliglota só é garantida se a abordagem permanecer a mesma. (Objetivamente, isso não é poliglota, pois o código real é diferente, para as respostas abaixo.) Sinta-se à vontade para votar como quiser, mas uma resposta válida é uma resposta válida. Vou manter minha resposta como ela é, não desejo incluir uma coleção de respostas nela.
Conor O'Brien
11

Idiomas, 216173027061157310 bytes

216173027061157310 = (144115617572598740 + 144115241762960340 + 144115194786755540) / 2. Há 216173027061157310 - 144115617572598740 $s, 216173027061157310 - 144115241762960340 #s e 216173027061157310 - 144115194786755540espaços.

Os 144115617572598740 se #espaços codificam o seguinte programa BF:

++++++[>++++++<-]>.

Experimente online!

Os 144115241762960340 se $espaços codificam o seguinte programa BF:

+++++++[>+++++<-]>.

Experimente online!

Os 144115194786755540 $s e #s codificar o seguinte programa BF:

++++++++[>++++<-]>.

Experimente online!

Edit: Saved 72057832274401770 bytes graças a @Nitrodon.

Neil
fonte
Por que não usar Ue byte 127? Experimente online! Ou mesmo apenas o nul byte e soh?
Jo Rei
@JoKing Eu não sabia que esse Uera o menor byte ASCII imprimível que poderia ser produzido. Eu não queria usar bytes não imprimíveis.
Neil
Mesmo sem tirar vantagem da quebra automática de células ou de caracteres não imprimíveis, você pode reduzir isso para 216173027061157310 bytes, incluindo o caractere de espaço como um terceiro byte distinto.
Nitrodon
7
Não posso deixar de votar por causa de "Editar: salvos 72057832274401770 bytes ..."
Mr Lister
10

Geléia , 1 byte

0

Completamente diferente da resposta da Retina. assobios

Experimente online!

Dennis
fonte
6
Poliglota com M e Alistar.
Sr. Xcoder
9

Poliglota * , 1 byte ( aguardando confirmação )

0

Experimente online! (usando triangularidade)

*: Isso funciona em uma variedade (bastante ampla) de idiomas (exceto para esolangs como 4,> <> e similares e algumas outras exceções). Idêntico à resposta Jelly no código fonte, mas o método de E / S é diferente - a saída é via código de saída. Quando alguém é removido 0do código-fonte, ele fica com um programa vazio, que geralmente não gera erros e gera o código de saída 0 na maioria dos idiomas.

Mr. Xcoder
fonte
3

sed , 1 byte



Experimente online!

Completamente diferente da resposta da retina ou da resposta da geléia.

tsh
fonte
Não vejo nenhum código. Isso não seria uma resposta de 0 byte? Como é que isso funciona?
mastro
15
@ Mas há uma nova linha ..... você terá dificuldade em ler programas escritos em espaço em branco se continuar pensando assim.
user202729
3

Unário (não competitivo), 96 bytes

00000000: 0000 0000 0000 0000 0000 0000 0000 0000  ................
00000010: 0000 0000 0000 0000 0000 0000 0000 0000  ................
00000020: 0000 0000 0000 0000 0000 0000 0000 0000  ................
00000030: 0000 0000 0000 0000 0000 0000 0000 0000  ................
00000040: 0000 0000 0000 0000 0000 0000 0000 0000  ................
00000050: 0000 0000 0101 0101 0101 0101 0101 0101  ................

Aqui está xxddespejo.

Uma definição mais ampla da linguagem Unary permite qualquer caractere em seu código-fonte. Mas não encontrei um compilador ou intérprete que funcionasse para isso. Então marquei esta resposta como não competitiva. Se você encontrar um que postou antes desta pergunta, eu irei linká-lo.

tsh
fonte
4
Este é o menor programa Unário que eu já vi.
Draco18s