Seu desafio é simples: escreva o máximo possível de um programa intocado no idioma de sua escolha usando apenas bytes únicos. (A definição completa de um programa primitivo, copiada desse link, está no final desta pergunta.)
É isso mesmo, sem amarras. Seu código não precisa fazer nada, basta executar sem erros, atender aos requisitos de um programa novo (vinculado acima) e não incluir bytes duplicados na codificação usada.
Para os fins da explicação acima e da definição vinculada de "programa intocado", um erro é definido como qualquer coisa que faça com que o programa falhe completamente na execução ou termine com um código de saída diferente de zero após um período finito de tempo.
Como esse é o código de boliche , o código mais longo e não mais curto é o código (medido pela contagem de bytes). A pontuação máxima teoricamente possível é de 256, pois são possíveis 256 bytes distintos. Em caso de empate, a primeira resposta com a maior pontuação vence.
Aqui está a definição completa de um programa primitivo, copiado do link acima:
Vamos definir um programa intocado como um programa que não possui nenhum erro, mas com erro se você modificá-lo removendo qualquer substring contíguo de N caracteres, onde
1 <= N < program length
.Por exemplo, o programa Python 2 de três caracteres
`8`
é um programa intocado, porque todos os programas resultantes da remoção de substrings de comprimento 1 causam erros (na verdade, erros de sintaxe, mas qualquer tipo de erro provoca):
8` `` `8
e também todos os programas resultantes da remoção de substrings de comprimento 2 causam erros:
` `
Se, por exemplo,
`8
tivesse sido um programa sem erros,`8`
não seria intocado, porque todos os resultados da remoção de substring devem ter erro.
fonte
JMP <address outside of the program's memory>
em montagem. Em princípio, em um computador real, ele pode executar um loop infinito ou sair com um erro diferente de zero, mas geralmente falha de maneira espetacular.Respostas:
Gelatina ,
253254256 bytesExperimente online! ou verifique!
Acontece que os idiomas do golfe podem ...
‘
.Agora apenas«»
não são utilizados«»
. Agora tenha a pontuação ideal!Quão?
A característica crucial do Jelly que torna isso possível é que os caracteres de abertura e fechamento para literais de strings não são os mesmos de quase todas as outras línguas.
A estrutura do programa é a seguinte:
M <239 character long string> L»«’Ɗạ‘}237$¤¡
M
encontra os índices de seu argumento que apontam para elementos máximos. O que importa é que, sem argumentos para esse programa, o Jelly atribui0
os erros de cadeia e Jelly quandoM
é aplicado0
.Para impedir a
M
atuação no0
programa completo, usamos o¡
quick, que se aplicaM
várias vezes determinado pelo resultado do link imediatamente anterior a ele. Nesse caso, esse link é<239 character long string> L»«’Ɗạ‘}237$¤
.L
pega o comprimento dessa string (239) e»«’Ɗ
diminui para 238. A»«
parte não faz nada, masƊ
(os últimos três links como mônada) fazem com que, se forem excluídos, ocorrerá um erro. Entãoạ
pega a diferença absoluta entre o resultado de»«’Ɗ
e a mônada‘}237$
aplicada à string.‘
incrementa e é uma mônada, mas}
transforma isso em uma díade e a aplica ao argumento correto237
, produzindo238
. Assimạ
produz0
em todo o programa.¤
links de volta para a cadeia literal formando um nilad. O resultado disso é0
, portanto,M
não é aplicado, impedindo qualquer erro.Subprogramas possíveis:
<string>..¤
ela será diferente de zero eM
aplicada0
, causando um erro.L»«’Ɗạ‘}237$
for removida, elaM
será aplicada0
ou haverá operações entre a sequência e um número, resultando em aTypeError
.¤¡
itens for removido, eleM
será aplicado0
.”
e os dois forem’‘
removidos e“
não, tudo depois seM
transformará em uma seqüência de caracteres, e assimM
atuará0
.”
e’
for removida e“
não, tudo entre”
e se‘
transformará em uma lista de números inteiros.M
sozinho for removido, existe um aEOFError
porque¡
espera um link antes do nilad anterior.M“
e qualquer número de caracteres após a remoção, haverá umEOFError
porque¤
procura um nilad que o precede, mas não o encontra.238
não conta porque faz parte de uma mônada.Isso praticamente cobre tudo.
Eu não tinha usado anteriormente
«»‘
porque os dois últimos não podem ser incluídos na string porque combinam com o“
caractere para formar outras coisas que não strings.«
também não pode estar em uma“”
string, mas não sei por quê.fonte
Haskell ,
3945505260 bytesO identificador
main
precisa ter um tipoIO a
para algum tipo a. Quando o programa é executado, o cálculomain
é realizado e seu resultado é descartado. Nesse caso, seu tipo éIO ((a,b)->a)
.O resultado é uma aplicação da função
(λ a b c d e f → return fst)
, uma função constante de seis argumentos que retorna a função fst (que fornece o primeiro elemento de uma tupla de 2), injetada na mônada de IO. Os seis argumentos sãoLT
(enumeração por menos de),EQ
(enum para a igualdade), lista vazia[]
,3
,2
e1
.O que seriam espaços são substituídos por caracteres únicos que contam como espaços: uma guia, um espaço sem quebra, um feed de formulário, uma guia vertical, OGHAM SPACE MARK, espaço regular, nova linha e retorno de carro. Se algum deles estiver faltando, haverá uma incompatibilidade no número de argumentos. Os nomes dos parâmetros são escolhidos como caracteres UTF-8 de três ou quatro bytes
𤶸陸ⵙ商ߜ新
, escolhendo cuidadosamente caracteres que não resultam em bytes duplicados.Agradeço ao @BMO por suas valiosas contribuições.
Despejo hexagonal:
Experimente online!
fonte
'\109999'
parece ser válido, pelo menos no GHC 8.2.2.'\10999a'
produz um erro lexical.
produz um erro lexical.maxBound :: Char
, ie'\1114111'
. Nota: os números são decimais por padrão; portanto, se você quiser hex, terá que colocar umx
depois do\
, por exemplo'\x10999a'
.\x10ffff
funciona bem e\x110000
fornece um erro fora do intervalo, como seria de esperar.Python 2 ,
20 21 33 39 4550 bytesAgora, um esforço colaborativo!
+2 graças a Aidan F. Pierce (substituir
sorted({0})
pormap(long,{0})
)+8 graças a dylnan (uso de
\
e nova linha para substituir o espaço; sugestões para passar0
para uma expressão matemática; substituição-1
por-True
; uso de hexadecimal)+11 graças a Angs (
4*23+~91
->~4836+9*1075/2
depois depois~197836254+0xbCABdDF
->~875+0xDEAdFBCbc%1439/2*6
)Experimente online! Ou veja o conjunto de confirmação
0xDEAdFBCbc
é hexadecimal e avalia como59775106236
.~
é um complemento bit a bit, então~875
avalia como-876
.%
é o operador do módulo que0xDEAdFBCbc%1439
avalia para293
./
é a divisão inteira, então0xDEAdFBCbc%1439/2
avalia como146
.*
é multiplicação, entãoxDEAdFBCbc%1439/2*6
avalia como876
.+
é adição, então~875+xDEAdFBCbc%1439/2*6
avalia como0
.... nenhuma versão simplificada também é avaliada como
0
.{0}
é umset
contendo um único elemento0
,.Chamar
sorted
com aset
como o argumento produz uma lista, que pode ser indexada com[...]
.Sem
sorted
o código({0})
apenas renderia oset
e isso não pode ser indexado da mesma maneira,if({0})[-True]:q
aumentaria aTypeError
.A indexação no Python é baseada em 0 e permite indexação negativa por trás e
True
é equivalente a1
, portanto,sorted({0})[-True]
encontra o elemento0
, enquantosorted({0})[True]
gerará uma sintaxeIndexError
, como serásorted({})[-True]
esorted({0})[]
é inválida.O
0
que é encontrado é Falsey assim que o corpo daif
,q
, nunca é executado, no entanto, se fosse ele iria levantar umaNameError
vez queq
ainda não foi definido.Como uma lista não vazia é verdadeira, também não podemos reduzir
if[-1]:q
.Veja o conjunto de confirmação para ver: confirmação os bytes sendo únicos; todos os erros; e o sucesso do próprio código.
fonte
C (tcc) , x86_64,
2931333940 bytesRetorna 0 . Agradecemos a @feersum por sugerir dígitos hexadecimais em maiúsculas.
Experimente online!
Como funciona
A atribuição grava duas entradas ( 184 e 49664 ) no local da memória principal . Com entradas de 32 bits e ordem de bytes little-endian, os bytes exatos são
b8 00 00 00 00 c2 00 00
.Como o tcc não declara o array definido como .data (a maioria dos compiladores o faria), então o salto para main executa o código da máquina para o qual ele aponta.
b8 00 00 00 00
(mov eax, imm32
) armazena o int 0 no registro eax.c2 00 00
(ret imm16
) retira 0 bytes extras da pilha e retorna. (O valor no registro eax é o valor de retorno da função).fonte
> <> , 122 bytes
Experimente online!
Faz nada. Baseado no mesmo formato da minha resposta: Programando um mundo intocado .
Primeiro, verificamos que o comprimento do código é 122 e erro se não for.
><>
os programas não podem terminar sem o uso do;
comando, mas se esse comando estiver no programa, podemos remover tudo o que estiver antes dele para que o programa termine imediatamente. Para combater isso, usamos op
comando para inserir um;
no código durante o tempo de execução. Para fazer isso, subtraímos 6 deA
e colocamos após op
.Provavelmente adicionarei a maioria dos outros valores acima de 127 quando descobrir os valores corretos de dois bytes. Os 5 valores ausentes são
v^;
e as duas novas linhas.Dos 7502 subprogramas, 7417 deles cometeram erros por instruções inválidas, 72 por falta de memória e 13 por falta de memória.
fonte
JavaScript, 42 bytes
i
,f
ouif
causaráSyntaxError: missing ; before statement
;田
causaráSyntaxError: expected expression, got end of script
;田
causaráInvalid or unexpected token
;田
Mostrar snippet de código
fonte
Flak cerebral , 2 bytes
Experimente online!
Como alternativa
[]
,{}
ou()
. A remoção de um dos suportes faz com que o outro suporte fique incomparável.Prova de que esta é a solução ideal:
Um programa Brain-Flak é composto de nilads (um par de colchetes por conta própria) ou mônadas (um par de colchetes contendo 1 ou mais nilads). Uma mônada não pode estar em um programa intocado, pois você pode simplesmente remover um ou mais nilads. Da mesma forma, você não pode ter mais de um nilad no programa, pois é possível remover um deles sem interromper o programa.
Como tal, essa pode ser a linguagem menos ideal para a programação original ou original.
fonte
Ada, 110 bytes (latin1)
Provavelmente, a melhor resposta que você obterá em qualquer idioma em uso na indústria?
Hexdump:
Compile salvando em qualquer arquivo que termine em
.ads
execuçãogcc -c <filename>
. Produz um executável que não faz nada. (Não é possível fornecer o link do TIO, pois o TIO coloca o código em um.adb
arquivo e,gcc
por padrão, tenta encontrar uma especificação correspondente)Declara basicamente um pacote com um nome abusando de letras maiúsculas / minúsculas latin1. Precisa de um caractere de espaço em branco diferente para cada um dos espaços, para usar espaço, CR, LF e TAB.
Como fica na versão vim:
Como funciona
No Ada, até as especificações podem ser compiladas. As especificações são como os arquivos de cabeçalho de c, mas são mais completas e podem compilar algum código básico. Para ser válida, qualquer especificação deve ter o formato:
package <NAME> is ... end <NAME>;
com<NAME>
correspondência. O bom de Ada é que ele não faz distinção entre maiúsculas e minúsculas. Assim, contanto que seu nome tenha variantes em maiúsculas e minúsculas, você estará pronto!A parte difícil foi obter uma unidade compilável. Normalmente, os programas Ada têm um procedimento ou função 'principal' localizado fora de qualquer pacote que se tornará o executável final. Infelizmente, os procedimentos exigem a
begin
palavra - chave, o que leva a muitose
s (apenas dois casos conhecidos), enquanto as funções exigem areturn
palavra - chave, o que leva a muitosn
s. Assim, eu tive que compilar apenas um pacote.fonte
C, 8 bytes
Faz nada.
Experimente online!
fonte
main(){short x;}
main(){short;}
compila apenas com awarning: useless type name in empty declaration
. Eu acho que C99 e C ++ exigem um tipo de retorno explícito, para queint main
(ou talvezunsigned main
) funcione, mas não com o gcc, que apenas avisa mesmo-std=c11
.return 0;
pode ser possível com o C89, onde não há implícitoreturn 0
no final demain
. Sair com status diferente de zero pode ser considerado falha, de acordo com outras respostas. A adição de sinalizadores de compilador como-Werror
conta para a pontuação de uma boa maneira no boliche de código? Porque o cumprimento estrito das violações do C11 poderia permitir um programa muito mais longo. Hmm,#include<>
alguma coisa e depois use; você não pode remover a inclusão e o uso e, se travar sem um protótipo ou definição de macro, você vence.main
einclude
ambos contêmi
, então você não pode ter os dois. Da mesma forma para declarar e usar uma função. Também o uso dereturn
todos começa a pensar nisso.int main
que não pode funcionar.JavaScript, 22 bytes
Experimente online!
Possíveis erros
Quando alterado, lançará um dos seguintes erros 1 :
1. O número exato de erros distintos depende do mecanismo. Esta lista foi gerada com o SpiderMonkey (Firefox).
fonte
Python 3 + Env-frasco ,
7131417 bytesSem TIO, porque não tem
flask-env
.Encontrou o nome mais longo do módulo que não possui interseção
import
e não possui números no final do nome._sha256
é mais longo, mas256
por si só não erra. Eu encontrei uma biblioteca,b3j0f.sync
que é um byte a mais, mas não consegui importar adequadamente.import
com\<newline>
. Remover um ou ambos causa um erro.Ainda pode haver opções mais longas do que
flask_env
eu realmente não fiz uma pesquisa exaustiva, mas examinei ~ 70.000 módulos. Aberto a sugestões.fonte
256
é executado sem erros.import *[hawkey]
e semelhante, mas, infelizmente, não funciona ...R , 14 bytes
Experimente online!
Isso pode ser o mais longo possível em R. A chamada de qualquer função está fadada ao fracasso, porque você poderá remover tudo, exceto o nome da função, o que resultaria na impressão do código-fonte da função. Este é o objeto nomeado mais longo na configuração R padrão, sem caracteres duplicados e sem nome de objeto que resta quando remover caracteres contíguos.
Essa primeira tentativa não funcionou, mas eu aprendi muito tentando!
dontCheck({family;NROW})
fonte
Perl 5, 3 bytes
=>
é a "vírgula gorda", que cita a palavra de barra à esquerda. Então isso é equivalente ao que não faz nada.
Sem a vírgula gorda,
y
o operador de transliteração é inválido sem três do mesmo caractere repetidos posteriormente.A vírgula gorda sozinha também é inválida, como é
=
e>
sozinha.fonte
brainfuck , 2 bytes
Experimente online!
Inspirado pela resposta Brain-Flak de Jo King . Isso é ideal porque o único erro no cérebro é entre parênteses. (Mais uma vez, obrigado a Jo King por esta informação.)
fonte
Ruby , 28 bytes
Experimente online!
Verifique!
fonte
ML padrão , 22 bytes
Experimente online!
op-(a,b)
é a forma sem açúcar dea-b
.~
denota o menos unário, então estamos realmente computando765+324
. Essa expressão é correspondida com padrão na constante1089
. Essa correspondência será bem-sucedida se o programa não tiver sido adulterado e não for - bem, nada.Se a correspondência não for bem-sucedida porque alguns dígitos foram removidos, obtém-se um
unhandled exception: Bind
. A remoçãoop-
resulta em um erro de tipo porque uma tupla corresponde a umint
. Todas as outras remoções devem resultar em um erro de sintaxe.fonte
Swift 4 , 19 bytes
Experimente online!
Todos os erros possíveis que encontrei são:
[
,]
,{
ou}
irá resultar em um erro de sintaxe[].
resultará emUse of unresolved identifier 'contains'
.
resultará emConsecutive statements on a line must be separated by ';'
[]
resultará emReference to member 'contains' cannot be resolved without a contextual type
{1 !=␊0}
resultará emExpression resolves to an unused function
1 !=␊0
resultará emMissing return in a closure expected to return 'Bool'
'!=' is not a prefix unary operator
'=' must have consistent whitespace on both sides
!=
resultará emMissing return in a closure expected to return 'Bool'
Consecutive statements on a line must be separated by ';'
Contextual type for closure argument list expects 1 argument, which cannot be implicitly ignored
[].contains
resultará emClosure expression is unused
Alguns outros programas interessantes são (um em cada linha):
fonte
a
sTcl , 6 bytes
Experimente online!
Tcl , 3 bytes
Experimente online!
Tcl , 2 bytes
Experimente online!
fonte
Lote, 7 bytes
Um bom começo
fonte
Retina , 2 bytes
Eu não ficaria surpreso se isso é ótimo ...
Experimente online!
O regex contém um grupo vazio. A remoção de qualquer parêntese causará um erro de análise devido a parênteses não correspondentes.
Outras soluções são:
\(
,\)
,\[
,\]
,\*
,\+
,\?
,a]
fonte
a]
não erro.C (gcc) ,
7375 bytesExperimente online!
Com base na resposta da @Steadybox, obrigado a @Angs por detectar um erro grave.
Sim, é um truque sujo (porque na verdade usa um
#define
com-DABCEGHIJKLMNOPQRSUVXYZabjkmopqrsvxz234567890=main
e-Dg=return
), mas não vejo nenhuma regra que proíba essa opção de compilador.fonte
-DABCEGHIJKLMNOPQRSUVXYZabjkmopqrsvxz234567890=main
+-Dg=return
, então eu argumentaria que ele usa um idioma inventado especificamente projetado para o desafio , o que é proibido por padrão.-1
sem erro