Boliche com código único e original


82

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 , o 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, `8tivesse sido um programa sem erros, `8`não seria intocado, porque todos os resultados da remoção de substring devem ter erro.


37
Tiramos o chapéu para você por conseguir criar um bom desafio de boliche de código !
ETHproductions

Se um subprograma é executado para sempre, mas não há erro, isso invalida a resposta?
dylnan

1
@dylnan "um erro é definido como [...] finalizar após um período finito de tempo."
usar o seguinte comando

3
@Baldrickk Não, não seria permitido para esse desafio. (Se você está se referindo ao exemplo na questão, é uma demonstração do que um programa intocada é, mas que não satisfaz o requisito adicional de bytes únicos.)
Aidan F. Pierce

1
Podemos considerar um comportamento indefinido como um erro se, na prática, geralmente resultar em um erro? Estou pensando em algo como 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.
Chris

Respostas:


23

Gelatina , 253254 256 bytes

M“¢£¥¦©¬®µ½¿€ÆÇÐÑ×ØŒÞßæçðıȷñ÷øœþ !"#%&'()*+,-./0145689:;<=>?@ABCDEFGHIJKNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|~¶°¹²³⁴⁵⁶⁷⁸⁹⁺⁻⁼⁽⁾ƁƇƑƓƘⱮƝƤƬƲȤɓƈɗƒɠɦƙɱɲƥʠɼʂƭʋȥẠḄḌẸḤỊḲḶṂṆỌṚṢṬỤṾẈỴẒȦḂĊḊĖḞĠḢİĿṀṄȮṖṘṠṪẆẊẎŻḅḍẹḥịḳḷṃṇọṛṣṭụṿẉỵẓȧḃċḋėḟġḣŀṁṅȯṗṙṡṫẇẋẏż”L»«’Ɗạ‘}237$¤¡

Experimente online! ou verifique!

Acontece que os idiomas do golfe podem ...

  • +1 byte trabalhando em . Agora apenas «»não são utilizados
  • +2 bytes com com «». 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$¤¡

Mencontra os índices de seu argumento que apontam para elementos máximos. O que importa é que, sem argumentos para esse programa, o Jelly atribui 0os erros de cadeia e Jelly quando Mé aplicado 0.

Para impedir a Matuação no 0programa completo, usamos o ¡quick, que se aplica Mvárias vezes determinado pelo resultado do link imediatamente anterior a ele. Nesse caso, esse link é <239 character long string> L»«’Ɗạ‘}237$¤.

Lpega 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 correto 237, produzindo 238. Assim produz 0em todo o programa.

¤links de volta para a cadeia literal formando um nilad. O resultado disso é 0, portanto, Mnão é aplicado, impedindo qualquer erro.

Subprogramas possíveis:

  • Se qualquer parte da string for removida, <string>..¤ela será diferente de zero e Maplicada 0, causando um erro.
  • Se qualquer parte de L»«’Ɗạ‘}237$for removida, ela Mserá aplicada 0ou haverá operações entre a sequência e um número, resultando em a TypeError.
  • Se algum dos ¤¡itens for removido, ele Mserá aplicado 0.
  • Se o caractere de fechamento de seqüência de caracteres e os dois forem ’‘removidos e não, tudo depois se Mtransformará em uma seqüência de caracteres, e assim Matuará 0.
    • Se a string fechar o caractere e for removida e não, tudo entre e se transformará em uma lista de números inteiros.
  • Se Msozinho for removido, existe um a EOFErrorporque ¡espera um link antes do nilad anterior.
  • Se M“e qualquer número de caracteres após a remoção, haverá um EOFErrorporque ¤procura um nilad que o precede, mas não o encontra. 238nã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ê.


31

Haskell , 39 45 50 52 60 bytes

main=do{(\𤶸	陸 ⵙߜ 新->pure fst)LT
EQ[]3
2$1}

O identificador mainprecisa ter um tipo IO apara algum tipo a. Quando o programa é executado, o cálculo mainé 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ão LT(enumeração por menos de), EQ(enum para a igualdade), lista vazia [], 3, 2e 1.

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:

00000000: 6d61 696e 3d64 6f7b 285c f0a4 b6b8 09ef  main=do{(\......
00000010: a793 c2a0 e2b5 990c e595 860b df9c e19a  ................
00000020: 80e6 96b0 2d3e 7075 7265 2066 7374 294c  ....->pure fst)L
00000030: 540a 4551 5b5d 330d 3224 317d            T.EQ[]3.2$1}

Experimente online!


Hum, '\109999'parece ser válido, pelo menos no GHC 8.2.2. '\10999a'produz um erro lexical.
Chepner # 18/18

@chepner: Acabei de testar com o GHC 8.2.2 e também 𚶯produz um erro lexical.
ბიმო

2
@chepner: maior Char é maxBound :: Char, ie '\1114111'. Nota: os números são decimais por padrão; portanto, se você quiser hex, terá que colocar um xdepois do \ , por exemplo '\x10999a'.
N /

@nimi Aaaand Eu acho que estabelecemos com que frequência eu realmente uso escapes Unicode :) Usar a forma correta para valores hexadecimais, \x10fffffunciona bem e \x110000fornece um erro fora do intervalo, como seria de esperar.
Chepner #

25

Python 2 ,  20 21 33 39 45  50 bytes

Agora, um esforço colaborativo!

+2 graças a Aidan F. Pierce (substituir sorted({0})por map(long,{0}))

+8 graças a dylnan (uso de \e nova linha para substituir o espaço; sugestões para passar 0para uma expressão matemática; substituição -1por -True; uso de hexadecimal)

+11 graças a Angs ( 4*23+~91-> ~4836+9*1075/2depois depois ~197836254+0xbCABdDF-> ~875+0xDEAdFBCbc%1439/2*6)


if\
map(long,{~875+0xDEAdFBCbc%1439/2*6})[-True]:q

Experimente online! Ou veja o conjunto de confirmação

0xDEAdFBCbcé hexadecimal e avalia como 59775106236.
~é um complemento bit a bit, então ~875avalia como -876.
%é o operador do módulo que 0xDEAdFBCbc%1439avalia para 293.
/é a divisão inteira, então 0xDEAdFBCbc%1439/2avalia como 146.
*é multiplicação, então xDEAdFBCbc%1439/2*6avalia como 876.
+é adição, então ~875+xDEAdFBCbc%1439/2*6avalia como 0.
... nenhuma versão simplificada também é avaliada como 0.

{0}é um setcontendo um único elemento 0,.

Chamar sortedcom a setcomo o argumento produz uma lista, que pode ser indexada com [...].

Sem sortedo código ({0})apenas renderia o sete isso não pode ser indexado da mesma maneira, if({0})[-True]:qaumentaria a TypeError.

A indexação no Python é baseada em 0 e permite indexação negativa por trás e Trueé equivalente a 1, portanto, sorted({0})[-True]encontra o elemento 0, enquanto sorted({0})[True]gerará uma sintaxe IndexError, como será sorted({})[-True]e sorted({0})[]é inválida.

O 0que é encontrado é Falsey assim que o corpo da if, q, nunca é executado, no entanto, se fosse ele iria levantar uma NameErrorvez que qainda 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.


17

C (tcc) , x86_64, 29 31 33 39 40 bytes

main[]={(23*8),-~0xABEDFCfebdc%95674+1};

Retorna 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).


O link do TIO está mostrando uma falha de segmentação para mim.
pppery 23/10

15

> <> , 122 bytes

e"~l=?!z6-d0p}xwutsrqonmkjihgfcba`_]\[>ZYXWVUTSRQPONMLKJIHGFEDCB@<:98754321/,+*)('&%$# .	|{Ay

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 o pcomando para inserir um ;no código durante o tempo de execução. Para fazer isso, subtraímos 6 de Ae colocamos após o p.

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.


13

JavaScript, 42 bytes

if([0XacdCADE*Proxy.length]!=362517948)田
  • Remover i, fou ifcausará SyntaxError: missing ; before statement;
  • A remoção causará SyntaxError: expected expression, got end of script;
  • Remover 1 ou 2 bytes de causará Invalid or unexpected token;
  • Modificar a expressão booleana causará Erro de sintaxe ou Erro de referência em

00000000: 6966 285b 3058 6163 6443 4144 452a 5072  if([0XacdCADE*Pr
00000010: 6f78 792e 6c65 6e67 7468 5d21 3d33 3632  oxy.length]!=362
00000020: 3531 3739 3438 29e7 94b0                 517948)...


9

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.


6

Ada, 110 bytes (latin1)

Provavelmente, a melhor resposta que você obterá em qualquer idioma em uso na indústria?

Hexdump:

0000000: 7061 636b 4167 4520 6266 686a 6c6d 6f71  packAgE bfhjlmoq
0000010: 7274 7576 7778 797a e0e1 e2e3 e4e5 e6e7  rtuvwxyz........
0000020: e8e9 eaeb eced eeef f0f1 f2f3 f4f5 f6f8  ................
0000030: f9fa fbfc fdfe 0d69 730b 656e 6409 4246  .......is.end.BF
0000040: 484a 4c4d 4f51 5254 5556 5758 595a c0c1  HJLMOQRTUVWXYZ..
0000050: c2c3 c4c5 c6c7 c8c9 cacb cccd cecf d0d1  ................
0000060: d2d3 d4d5 d6d8 d9da dbdc ddde 3b0a       ............;.

Compile salvando em qualquer arquivo que termine em .adsexecução gcc -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 .adbarquivo e, gccpor 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:

packAgE bfhjlmoqrtuvwxyzàáâãäåæçèéêëìíîïðñòóôõöøùúûüýþ^Mis^Kend^IBFHJLMOQRTUVWXYZÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖØÙÚÛÜÝÞ;

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 beginpalavra - chave, o que leva a muitos es (apenas dois casos conhecidos), enquanto as funções exigem a returnpalavra - chave, o que leva a muitos ns. Assim, eu tive que compilar apenas um pacote.


5

C, 8 bytes

main(){}

Faz nada.

Experimente online!


1
Talvez eu não entendo o desafio, mas que sobremain(){short x;}
Jerry Jeremias

@JerryJeremiah: não, main(){short;}compila apenas com a warning: useless type name in empty declaration. Eu acho que C99 e C ++ exigem um tipo de retorno explícito, para que int main(ou talvez unsigned main) funcione, mas não com o gcc, que apenas avisa mesmo -std=c11.
27618 Peter Cordes

@JerryJeremiah: a return 0;pode ser possível com o C89, onde não há implícito return 0no final de main. Sair com status diferente de zero pode ser considerado falha, de acordo com outras respostas. A adição de sinalizadores de compilador como -Werrorconta 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.
Peter Cordes

@ PeterCordes Eu pensei sobre isso, mas maine includeambos contêm i, então você não pode ter os dois. Da mesma forma para declarar e usar uma função. Também o uso de returntodos começa a pensar nisso.
Chris

Opa, esqueci o requisito de bytes únicos; claro int mainque não pode funcionar.
Peter Cordes

4

JavaScript, 22 bytes

with(0xF?JSON:[])parse

Experimente online!

Possíveis erros

Quando alterado, lançará um dos seguintes erros 1 :

[some_identifier] is not defined
expected expression, got ')'
expected expression, got ':'
expected expression, got '?'
expected expression, got ']'
expected expression, got end of script
identifier starts immediately after numeric literal
missing ( before with-statement object
missing ) after with-statement object
missing : in conditional expression
missing ] after element list
missing exponent
missing hexadecimal digits after '0x'
missing octal digits after '0o'
unexpected token: ')'
unexpected token: ']'
unexpected token: identifier

