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 primitivo ( obrigado, Sp ) 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.
Sua tarefa neste desafio é escrever o programa intocado mais curto possível, que não requer entrada, mas gera qualquer uma das cinco seguintes palavras:
world
earth
globe
planet
sphere
Qual palavra você escolhe depende inteiramente de você. A única palavra e uma nova linha opcional à direita devem ser impressas em stdout (ou a alternativa mais próxima do seu idioma). O programa mais curto em bytes vence.
Notas:
- É necessário um programa independente, não uma função.
- As palavras diferenciam maiúsculas de minúsculas; saída
World
ouEARTH
não é permitido. - Os avisos do compilador não contam como erros.
- Os subprogramas com erro podem receber entrada ou dar saída ou fazer qualquer outra coisa, desde que sempre acabem errando.
Aqui está um trecho de pilha que lista os programas que precisam de erro, considerando um programa potencialmente intocado:
<script src='https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js'></script><script>function go() { var s = $('#i').val(), e = []; for (var i = 1; i < s.length; i++) { for (var j = 0; j <= s.length - i; j++) { e.push(s.substring(0, j) + s.substring(j + i)); } } $('#o').val(e.join('\n---\n')); }</script>Program:<br><textarea id='i' rows='16' cols='80'>`8`</textarea><br><button onclick='go()' type='button'>Go</button><br><br>Programs that should error: (--- separated)<br><textarea id='o' rows='16' cols='80'></textarea><br>
fonte
Respostas:
Trilho , 24 bytes
Eu acho que isso funciona. E é ao mesmo tempo curto e legível (tanto quanto o Rail).
$'main'
que recebermosInternal Error: Crash: No 'main' function found
.#
, não há como o programa sair corretamente, portanto, ele sempre será encerrado comCrash: No valid move
. Acredito que não é possível excluir uma subcadeia, de forma que a faixa forme um loop (infinito) válido.#
, ela será desconectada do final da pista, para que o trem caia (com o mesmo erro acima).#
, ela também desconectará a#
partir do final da trilha (e potencialmente até o início da trilha a partir do ponto de entrada$
). Então, novamente o mesmo erro.Quanto ao programa atual: todo programa ferroviário precisa ter uma
$'main'
(ou uma variante mais longa, mas estamos jogando golfe aqui) como um ponto de entrada para a função e o trem começa no$
sudeste. Tudo nessa primeira linha pode fazer parte da trilha, portanto, removê-'main'
la é:Os
-
e/
são simplesmente trilhos que precisamos deixar o trem fazer essas curvas de 45 °.[world]
empurra a cordaworld
e ao
imprime.#
marca o fim da pista - a única maneira de encerrar com segurança um programa ferroviário.Curiosamente, essa solução só é possível porque o Rail permite que as faixas passem pela
main
linha - se isso não fosse possível,#
seria após a primeira nova linha e o código sempre poderia ser reduzido paraque é um programa válido que não faz nada. (Caracteres não espaciais entre
'
e#
não afetariam isso.)Também é bastante interessante: se eu tivesse acabado de jogar a tarefa de imprimir
world
, não teria sido muito mais curta ou mais simples:fonte
/
do#
.$
desde o início da linha, de modo que o trem trava imediatamente (a Rail espera que a linha continue no sudeste do país$
).Função (
186136 bytes em UTF-16)Este programa imprime "mundo".
A maioria das substrings removidas impede que seja uma caixa completa, da qual o analisador reclamará. As únicas remoções possíveis que deixam uma caixa completa são:
A maioria deles remove a extremidade pendente no canto superior direito da caixa, que é o conector de saída. Sem essa ponta solta, a caixa é apenas um comentário:
Este não é mais um programa válido porque o analisador espera um programa com exatamente uma saída:
A única possibilidade que deixa um conector de saída é a última das opções acima, que deixa o seguinte:
No entanto, esse número não codifica uma seqüência de caracteres Unicode válida no UTF-21 esotérico da Funciton. Tente executar isso, você obtém:
Portanto, este programa é intocado.
fonte
Visual C ++ -
9695 bytesPropriedades:
int main()
sem um erro de compilação.a
de todos os meiosmain()
nunca fica{
, removendob
a todos os meios a nossa linha não termina em um;
, removendo<
os meiosstd::cout<'w'
provoca um erro, e remoção de<<
causasstd::cout'w'
,'w''o'
etc.I(a)
:I(b)
que nunca correspondem eI
que se expandem para antes(
; por outro lado, usandoI(,
causas<<<<
e,)
descarta o ponto- e -vírgula (exceto quaisquer outros erros).std::cout
sem encontrar um líder<<
e, portanto, não pode remover nenhum#include<iostream>
no início sem um erro de compilação.''
possui um erro de caractere vazio e'w,
, etc ... tenta transformar tudo em um caractere.)
ou(
do outro lado, por exemplo, você não pode fazer coisas comoI('w',I('r'
.Compila online usando o Visual C ++ .
Mais uma vez, isso não é uma prova exaustiva. Se você acha que pode fazê-lo funcionar sem a seção, informe-me.
As versões anteriores usavam uma abordagem consideravelmente diferente e provaram não ser primitivas, por isso removi essas pontuações.
Verificação:
O programa a seguir confirmou que esta versão é pura, usando o
cl
compilador do Visual C ++ 2010. Queria ter me dado ao trabalho de escrever isso antes:fonte
/c
opção será incluída automaticamente e ela será compilada (como se estivesse criando uma biblioteca e não um programa). Se você marcar a caixa de execução que o site não inclui/c
, você não receberá uma mensagem de sucesso e, em vez disso, encontrará a "LINK: erro fatal LNK1561: o ponto de entrada deve ser definido".Python 3,
7933open(1,'w')
abre a saída padrão e, em seguida, imprimimos a sequência.write
retorna o número de caracteres gravados. Isso é usado para proteger contra a remoção de substring: a remoção de parte da string faz com que algo diferente de 5 seja retornado e 5 menos esse valor é avaliado como true. Mas isso faz com que oif
-body seja executado ea
é indefinido.Isso é baseado na inteligência primitiva de Anders Kaseorg aqui .
Como apenas uma única instrução precisa ser verificada, isso é muito mais curto que a solução antiga, mas também menos geral.
Solução antiga:
Para verificar se realmente é um programa intocado:
Alguns pontos-chave:
q
foi executada requer uma declaração fora deq
. Ostry
resolve esse bem, exigindo pelo menos duas declarações, nenhum dos quais podem ser eliminados totalmente.q
foi executado acontece avaliandor
no final.q
não foi modificado é alcançada poreval(q[17:])
, que deve avaliarNone
paraq
ser executado.if
condição é um pouco difícil de acertar. Para garantir que foi avaliado, tem o bom efeito colateral da configuraçãoe
, que é necessário para definirr
. (Esta é a razão pela qual eu usei o Python 3,expr
como uma função que faz maravilhas para efeitos colaterais no nível da expressão.)fonte
Haskell, 61
Algum tipo de erro está OK? Nesse caso:
Haskell, 39
fonte
JavaScript,
747335 bytesAcontece que a resposta foi muito mais simples do que eu pensava ...
Explicação
fonte
a="world"
, exceto , não com erroif(a="world")["bol"+a[4]]
não erro.Java 8, 301 bytes
Porque cada pergunta precisa de uma resposta Java.
Expandido
Explicação
public static main(String[]a){}
É necessário.A parte mais difícil:
final
palavra-chave for removida, a segunda linha será avaliada1/(8-8)
, causando uma/ by zero
exceção.fonte
System.out.print()
método vazio . Existe paraprintln()
, mas não paraprint()
. Então, se você removê-d='d'
lo, dariaThe method print(boolean) in the type PrintStream is not applicable for the arguments ()
como erro (E se você o removessed=
, dariaThe blank final field d may not have been initialized
como erro).Função ,
143142136 bytesA pontuação está em UTF-8, como de costume, pois o UTF-16 seria dois bytes maior (devido à BOM).
Então, eu estou pensando em uma resposta do Funciton há um tempo e achei que seria impossível, porque você sempre pode remover uma linha completa e o código ainda forma um bloco válido. Então conversei com Timwi sobre o assunto, e ele descobriu que você pode colocar o número inteiro em uma única linha, de forma que removê-lo interromperia o programa por falta de um conector de saída.
Porém, literais em uma única linha são notoriamente caros, devido à maior contagem de caracteres e ao maior número de caracteres não ASCII. E sua menção a um bloco de "comentário vazio" me fez pensar ...
Então, eu vim com essa solução mais eficiente, que usa um bloco de comentários vazio adicional, que é interrompido quando você tenta remover qualquer coisa que deixe o bloco literal intacto:
Isso deixa duas opções (obrigado a Steve por apontar isso):
19342823075080880373
é decodificado, a sequência correspondente conterá o ponto de código0x18D53B
que não é um caractere Unicode válido,System.Char.ConvertFromUtf32
trava com umArgumentOutOfRangeException
.508088037380718711
conteria dois pontos de código inválidos0x1B0635
e0x140077
, levando à mesma exceção.Observe que, mesmo sem o bloco de comentários vazio, remover a segunda linha levaria a um ponto de código inválido. Mas o bloco de comentários impede que tomemos uma linha de dentro da segunda linha, para obter um número inteiro como,
193428037380718711
por exemplo, o que não causaria um erro.fonte
Ruby, 36
Atribuímos e
s="planet"
, em seguida, escrevemos essa string em STDOUT. Isso retorna o número de caracteres gravados. Nós adicionamos 6 com 6, para que, se algo além de 6 caracteres fosse escrito, obteríamos um número inteiro diferente de zero. Em seguida, cortamoss
esse índice. Somente o 0º caractere des
"p" é uma sequência de códigos válida (no-op). Passamos isso paraeval
, usando a(*[argument])
sintaxe equivalente a apenas(argument)
exceto que não é válida fora de uma chamada de método.Pristineness verificado programaticamente no Ruby 1.9.3 e 2.2
fonte
*
?C #,
128118101 bytesPensou em abusar da regra de substring contígua.
O código
Por que Funciona
class h
estatic void Main()
são obrigatórios.'w','o','r','l','d'
causa um erro porque a matriz de caracteres é inicializada com comprimento1*5
.Antes do Golfe e Separação
Verificado com
https://ideone.com/wEdB54
EDITAR:
#if !x
vez de#if x #else
.=>
Sintaxe de função usada .#if!x
em vez de#if !x
. Créditos para @JohnBot.=>
sintaxe da função, é possível remover a condição preproc extra.fonte
static
onMain
.Main
uma função membro Expression-bodied e mais 2, removendo os espaços antes a condição pré-processador:class h{static void Main()=>System.Console.Write(new char[1\n#if!l\n*5]{'w','o','r','l','d'\n#if!o\n});\n#endif\n}\n#endif
. Isso é 115 pela minha contagem.MATLAB,
373633 bytesComo não tenho certeza se temos permissão para gerar também ans = , tive que encontrar uma solução alternativa para a saída de maneira adequada. Usar o fprintf por si só não funcionou, porque não importa o que eu tentei, ele simplesmente se recusou a erro. Usar disp por si só não era uma opção, pois seria necessário apenas 1 argumento e esse argumento, obviamente, também seria executado sem erros.
Se não houver problema em incluir também ans = na saída, o MATLAB poderá ser feito com 20 bytes :
fonte
> <> , 17 bytes
Experimente online!
Imprime "terra".
A única maneira de um
><>
programa sair sem erro é executar o;
caractere, o que é um problema, pois você pode remover todos os caracteres antes disso, de modo que esse;
é o primeiro caractere executado. Você pode contornar isso usando op
comando para modificar o programa para incluir;
durante a execução. A remoção de qualquer seção do código faz com que o;
de nunca ser produzido causando erros através das instruções inválidasB
,h
et
, stack underflow, e loops infinitos tornando-se, eventualmente, ficar sem memória. Eu só tinha que ter certeza de que todos os loops infinitos continuassem preenchendo a pilha.Todas as variantes foram testadas usando este snippet python:
adicionado (uma versão ligeiramente modificada) ao intérprete oficial fish.py pelo criador do> <>. Dos 152 possíveis subprogramas possíveis, 92 com erro devido a instruções inválidas, 18 com excesso de pilha e 42 com falta de memória.
Curiosidades, a primeira versão disso
e"ooooo6-c0pAhtra
tinha alguns subprogramas estranhos que conseguiram usar o comando put para colocar um[
que limparia a pilha, no lugar da instrução inválidaA
. Além disso, "earth" é a única das frases que funcionará com esse método, porque a primeira letrae
é uma instrução válida><>
. Caso contrário, o"
comando deve ser colocado na frente do programa, e um subprograma válido pode ser"
por si só.fonte
Ruby, 34
Isso tem alguns componentes:
eval(*[
O expr])
é emprestado da resposta do histocrat e é primitivo, além de verificar o valor de retorno do expr é um programa válido de ruby que não gera erros.method(*arr)
é uma sintaxe ruby que chamamethod
com os valores dearr
como os argumentos. A razão pela qual isso é necessário aqui é porque ele é válido apenas como parâmetros para um método; portanto, seeval
for removido,(*[expr])
será um erro de sintaxe. Se expr for removido,eval
reclama-se de não ter argumentos suficientes$>.write("world")-1
não pode ser mutilado, exceto dentro da cadeia e da subtração.$>.write("world")
grava "world" em STDOUT e retorna o número de caracteres gravados e subtrai 1. Portanto, se o programa for desmembrado, o valor será exatamente 4 . Se for mutilado (o-1
removido ou o encurtado), ele retornará um de -1,0,1,2,3 ou 5 . Qualquer outra manipulação resulta em um erro de sintaxe.A chamada
chr
de um número retorna o caractere representado por esse número. Portanto, quando chamado no resultado do exemplo acima, ele gera um erro em -1 e, caso contrário, retorna uma cadeia de caracteres únicos.Na verdade, não sei por que, mas parece que o ruby interpreta
\x04
como um caractere de espaço em branco, o que significa que a expressão é válida (programas vazios de ruby não fazem nada). No entanto, qualquer um dos outros caracteres (\x00
-\x03
e\x05
) resulta emInvalid char '\x01' in expression
. Eu descobri isso simplesmente repetindo a matemática possível que eu poderia fazer com o número retornado. Anteriormente eu tinha usadoonde "planet" mais uma nova linha eram 7 caracteres, vezes 16 para obter 112
p
, a única função de letra única em ruby definida por padrão. Quando não há argumentos, é efetivamente um no-opMenção honrosa:
$><<"%c"*5%%w(w o r l d)
é muito próxima, mas não intocada. Remover"%c"*5%
resultados sem erros. Mini-explicação:$>
é stdout e<<
é uma função que está sendo chamada."%c"*5
gera a string de formato"%c%c%c%c%c"
, que então tenta ser formatada (%
) por uma matriz:%w(w o r l d)
que é uma versão mais curta['w','o','r','l','d']
. Se houver muito poucos ou muitos elementos na matriz para que não correspondam à sequência de formatação, será gerado um erro. O calcanhar de Aquiles é esse"%c"*5
, e%w(w o r l d)
ambos podem existir independentemente, e$><<
só precisa de um argumento de ambos. Portanto, existem algumas maneiras diferentes de confundir esse programa com primos sem erros.Validado usando isso:
fonte
Python 3 , 43 bytes
Experimente online!
Como funciona
Para proteger contra exclusões de substring, usamos em
open(1,"w").write
vez deprint
. No Python 3,write
retorna o número de caracteres escritos, que iremos verificar5
para garantir que nenhuma parte da string tenha sido excluída. Fazemos isso pesquisando o valor de retorno no dicionário{5:[]}
e repetindo o resultado comfor[]in…:a
, que falhará se não obtivermos uma iterável vazia ou se afor
instrução for excluída.fonte
Javascript (Node.js),
9395 bytesVerifique seu próprio tamanho duas vezes, se houver algum caractere faltando, será gerado um erro. O comprimento é 156 porque o Node.js precede
function (exports, require, module, __filename, __dirname) {
o código no tempo de execução.Obrigado Martin Büttner por apontar um erro. Corrigido agora.
fonte
Perl 5.10+,
7163 bytesImprime
world
com uma nova linha à direita. Execute assim:Isso depende da contagem de bytes do código-fonte, portanto
file
deve conter o código acima e nada mais (sem shebang, sem nova linha à direita). O Perl 5.10+ é necessário parasay
o operador definido ou//
.É incrivelmente difícil criar um programa primitivo com o Perl, porque:
Qualquer identificador bareword (por exemplo
foo
,a
,_
) é uma declaração válida comno strict 'subs';
(o padrão). Isso significa que o programa não pode começar nem terminar com uma letra, número ou sublinhado.Como explica tchrist , "os identificadores especificados por meio de dreferencing simbólico não têm absolutamente nenhuma restrição em seus nomes". Isto significa que o programa não pode começar com qualquer um dos sigilos
$
,@
,%
, ou*
, uma vez que a remoção de todos, mas o primeiro e último personagem iria deixar sempre um nome de variável válido.Muitas funções internas (incluindo a maioria das funções capazes de produzir saída) funcionam
$_
por padrão, portanto, as chamadas geralmente funcionam mesmo se você remover o argumento (por exemplo,say"world"
vs.say
).Como funciona
Essa solução foi inspirada na resposta Node.js. de Naouak , que verifica seu próprio comprimento para garantir que os caracteres não foram removidos.
O programa possui duas seções, uma entre parênteses e a outra dentro de um bloco:
A primeira seção lê o arquivo de origem e morre se tiver menos de 63 caracteres. A segunda seção verifica se o
read
executado foi executado com sucesso. Se uma seção for removida (com ou sem parênteses ou chaves), a outra seção lançará uma exceção.Remover o lado central, esquerdo ou direito do programa desequilibrará os parênteses e / ou chaves, causando um erro de sintaxe.
Se o primeiro
die
é alterada (ad
,e
,di
,de
, ouie
, que são todos os identificadores válidos), a verificação de comprimento torna-se:que avalia como:
Isso leva uma referência a uma string e tenta desreferenciá-la como uma matriz, produzindo um erro:
Se qualquer outra instrução for alterada, a verificação do comprimento falhará e o programa morrerá.
Verificado como novo com o seguinte programa:
fonte
Ruby + coreutils,
332726 bytesExperimente online!
Os backticks em ruby executam o comando dentro deles e retornam o que o programa colocou no STDOUT como uma string. A
#{expr}
sintaxe permite incorporar expressões em strings e backticks. Este programa pode ser reescrito (de forma inexistente) como:IO#write
retorna o número de bytes gravados; portanto, se a string for encurtada, não será o número certo.#{}
a incorporação transforma automaticamente o número em uma sequência. Se alguma peça for removida e não resultar em erro de sintaxe, o comando errado será executado. Se parte de"world"
for removida, uma dasbase04
passagensbase54
tentará executar.A nova linha, dentro ou fora da cadeia, é necessária. Caso contrário, os 5 primeiros caracteres (
`base
) podem ser removidos, tornando a linha inteira um comentário. Também deve haver um ou mais caracteres entre o primeiro backtick e#
, caso contrário, ele{
pode ser removido para tornar a coisa toda um comentário do shell .exec
Substitui o processo ruby atual pelo comando especificado. Veja minha outra resposta para uma explicação dameth(*[])
sintaxe e da necessidade dela.(s="ec%co earth")
atribui a string "ec% co terra" para a variávels
. As atribuições retornam o que foi atribuído, portanto, a sequência também é retornada."format string %d" % 5
é açúcar sintático parasprintf("format string %d",5)
, no entanto, espaços ao redor do%
não são necessários.s[10]
obtém o caractere na sequência no índice 10. Quando não é mutilado, esse caractere é "h", a última letra da sequência. No entanto, a remoção de qualquer caractere na cadeia de caracteres significa que a cadeia é mais curta; portanto, não há caracteres no índice 10; portanto ,s[10]
retornanil
e"%c" % nil
causa um erro.se
%s[10]
for removido, o ruby tenta executar o comandoec%co earth
que não funciona.Alterar
10
para1
ou0
também resulta em um comando desconhecido (eceo
ouecco
). Removê-lo totalmente não é tecnicamente um erro de sintaxe, pois chama o método#[]
na cadeia de caracteres, mas, em seguida, reclama de argumentos insuficientes.Uma observação sobre como resolver isso em geral: Você deve ter um invólucro que verifique o código interno em um sentido abstrato enquanto estiver intocado. Por exemplo, um programa com divisão no final (
blablabla/somevar
) nunca funcionará porque uma divisão sempre pode ser removida (blablabla
). Estes são alguns dos invólucros que usei até agora:eval(*[
código])
usado pelo histocrat e na minha primeira resposta. Valida se a saída é um programa ruby válidoexec(*[
código])
usado acima, valida que a resposta é um comando válido`#{
código}`
A sintaxe do backtick também executa um comando (e, portanto, valida que seja válido), no entanto, STDOUT é capturado como uma sequência em vez de ser exibido como o processo pai '(Ruby's) STDOUT.
Devido a isso, não pude usá-lo para esta resposta,EDIT: fiz o trabalho. Limitações descritas acima.Edit: Obrigado a @histocrat por apontar algumas falhas
fonte
write
e o início da string, mas acho que isso não afeta a pureza. Além disso, minha máquinabase64
ficará pendurada aguardando entrada, o que pode ser contra as regras.$>.write"world"
funcione, obrigado! Quanto à base64 aguardando entrada, ela parece variar de acordo com o sistema. O TIO funciona bem. Isso torna ainda mais confuso se segue as regras.PowerShell, (97 bytes + 5 para o nome do programa) = 102 bytes
Verifica-se antes de se destruir ... duas vezes.
Espera ser salvo como
c.ps1
e executado a partir do diretório local como tal:PS C:\Tools\Scripts\Golfing\> .\c.ps1
.O alias
gc
é curtoGet-Content
e é semelhante a umacat
leitura de um arquivo (neste caso, nosso caminho de execução.\c.ps1
). Obtemos.Length
o arquivo, configuramos para$a
e verificamos se não é igual a 97 com-eq97
. Se for igual (ou seja, o programa não foi modificado), imprimimos com"world"
e executamos um comando inválidoa
. Isso força ocatch
efeito, o que nos permite verificar a nós mesmos novamente. Dessa vez, se nosso código não for igual a 97, lançamos um comando inválido para que nosso programa cometa um erro e imprima o texto do erro na saída. Nós entãoclear()
o erro eexit
normalmente.É óbvio que, se uma das
if
instruções for violada, a outra terá um erro. Se qualquer parte"world";
for adulterada, a primeiraif
causará um erro. Como precisa ser contíguo, não podemos remover as duasif
instruções. Seqüências de caracteres no meio resultam em parênteses incompatíveis ou no segundo{a}
sendo executado. Otry
/catch
é capturar o erro da primeiraif
instrução para que possamos limpá-lo adequadamente. A parte externa"$( )"
impede que as strings de cada extremidade sejam cortadas. A final;a
é impedir que partes do meio sejam cortadas, o que resultaria em programas válidos (por exemplo"it}a)";a
, que serão impressosit}a)
e, em seguida, com erro).Existem várias circunstâncias especiais:
gc
,gc<space>
ougc .\
for removido, o programa eventualmente cometerá algum erro de falta de memória (devido a repetidas chamadas de auto-execução) e provavelmente travará o shell (e talvez o computador). Não testado.<space>.\c.ps1
ou.\c.ps1
for removido, o programa será interrompido e solicitará a entrada do usuário. Não importa o que o usuário insira, o programa continuará com erro, pois a contagem de tamanho estará errada.$
e terminando antes do último"
for cortada, o programa emitirá o que restar e depois erro, porquea
não é válido.Verificado com o seguinte:
(Obrigado a Martin por sua extensa assistência!)
fonte
C (gcc) (Linux
-Werror=undef
), 66 bytesExperimente online!
Grande desafio! Isso foi enganosamente difícil, mas tenho certeza que tenho um programa válido agora!
Usa um comando do pré-processador para que nenhuma linha nova possa ser removida, pois o colchete de fechamento para
main
é incluído apenas se__LINE__==6
. Também evita que você limpemain
completamente, já que isso deixa#endif
flutuando (por isso é importante que#endif
esteja foramain
).Eu usei
#else
porque eu me tornei bastante convencido de que não há versão do__LINE__==6
que não pode ter uma substring removido e ainda ser verdade, já que ambos6
e__LINE__
por si mesmos são truthy. Ele também é usado-Werror=undef
para que algo como#ifdef(LINE__)
não seja avaliado como falso, mas seja um erro.Com o gcc (no Linux, pelo menos),
puts
retorna o número de caracteres impressos (incluindo a nova linha à direita); portanto, remover qualquer parte da stringputs("...")/6
retorna0
,1/0
causando uma exceção de ponto flutuante. Observe que essa exceção não é causada, a menos que1/0
seja atribuída a algo, portantoa=
é necessário.Nenhuma outra parte de qualquer linha pode ser removida sem criar um erro, geralmente um erro de sintaxe ou um erro de vinculação.
Como um bônus, isso fornece uma solução de 86 bytes para C ++ de maneira bastante trivial, basta adicionar
#include <cstdio>
e declarara
comoint
. Experimente online! (C ++)fonte
1/
enquanto sai da nova linha e ela ainda será executada .1
era suposto na linha anterior, eu acredito.=1
. Eu acho que você precisa colocar o 1 em uma linha por conta própria.PHP, 73 bytes
Explicação
Eu assumo a configuração padrão do php.ini. Então short_tags está desativado. Isso significa que você não pode remover o
=
da marca de abertura.Isto é basicamente
<?=unserialize('s:5:"world"');
.Se você remover qualquer parte da string serializada, receberá um erro.
Você pode simplesmente remover
unserialize
e o script produzirá apenas a sequência serializada. Para superar isso eu usocall_user_func
. A remoção de um dos parâmetros resultará em um erro.No entanto, você pode remover
un
, para chamar aserialize
função. Então tiramos 'ns'. A remoção de qualquer caractere não resultaria em um nome de função incorreto.Usaremos um inline se estiver usando atribuição de variável com a tag de saída. Em vez de usar
&&
, usamos '|' para evitar remover uma única&
ou remover a$f
atribuiçãoVocê pode remover
='ns')&&($f="u{$p}erialize"
e acabar com($p)?$f:''
. Portanto, adiciono parênteses extras$f="u{$p}erialize"
.Nota
Tecnicamente, você pode remover as tags de abertura sem gerar um erro. No entanto, este não é mais um script PHP, mas apenas um arquivo de texto simples.
fonte
Matlab (77)
tente
Nota:
Seguindo o conselho do @ Optimiser de projetar uma RCP ou algo assim, fui confrontado com substratos imprevistos que não levaram a nenhum erro de compilação quando removidos; exemplo: remover
arrayfun(@(x)a(x),prod(b,ismember(4,1:5))),
desta edição anteriorfeval(@(a)arrayfun(@(x)a(x),prod(b,ismember(4,1:5))),'world')
não gera nenhum bug! também, na mesma edição recente, houvebsxfun(@(a,b)arrayfun(@(x)(x),prod(b,ismember(4,b))),'world',1:5)
ebsxfun(@(a,b)a,'world',1:5)
, se você perguntou como eu estava ao encontrá-los no meu console de saída, chorei como um bebê, então aqui está o programa:Um exemplo de um programa não intocado
editar:
fonte
SmileBASIC, 63 bytes
fonte
Uma pereira , 17 bytes
Este programa contém bytes com o conjunto de bits alto (que não é válido UTF-8 e, portanto, não pode ser publicado no TIO), então aqui está um
xxd
hexdump reversível:Explicação
Isso é apenas
print'world'
com uma soma de verificação anexada. Eu verifiquei por força bruta que nenhuma das exclusões possíveis fornece um programa com uma soma de verificação válida; portanto, você recebe um erro após qualquer possível exclusão.Bastante chato, mas amarra o líder atual, então eu senti que valia a pena postar.
fonte