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.


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.


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.


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.


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


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.



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.


4
Este é o menor programa Unário que eu já vi.
— Draco18s
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.