1. O número exato de erros distintos depende do mecanismo. Esta lista foi gerada com o SpiderMonkey (Firefox).


4

Python 3 + Env-frasco , 7 13 14 17 bytes

import\
flask_env

Sem TIO, porque não tem flask-env.

Encontrou o nome mais longo do módulo que não possui interseção importe não possui números no final do nome. _sha256é mais longo, mas 256por si só não erra. Eu encontrei uma biblioteca, b3j0f.syncque é um byte a mais, mas não consegui importar adequadamente.

  • Um byte por substituição de um espaço, depois importcom \<newline>. Remover um ou ambos causa um erro.

Ainda pode haver opções mais longas do que flask_enveu realmente não fiz uma pesquisa exaustiva, mas examinei ~ 70.000 módulos. Aberto a sugestões.


256é executado sem erros.
Aidan F. Pierce

@ AidanF.Pierce Obrigado, corrigido.
dylnan

Eu tentei import *[hawkey]e semelhante, mas, infelizmente, não funciona ...
dylnan

1
hawkey não está na biblioteca padrão, de modo que este é "Python com hawkey" (provavelmente pode fazer melhor com algum outro módulo em algum lugar)
Jonathan Allan

@JonathanAllan Good point. Tem que ir agora, mas eu vou procurar mais tarde
dylnan

