Essa ideia não é minha, embora eu não saiba de onde se originou. Uma vez eu o conheci em um concurso de programação há muito tempo (1998, se bem me lembro). A tarefa é escrever um programa em seu idioma favorito que produz 2012
e somente 2012
. O problema é que o programa ainda deve ser produzido 2012
depois que qualquer um de seus caracteres for modificado. A modificação pode ser inserção, exclusão ou substituição. Obviamente, a modificação será tal que o programa ainda é sintaticamente válido.
Como não conheço todas as linguagens de programação, tenho que pedir à audiência que me ajude e teste as respostas enviadas.
Adicionado: Muitos comentaram que minha definição de modificações aceitáveis é muito vaga. Aqui está minha segunda tentativa: As modificações permitidas deixarão seu programa sintaticamente válido e não causarão falha. Lá, acho que isso deve cobrir todos os erros de tempo de compilação, tempo de link e tempo de execução. Embora eu tenha certeza de que, de alguma forma, haverá algum caso estranho em algum idioma, então, quando isso surgir, veremos isso individualmente.
Respostas:
C, 53 caracteres
Um pouco mais do que a linguagem de script responde e segue o mesmo princípio básico. Confia no fato de que, devido às restrições da sintaxe de C, as únicas letras que seriam possíveis de serem alteradas sem invalidar o programa estão dentro das strings!
Editar: Raspou 4 caracteres.
Reedit: Robustez aumentada, raspou um personagem.
Re-redit: Mais longo, mas mais robusto. Apenas tente o seu
&
agora! (Corretamente desta vez).Atualização: Encurtado um pouco; derrota a maioria das abordagens vistas até agora.
Atualização: Int alterado para anular; deve derrotar a última abordagem possível para quebrá-la que eu possa pensar.Atualização: Pensei em outra abordagem; substituindo o últimoa
(pode apodrecer) por0
; o uso de nomes de duas letras deve lidar com esse problema.Atualização: Última atualização revogada; assumindo que alterações que causam erros de tempo de execução não são permitidas;
a
vai funcionar muito bem.Atualização: Retrocedendo um pouco mais; a tentativa de desreferenciar
*a
também irá falhar; portanto, usarvoid
para provocar um erro de compilação não deve ser necessário.Atualização: E um encurtamento final; depende da cadeia
"2012"
ser colocada em apenas um endereço (o que é comum); e que cadeias literais são somente leitura (também comuns).Atualização: custou-me dois personagens, mas eu derrotei seu ponto-e-vírgula insignificante!
fonte
register void
; Oregister
existe para prevenir&
; ovoid
existe para impedir*
.;
entreputs
e(
.2012
! (Eu só usei caracteres ASCII imprimíveis para os testes de inserção e substituição, mas duvido expandindo o repertório ajudaria.)==
para!=
no ternário, que leva a lugar algum; agora, em vez de emitira
, agora é gerado"2012"
.Haskell, 19
ou, como um programa completo,
29
Para um pouco mais divertido:
Para obter um que não possa ser modificado de maneira a gerar apenas um erro de tempo de execução, podemos codificar as informações nos comprimentos das listas que não podem ser modificadas usando apenas alterações de um caractere, ou seja,
Para torná-lo mais modificável (com segurança), também podemos usar o próprio número como elemento de lista - basta criar strings para impedir a troca de vírgulas por mais ':
Como essa string é apenas o resultado da expressão, também podemos substituí-la novamente por isso - não é um problema, graças à preguiça de Haskell
6472Os
init
atos como "um menos, mas não negativo" aqui.Também podemos incluir o sistema de tipos no esquema de redundância e, em seguida, escrever o número de uma maneira que possa ser modificada com alterações de um caractere ...
(
GHCi> twothousandandtwelve
≡>"2012"
)Agora você pode alterar qualquer um
u
parap
vice-versa, mas isso sempre atrapalha a profundidade dos empilhamento de listas no segundo elemento da tupla e, assim, desencadeia um erro em tempo de compilação.Essa idéia poderia ser expandida ainda mais, de forma que textos inteiros pudessem ser codificados de maneira compacta, fácil de ler e editar e ainda protegidos da modificação de caracteres únicos.
E mais um ...
fonte
a=map(head.show.length)[[a,a],[],[a],[a,a]]
solução, insiraa
entre[]
. Eu realmente gosto deste post! Soluções muito inteligentes.[a]
->[]
na solução de 64-charJavascript
Acredito que seja à prova de erro de tempo de execução, qualquer alteração única deve resultar em um erro de compilação ou em um único alerta dizendo 2012.
Edit: Código cometeria um erro de execução em algo como
if("alert(2012 "==r)
, mudei a seção try para lidar com isso.Edit: Nice one Vilx-, mas corrigível :-) Agora há uma incompatibilidade de colchetes para inserir esse ponto e vírgula.
Edit: Mas então uma vírgula poderia fazer a mesma coisa que o ponto-e-vírgula, que é uma série de opções, eu acho que corrigi-lo, mas há uma enorme quantidade de código agora.
Edit: Simplificado um pouco.
Editar: Mais uma em uma série infinita de correções.
Edit: Isso meio que parece mais longo e complicado do que à prova de balas, mas deve pelo menos cuidar de
~eval
e!eval
.fonte
q-")"
retornaNaN
, para o qual eval é convertido"NaN"
antes de avaliá-lo, o que simplesmente retorna a eleNaN
. Coisa estranha de se fazer, mas tecnicamente legítima, para que não invoque a captura.;
entreeval
e(
.~
na frente daseval
causas faz com que ele ecoe2012
duas vezes em vez de uma vez. Não tenho certeza se isso desobedece as regras ou não: P!
depois oeval(
quebra.Perl, 49 caracteres
Baseado na resposta de JB , mas este realmente satisfaz as especificações . Uma verificação exaustiva indica que cada exclusão, inserção ou substituição de um caractere mantém a saída inalterada ou causa a falha do programa durante a execução (como indicado por um valor de retorno diferente de zero e a saída para stderr), pelo menos enquanto inserções e as substituições são restritas a caracteres ASCII imprimíveis.
(Sem a restrição, a tarefa é impossível no Perl: um recurso pouco conhecido do analisador Perl é que ele pára quando encontra um caractere Ctrl-D ou Ctrl-Z, inserindo qualquer um deles na frente de qualquer arquivo em um programa Perl válido que não faz nada.)
Edit: Raspou mais um char, substituindo
1==print
por0-print
.fonte
print
começa a retornar em'true'
vez de 1 :-Pprint
qualquer versão do Perl 5, mesmo que não esteja explicitamente documentado .)Brainfuck
Estou tentando me convencer de que isso é possível e tenho certeza de que talvez tenha me esticado um pouco demais. Fiz algumas suposições sobre meu ambiente:
Infelizmente, se você ficar mais rigoroso, temo que isso seja impossível. Aqui está a minha solução:
Basicamente, você pode alterar o código de saída ou o código de verificação, mas não os dois. Um deles é garantido para o trabalho. Se um deles não, ele irá 'travar'.
fonte
Python2
Eu tive que mudar um pouco o script de teste de Ray para testar isso, pois o redirecionamento stdout estava quebrando. Passar dicts vazios para exec evita poluir o espaço para nome
fonte
Flacidez Cerebral , 44 + 3 = 47 bytes [Não Competente]
Isso usa a
-A
bandeira do Brain-Flak e gera os caracteres2012
para STDOUTExperimente online!
Alternativa, 50 bytes
Experimente online!
Explicação
Qualquer modificação de caractere único em qualquer um dos códigos acima causará erro no programa.
fonte
Sisi , não concorrente
Finalmente, acho que encontrei um dos meus idiomas que funciona. É terrivelmente longo, e a linguagem é mais nova que a pergunta, mas ainda parece uma conquista.
Sobre Sisi
Sisi é uma linguagem de brinquedo inspirada em assembly e QBasic. É bom para esse desafio porque sua sintaxe é extremamente limitada.
set
,print
,jump
, ejumpif
.set
instruções. Eles podem conter apenas (no máximo) uma operação, que deve ser binária. Em particular: mudarprint xx
paraprint -xx
é um erro de sintaxe.O programa
O núcleo do programa é esta parte:
Nós armazenamos
2012
emxx
, em seguida, testar se que foi bem sucedida e armazenar o resultado do teste noy
. Sey
for verdade, pule para a linha 55. (Salta para números de linhas inexistentes, basta avançar rapidamente para a próxima linha.)Endurecimento por radiação
y
é falsey, o salto não acontece e a linha 4 é definidaxx
para 2012.xx
será definido como 2012 se fizermos o salto ou não.print
na linha 955 mais cedo ou mais tarde. Não é possível com uma modificação saltar para trás (criando um loop) ou passar o final do programa.0
, portanto, uma modificação comoprint ax
não é um erro. A solução feia mas eficaz são as linhas 828-954, que atribuem 2012 a todas as variáveis possíveis com uma distância de edição de 1 a partir dexx
. Isso garante que qualquer modificação na finalprint xx
ainda seja impressa em 2012.xx
novamente.fonte
Pitão
Um pouco detalhado (agora com uma correção para esse ponto
print
e vírgula irritante entre e(
!):fonte
pop()
O conjunto vazio não é um erro em si, mas gera um 'Erro'.pop
saídas<built-in method pop of set object at 0xb6fe93ac> ()
T-SQL 2012, 55
fonte
Eu fiz um script python para julgar todas as soluções python. O script quebra a primeira e a terceira soluções python, com muitos métodos diferentes.
E a segunda solução, use lambda para se proteger, é inquebrável.A segunda solução python está no python 3. Modifiquei-o no formato python 2 e depois julguei que o programa o quebrou.Aqui está o script do juiz.
fonte
p2
sempre lança uma exceção para Python2. A saída nunca é 2012. Seu programa de juízes não será executado no Python3, pois usa declarações de impressão.p2
está em python 3.Mathematica, 23 caracteres
Nota: "/." significa "substituir"
fonte
/.
para//
(formulário pós-fixado).Javascript -
68, 77, 84, 80 caracteresAqui está uma solução que deve funcionar este ano :)
Aqui está o teste .
Atualização 1: Foi corrigido o problema em que eval (+ a) o quebrou (graças ao eBusiness).
Atualização 2: corrigida para o '|' case (obrigado novamente eBusiness).
Atualização 3: Corrigida para o caso '>' (obrigado novamente eBusiness). E quebrou para o caso '1' :(
fonte
eval(+a)
e muitas outras modificações funcionam perfeitamente, mas não fazem muito.eval(+a)
caso, que agora deve ser corrigido. Além disso, não consegui encontrar um dos casos de modificação em que ele corra bem, mas não gera 2012, então você pode me dar um exemplo?eval(0)
e,eval(-a)
por exemplo, faz a mesma coisa.||
por|
.alert
paraaler=
.Ruby 1.9 - 43 caracteres
Não testado, então se afaste.
fonte
Excel, 14 caracteres (trapaça ligeiramente):
Qualquer alteração válida na matriz afetará o conteúdo de ambas as células, e a tentativa de alterar apenas uma célula aciona uma mensagem de erro.
Obviamente, isso será quebrado se você considerar que é realmente apenas uma fórmula, em oposição a duas fórmulas restritas a serem idênticas.
fonte
Java 7
Explicação:
a
o valor de2012
).a
for modificado de qualquer forma, ele seguirá o seguinte caminho: 1 → 3 → 5 (e retornaráb
o valor inalterado de2012
).b
for modificado de qualquer forma, ele seguirá o seguinte caminho: 1 → 3 → 4 (e retornaráa
o valor inalterado de2012
).a.equals(b)
em @ 1 é modificado paraa.equals(a)
,b.equals(b)
ou!a.equals(b)
ainda vai tomar o mesmo caminho seguinte: 1 → 2 (e ele irá retornara
's valor inalterado de2012
).a
on @ 2 for alterado,b
ele ainda seguirá o seguinte caminho: 1 → 2 (e retornaráb
o valor inalterado de2012
).a
oub
for alterado para o oposto nas linhas 3, 4 ou 5, ainda seguirá o seguinte caminho: 1 → 2 (e retornaráa
o valor inalterado de2012
)a
o valor inalterado de2012
)M
dentroclass M
oua
emmain(String[]a)
para outro caractere válido pode ser feito sem quaisquer alterações à funcionalidade do código.Experimente todas essas modificações aqui, para verificar se elas ainda imprimem 2012.
Se você encontrar alguma maneira de quebrá-lo, seguindo as regras do OP, eu adoraria saber, para que eu possa pensar em algo para corrigi-lo.
Diferentemente da maioria das perguntas semelhantes em que um único caractere é modificado, essa pergunta permite que a estrutura básica da linguagem de programação em questão fique intacta, para que o Java possa finalmente
competir em umentre um (vamos ser sinceros, o Java quase nunca ganhará nada) este SE xD).fonte
a
? O programa ainda produzirá 2012 ou produzirá -2012?-
antes doa
orb
. Aqui está uma captura de tela do erro Compilar.Ruby 1.9
Eu construo este programa curto, mas simples, que você está convidado a quebrar de acordo com as regras acima. Eu não conseguia nem encontrar uma posição em que a saída fosse alterada (sem quebrar o código) se a
#
fosse inserida para comentar o restante da linha.fonte
irb
, adicionando um sinal de menos antes dosrx
resultados de um programa válido que gera-2012
...puts
paraputc
faz com que isso produza a?
no Ruby 1.9.Scala, 95
(ou 54 se pular partes não significativas)
fonte
(...),("2012")
pareceu quebrá-lo.C #
Certamente não é assim tão simples, é? ...
Ok, o que eu sinto falta?
fonte
if (result += "2012")
torná-la saída20122012
?if
instrução, não uma string.;
depoiselse
faz com que o resultado seja duas vezes.PHP, 30
fonte
<?=$i=2012;$i==2012?-$i:2012;?>
<?#$i=2012;$i==2012?$i:2012;?>
Solução contra isso: insira uma nova linha depois$i=2012
.Táxi , 396 bytes
Formatado para humanos, é isso:
Ao ler outras respostas, a solução parece ser escolher um idioma frágil, definir o valor, verificar o valor, imprimir o valor.
fonte
SmileBASIC
Primeiro, habilitamos o modo estrito. Isso força você a declarar todas as variáveis antes de usá-las e evita coisas como alterar? A $ para? B $.
Em seguida, uma variável de cadeia chamada "A $" é criada e o valor é definido como "@ 2012". Para garantir que o valor de A $ não seja afetado, o programa tentará pular para um rótulo e o único rótulo no programa é @ 2012.
Agora, A $ é definitivamente "@ 2012", mas antes de imprimi-lo, o @ precisa ser removido. SHIFT () remove o primeiro item de uma string ou matriz (assim como pop (), mas do outro lado). Para descartar o valor retornado por SHIFT, ele é passado para um bloco IF / THEN, que não faz nada. Apenas no caso de alguém tentar comentar essa linha, declaramos uma variável "B", que será usada posteriormente. Se o VAR for comentado, a última linha lançará um erro de variável indefinida.
Agora, A $ é impresso e há outro VAR para evitar comentários. A linha final apenas garante que as variáveis B e C tenham sido declaradas.
fonte
?-A$VAR C
- isso poderia resultar-2012
??B$VAR C
:? :)Haskell, 65
Perl, 84
Abordagem falhada:
fonte
$&
por algo parecido$0
.nub$filter(\x->x==2012||x==2012)(2012:[2012])
pode ser seguro para a solução Haskell.use English
in perl, isso vai consertar. Eu acho que várias correções funcionam para Haskell, incluindo a mudança para strings.print
com*rint
,prin:
,p:int
ou#rint
, antecedendo=
à primeira linha, ou mesmo substituindos/.*/
coms/./
ouy/.*/
(o que seria fixado por inicializar$ARG
a2012
para começar). Além disso, seu$SUBSEP
truque ainda não protege contra a inserção de um*
antes do ponto e vírgula final, mas uma solução muito mais fácil é apenas remover esse ponto e vírgula desnecessário.PHP,
4348.fonte
-
entre?
e os$a
resultados na-2012
impressão.date()
, mas o programa tem que funcionar além de 2012 também. ;)-
entre os? e os abdominais. ;-)Rubi (
5736)EDITAR E outro em 36 caracteres.
Eu acho que o uso de strings é bastante seguro, porque essa coisa de menos não funciona mais.
EDITAR próxima tentativa (36 caracteres) [não importa, adicionando um
-
p
resultados posteriores em-2012
]p [2012,2012] .find (2012) .first || 2012Este só funcionará este ano, mas também para concursos semelhantes no futuro :) (15.chars)
Observe que esta substituição também está funcionando:
57 caracteres. Se você contar as novas linhas, também serão 76 caracteres.
fonte
#
no início da linha. Última solução - digite uma nova linha antesp
. (Nota - eu não conheço Ruby, então talvez eu esteja errado).$><<
ouputs
preferir. Seja como for, eu não vou tentar fazer isso mais, eu desisti :)Q, 23
.
etc
fonte
-
)? -{$[-2012~m:2012;m;2012]}
-{$[2012~m:-2012;m;2012]}
-{$[2012~m:2012;m;-2012]}
q){$[-2012~m:2012;m;2012]}` 2012
-q){$[2012~m:-2012;m;2012]}` 2012
-q){$[2012~m:2012;m;-2012]}` 2012
;m;
para algo como;1;
ou;x;
.Hmm .. deixe-me tentar:
128 caracteres sem o espaço em branco.
fonte
System.out.println(-i)
(para a primeira impressão). Também quebrado, por exemplo, substituindo o primeiroprintln(i)
por, por exemploprintln(1)
. Também potencialmente quebrado, alterandoi == j
parai += j
(ou - =, etc.).PHP
Espero que seja inquebrável :)
fonte
echo(printf("%s",$a)==4)?die(3
e entendo20123
.."2012"
para."FAIL"
. :)Groovy: 26
fonte
x=2012;print x^2012?2012:-x
-
?-
é tentar modificar seu código com um caractere para que ele não funcione mais.x=2012;print x^=2012?2012:x
(mudar^
para^=
) altera a saída para 0.Lua
fonte
-
sinais?2012
para outra coisa, a declaração gerará um erro. Hmm ... bem, acho que você merece pontos de criatividade por abusar das regras. Mas, falando sério, não foi assim que aconteceu.