3

R , 14 bytes

(Sys.readlink)

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})


2

Perl 5, 3 bytes

y=>

=>é a "vírgula gorda", que cita a palavra de barra à esquerda. Então isso é equivalente a

"y",

o que não faz nada.

Sem a vírgula gorda, yo 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.




1

ML padrão , 22 bytes

val 1089=op-(765,~324)

Experimente online! op-(a,b)é a forma sem açúcar de a-b. ~denota o menos unário, então estamos realmente computando 765+324. Essa expressão é correspondida com padrão na constante 1089. 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ção op-resulta em um erro de tipo porque uma tupla corresponde a um int. Todas as outras remoções devem resultar em um erro de sintaxe.


1

Swift 4 , 19 bytes

[].contains{1 !=
0}

Experimente online!

Todos os erros possíveis que encontrei são:

  • Remover qualquer um [, ], {ou }irá resultar em um erro de sintaxe
  • A remoção [].resultará emUse of unresolved identifier 'contains'
  • A remoção .resultará emConsecutive statements on a line must be separated by ';'
  • A remoção []resultará emReference to member 'contains' cannot be resolved without a contextual type
  • A remoção {1 !=␊0}resultará emExpression resolves to an unused function
  • A remoção 1 !=␊0resultará emMissing return in a closure expected to return 'Bool'
    • A remoção da nova linha resultará em '!=' is not a prefix unary operator
    • A remoção do espaço resultará em '=' must have consistent whitespace on both sides
    • A remoção !=resultará emMissing return in a closure expected to return 'Bool'
      • A remoção da nova linha também resultará em Consecutive statements on a line must be separated by ';'
      • A remoção do espaço e da nova linha (e zero ou um dos dígitos) resultará em Contextual type for closure argument list expects 1 argument, which cannot be implicitly ignored
  • A remoção [].containsresultará emClosure expression is unused

Alguns outros programas interessantes são (um em cada linha):

[].isEmpty
[:].values
[1:2]

Isto contém dois as
caird coinheringaahing



0

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]



@ jimmy23013 Ah, não sei como senti falta disso. Revertida.
precisa

-2

C (gcc) , 73 75 bytes

#include <ftw.h>
ABCEGHIJKLMNOPQRSUVXYZabjkmopqrsvxz234567890(){g FTW_D-1;}

Experimente online!

Com base na resposta da @Steadybox, obrigado a @Angs por detectar um erro grave.

Sim, é um truque sujo (porque na verdade usa um #definecom -DABCEGHIJKLMNOPQRSUVXYZabjkmopqrsvxz234567890=maine -Dg=return), mas não vejo nenhuma regra que proíba essa opção de compilador.


A primeira linha pode ser tirado para que o programa não é intocada
Angs

@Angs Graças, fixo (com o preço de adicionar outra opção do compilador)
trolley813

8
De acordo com este meta post , seu envio não está mais no idioma C, mas no C89 + -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.
Dennis19 /

Você pode remover o -1sem erro
Jo King
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.