Inspirado por este comentário ...
Obrigado aos usuários Step Hen , Wheat-Wizard e Dennis por ajudarem a solidificar a especificação deste desafio antes de publicá-lo!
Este é o tópico do ladrão! Para o tópico dos policiais, clique aqui
Nesse desafio , você tem a tarefa de executar um código que o torna para que sua linguagem não atenda mais aos nossos critérios de ser uma linguagem de programação. Nesse desafio, isso significa fazer com que o idioma não possa mais ...
Obter entrada e saída numéricas
Adicione dois números juntos
Teste se um determinado número é primo ou não.
Esse é um desafio de policiais e ladrões , onde há dois desafios diferentes com dois objetivos diferentes: os policiais tentam escrever um código que torne a linguagem praticamente inutilizável, e os ladrões tentam encontrar a solução oculta que permite que os policiais recuperar o idioma deles.
Os policiais escreverão dois trechos de código:
Um que torna seu idioma praticamente inutilizável, por exemplo, removendo funções incorporadas para realizar operações numéricas e de entrada / saída. Este código não tem permissão para travar ou sair. Deve ser possível adicionar código ao final deste trecho, e esse código será avaliado . E
Um trecho de código que recebe dois números como entrada, os adiciona e gera sua soma. Esse trecho ainda deve funcionar corretamente mesmo após a execução do primeiro trecho. Quando os dois trechos são combinados, eles devem formar um programa completo que adicione dois números ou definir uma função que adicione dois números. Esse snippet provavelmente dependerá de um comportamento obscuro e será difícil de encontrar.
Os policiais também escolherão qualquer método padrão de entrada e saída . No entanto, eles devem revelar exatamente qual formato (entrada e saída) eles estão usando. Para que você decida a resposta deles, siga o mesmo formato de entrada / saída, ou o seu crack não conta.
A resposta da polícia sempre revelará
O primeiro trecho (obviamente não o segundo).
Idioma (incluindo versão secundária, já que a maioria dos envios provavelmente dependerá de casos extremos)
Formato IO, incluindo se é uma função ou um programa completo. Os ladrões devem usar o mesmo formato para ser um crack válido.
Quaisquer casos extremos estranhos necessários para que a resposta funcione. Por exemplo, é executado apenas no linux ou requer uma conexão com a Internet .
Como um assaltante, você deve examinar um dos envios da polícia e tentar decifrá-lo. Você pode decifrá-lo escrevendo qualquer trecho válido que possa funcionar como o trecho 2 (adicionando dois números depois que o idioma ficar inutilizável). Esse não precisa ser o mesmo trecho que o policial escreveu originalmente. Depois de ter uma resposta quebrada, poste seu código como resposta neste tópico e poste um link para sua resposta como um comentário na resposta do policial. Em seguida, essa postagem será editada para indicar que foi quebrada.
Aqui está um exemplo. Para o primeiro trecho, você pode ver o seguinte programa python 3 como uma resposta da polícia:
Python 3
print=None
Leva a entrada de STDIN e a saída para STDOUT
Um segundo snippet válido pode ser
import sys
a,b=int(input()),int(input())
sys.stdout.write(a+b)
Isso é válido porque ele recebe dois números como entrada e gera a soma deles, mesmo que você junte os dois trechos, por exemplo
print=None
import sys
a,b=int(input()),int(input())
sys.stdout.write(a+b)
Este é um crack válido para a resposta deles.
Se a resposta de um policial permanecer sem quebra por uma semana inteira, ele poderá editar seu segundo trecho e indicar que sua resposta agora está segura . Uma vez editado para ser seguro, você não poderá mais tentar decifrá-lo. Se eles não o editarem como seguro, você pode continuar tentando quebrá-lo até que eles o façam.
O vencedor do tópico do ladrão é o usuário que obteve mais respostas, com o desempate sendo o momento em que alcançaram N rachaduras. (portanto, se dois usuários diferentes tiverem cinco rachaduras, por exemplo, o usuário que postou sua quinta rachadura primeiro é o vencedor) Depois de um tempo suficiente, aceitarei a resposta do vencedor com mais votos.
Diverta-se!
Esclarecimentos sobre regras
O primeiro trecho deve ser executado corretamente sem receber nenhuma entrada . Pode produzir o que você quiser e essa saída será ignorada. Desde que o snippet seja concluído, o segundo snippet será executado corretamente.
O segundo trecho deve realmente ser executado para que sua resposta seja válida. Isso significa uma resposta como
import sys sys.exit()
não é válido porque não quebra o idioma. Simplesmente sai.
Depois de estar seguro, sua pontuação é a contagem de bytes de ambos os trechos .
Isso remonta a Por favor, revele quaisquer casos extremos estranhos necessários para que sua resposta funcione ... Seu envio deve conter informações suficientes antes de ser revelado para ser reproduzível após ser revelado. Isso significa que se sua resposta se tornar segura e você editar em: Aqui está a minha resposta. Ah, sim, BTW isso só funciona se você executá-lo no Solaris, brinca com você! sua resposta é inválida e será excluída e não será considerada elegível para ganhar.
O segundo trecho pode travar após a saída da soma. Contanto que a saída ainda esteja correta (por exemplo, se você optar por enviar para STDERR e obter várias informações de falha, isso é inválido)
Entre os melhores
Aqui está uma lista de todos os usuários com pelo menos um crack, ordenados por pontuação e depois pelo nome (em ordem alfabética). Se você enviar um crack, atualize sua pontuação de acordo.
#User #Score
Ilmari Karonen 8
Dennis 5
Olivier Grégoire 4
Sisyphus 3
Veedrac 3
Arnold Palmer 2
Bruce Forte 2
DJMcMayhem 2
Dom Hastings 2
ppperry 2
1bluston 1
2012rcampion 1
Ben 1
BlackCap 1
Christian Sievers 1
Cody Gray 1
HyperNeutrino 1
Joshua 1
Kaz 1
Mark 1
Mayube 1
Xnor 1
zbw 1
fonte
SecurityManager
que estivesse no escopo ... Você também pode ler a partirSystem.in
deste ponto, porque ainda não está fechado.sun.awt.SecurityManager
e"sun.awt.command"
dependem da plataforma e não fazem parte do Java .System.getProperties().get("blah")
(já que eu apenas bloqueei o acessoSystem.getProperty
, nãoSystem.getProperties
), mas isso é bom o suficiente! Bem feito!C (GCC / Linux) por Sisyphus
Esse trecho fecha a função fornecida e inicia uma nova (injeção clássica de código), que redefine
close
para que, em vez de fechar o fd, execute o código desejado.fonte
Python, a solução do Wheat Wizard aqui
Quero dizer, você pode simplesmente definir o limite de recursão e nada de ruim acontece ...
Trabalhos em TIO
Nota
Este é meu primeiro envio de CnR, portanto, se isso quebrar alguma regra, informe-me e eu o excluirei.
fonte
os.sys
se, se isso faz diferença: PHaskell por Ben
Eu ainda tenho números literais e caracteres (eu uso
0
,'0'
e'-'
),[a..]
ee[a..b]
quais são muito úteis. E eu tenho unário-
, mas eu poderia prescindir.Eu recrio
++
para implementarr
(reverse
) e definirt
ets
quais sãotail
etails
.x a b
retorna on
th elemento deb
, onden
é o comprimento dea
menos um.x
geralmente pode ser definido comosnd.last.zip
. A funçãod
pega uma lista e retorna uma lista com os elementos dessas posições que são múltiplos de dez.l!!s
retorna on
th elemento del
, ondes
é a representação de string invertida den
.+
retorna como inteiro a soma de dois números naturais dados como seqüências de caracteres invertidas, da mesma forma-
para a diferença.add
retorna como número inteiro a soma de dois números inteiros possivelmente negativos dados como seqüências de caracteres.Eu me pergunto se isso é um pouco semelhante ao que Ben tinha em mente.
fonte
:
estava no escopo, mesmo comNoImplicitPrelude
e sem importar nada.C (gcc) por Conor O'Brien
Experimente online!
fonte
Python 2 pelo Wheat Wizard (quarta iteração)
Experimente online!
Sem explorações, apenas uma função para adicionar usando apenas caracteres
' &)(,.:[]a`cdfijmonrt~'
, como pretendido (apenas na verdade'(),.:[]`acdfijmnort'
).Não tentei encurtar; Acabei de escrever subexpressões para valores intermediários como 0 e a string vazia e a substitui em.
Experimente online!
A idéia principal é que o formato da string
'{0:5}'.format('1')
preencha o número zero com um comprimento5
igual'1 '
. Pela concatenação usando duas dessas cadeias''.join
, a soma de seu comprimento é a soma dos números de entrada. Então, aderimos a um0
até o final e chamamos.find()
para a posição final, que é a soma.A sequência
'{0:5}'
a ser formatada é produzida extraindo os{:}
caracteres das repetições de sequência de dicionários, criadas comdict
. A sequência repr de cada soma sucessiva é colocada onde os 5 estariam. Eu queria usar um ditado como{0:5}
ele mesmo, mas seu repr inclui um espaço que estragou tudo.Entradas de 0 atrapalham o processo porque a string sub tem um comprimento mínimo de 1. Temos aquelas com a
and/or
para fornecer a string vazia neste caso.fonte
int([]in[])
simplesmenteint()
tanto como saída será 0.Haskell, de Laikoni
fonte
montagem em modo real de 16 bits x86, por Joshua
Explicação:
A "quebra" introduzida pelo código de Joshua é a configuração do sinalizador de interceptação (TF), que coloca a CPU no modo de etapa única. Isso significa que apenas uma única instrução será executada por vez, antes que a CPU pare (traps) com uma interrupção do tipo 1. É isso que permite que os depuradores implementem o passo único do código - bastante útil lá, mas uma PITA real, se você quiser executar o código fora do contexto de um depurador!
É a seguinte seção de código que ativa o sinalizador de interceptação:
A implementação do sinalizador de interceptação significa que temos a chance de executar exatamente uma instrução antes dos traps da CPU - que é o que ocorre imediatamente após o
POPF
aqui. Então, precisamos fazer com que este conte.O truque é a
INT 3
instrução, que chama a interrupção número 3. Há duas razões pelas quais isso funciona para "desobstruir" o código:O sinalizador de interceptação é limpo em manipuladores de interrupção. Isso é apenas parte do design da Intel, mas foi presumivelmente feito por razões básicas de sanidade. Lembre-se de que a implementação do sinalizador trap é que uma interrupção do tipo 1 é invocada após a execução de cada instrução; portanto, se o TF não foi limpo,
INT 1
ele próprio acionaria uma interrupção - seria interrupções até o fim. Além disso, a interrupção do TF claro facilita a depuração do código, como um IDE que passa automaticamente pelas chamadas para as funções da biblioteca.A maneira como interrompe o trabalho é essencialmente a mesma que distante
CALL
. Eles invocam o manipulador de interrupções cujo endereço é armazenado na posição correspondente na tabela de vetores de interrupção global. Como essa tabela começa no endereço0x0000:0000
e é armazenada em um arquivo de 4 bytessegment:offset
formato de , calcular o endereço é tão simples quanto multiplicar 4 pelo vetor / número de interrupção. Nesse caso, invocamos a interrupção 3, de modo que seria 4 × 3 = 12.... e você notará que Joshua pensativamente configurou isso para nós. Antes de ativar o sinalizador de interceptação, ele tem o seguinte código:
que define
0x0000:000C
(o manipulador de interrupção paraINT 3
) comoBP:SI
. Isso significa que sempre queINT 3
é chamado, ele envia o registro FLAGS para a pilha, seguido pelo endereço de retorno e depois ramifica paraBP:SI
, o que nos permite começar a executar o código novamente, em um contexto em que o sinalizador de trap é desativado.É tudo ladeira abaixo depois
INT 3
. Tudo o que precisamos fazer é adicionar dois números e imprimir o resultado. Exceto que isso não é tão simples na linguagem assembly como seria em outros idiomas, então é aqui que a maior parte do código é gasta.Joshua está permitindo que o ladrão especifique qualquer mecanismo de E / S que ele queira , então estou adotando a abordagem simplista de assumir que os valores são passados no
DX
eCX
registradores . Isso é razoável, uma vez que estes não são prejudicados em parte alguma pelo seu código de "prólogo".A saída é feita armazenando bytes ASCII diretamente na memória de vídeo. O buffer de vídeo inicia
0xB800:0000
em um modo de texto CGA, EGA e / ou VGA, então começamos a imprimir lá. O formato é: caractere no byte baixo e atributo de cor no byte alto. Isso significa que cada caractere está em um deslocamento de 2 bytes. Nós apenas iteramos através de cada um dos dígitos do número (base 10), convertendo-os em ASCII e imprimindo-os um de cada vez na tela. Sim, isso é muito código. Não há funções de biblioteca para nos ajudar na linguagem assembly. Isso quase certamente pode ser otimizado ainda mais, mas eu me cansei de trabalhar nisso ...Depois que a saída é exibida, o código pode travar ou fazer o que for, então limpamos as interrupções e interrompemos a CPU.
fonte
INT 3
e acabo imediatamente de volta à instrução a seguir, então apenas o segui. Talvez tenha algo a ver com o meu ambiente de teste?CLI
desabilitaria apenas as interrupções de hardware, mas, mesmoHLT
que passasse, você pensaria que ele passaria e executaria o códigol
imediatamente depois.Python 2 por TwiNight
Experimente online!
fonte
Python 3 , o segundo desafio de ppperry
Uau, isso foi divertido! Eu gostei de resolver isso.
Edit: OK, eu consertei. Parece que as classes estavam com um índice diferente na lista de subclasses no TIO e no meu computador, então eu fiz o trabalho para ambos e adicionei um TIO.
Experimente online!
fonte
sys.excepthook is missing
?sys.excepthook
, mas haverá uma causa real listado em algum lugar lá.)IndexError('list index out of range',)
. Está na linha com a definição de_io_RawIOBase
._io_IOBase = [cls for cls in object.__subclasses__() if cls.__name__ == '_IOBase'][0]
deve funcionar em qualquer lugar.Haskell por zbw
Não é possível executar o código em tempo de execução? Execute-o em tempo de compilação!
Foi muito divertido, eu não conhecia o modelo haskell antes desse desafio.
fonte
Geléia por hiper neutrino
Super simples. A nova linha faz com que o primeiro link não seja chamado.
Experimente online!
fonte
Python 2 por Wheat Wizard
Experimente online!
fonte
Java por LordFarquaad
Bloquear o acesso aos objetos no nível de origem foi realmente inteligente (e irritante ao testar), muito bem!
fonte
ClassLoader
tivesse sido sombreado?"".getClass().getClassLoader()
. A sombra é geralmente apenas um problema em que você deve pensar uma vez e tudo bem. Você pode até sombraObject
, eu ainda seria capaz de resolver isso. Ok, você pode me forçar a usar a solução de 1kb, mas é possível.Ruby por histocrat
Experimente online!
fonte
Inform 7, de Ilmari Karonen
Abuso flagrante de substantivos ambíguos ... Meu código começa com
factory is a room
. A linha anterior é o código do policial. Digiteadd 1 and 1
para obter 2, por exemplo.fonte
Java, Roman Gräf
Conjuntos
stdout
estderr
volta aos seus valores iniciais.Acredito que posso usar o nome completo em vez de uma importação, se estiver errado, corrija-me (esta é minha primeira postagem aqui.) Isso provavelmente poderia ser feito usando reflexão também.
Edit: aqui está uma solução reflexiva usando apenas
java.lang.reflect.*
:fonte
stdin
,stdout
estderr
são armazenados em outro lugar! Você nem precisa usarsetOut
e,setErr
como você pode simplesmente usarPrintStream
diretamente.JavaScript por Daniel Franklin
Isso pode ser considerado uma solução um pouco barata, mas funciona para mim no Chromium 59 / Linux, mesmo se eu também receber um aviso dizendo:
Ps. Aqui está outra rachadura, desta vez sem avisos:
fonte
prompt()- -prompt()
salva dois bytesJava 8 por Olivier Grégoire
Uma rachadura extremamente detalhada para um desafio extremamente detalhado. :) A dor de trabalhar indiretamente com classes que você não pode nomear é palpável.
Experimente online!
Ps. Aqui está minha tentativa anterior, escrita antes de Olivier esclarecer que a entrada deveria ser obtida por meio de argumentos da linha de comando. Ao contrário do crack acima, este não é específico do Linux.
Experimente online!
fonte
String[] args = ((String) system.getMethod("getProperty", String.class).invoke(null, "sun.java.command")).split(" ");
que não é específica do Linux, mas usa o que parece ser uma propriedade não documentada definida por algumas JVMs.C # (.NET Core) por raznagul
Presumo que essa não foi a solução pretendida.
fonte
/dev/std*
lá. Inicialmente, eu visava uma abordagem semelhante, mas não conseguia encontrar uma maneira fácil de abrir fluxos para stdin / out sem acesso ao System.Console, então optei pela reflexão. Obviamente, sua solução provavelmente só funciona no Linux e em outros sistemas Unixish com as/dev
entradas apropriadas , mas o raznagul não disse explicitamente que precisava trabalhar no Windows. E funciona no TIO.Java, por racer290
Este foi um aspecto básico de que os
static
inicializadores são chamados antes domain
método. Foi uma boa tentativa: fiquei desanimado com othrow new Error()
começo, mas encontrei o caminho no final;)fonte
System.out.println("Hello World!");
Não adiciona dois números inteiros? .. " 2. Um trecho de código que recebe dois números como entrada, os soma e gera sua soma. Esse trecho ainda deve funcionar corretamente mesmo após a execução do primeiro trecho. Quando os dois trechos são combinados juntos, eles devem formar um programa completo que adiciona dois números, ou definir uma função que adiciona dois números Este trecho provavelmente vai depender de comportamento obscuro, e ser difícil de encontrar.. "Java por Kevin Cruijssen
Bem construído. Muito código para fazer alguém refletir adequadamente sobre como resolver esse desafio. Eu acho que o "coloque seu código depois" foi uma dica muito grande.
Experimente aqui.
fonte
JavaScript por Grant Davis
Funciona no console JS da
about:blank
página (conforme especificado na publicação da polícia) no Chromium 59 / Linux.fonte
cQuents , passo Hen , 3 bytes
Experimente online!
Conversou muito com Step Hen para descobrir como diabos sua linguagem estranha funciona, mas em resumo:
O código dele era
#|1,1:A
.#|1,1
é a entrada padrão, ou seja, qualquer entrada fornecida ao programa é anexada por 2 1s. (Ou seja, se você passar um 47 e um 53, sua entrada é[47, 53, 1, 1]
.:
simplesmente define o modo, que produzirá on
th item na sequência, sen
estiver definido, e produzirá a sequência inteira.Finalmente
A
obtém a primeira entrada.Como temos 4 entradas
[47, 53, 1, 1]
, adicionarBC
ao final também buscará a 2ª e a 3ª entrada, e a quarta entrada implicitamente se tornarán
.Porque a nossa sequência é
ABC
, é analisada algebricamente, o que significa que se tornaA*B*C
. Não queremos isso, mas se inserirmos um+
entre A e B, torna-seA+B*C
, ondeA
eB
são nossas entradas, eC
é 1.fonte
how the hell his weird language works
talvez uma vez eu terminá-lo poderia fazer mais algum sentidoC # (.NET Core) por raznagul
Experimente online!
Provavelmente isso levaria menos tempo se eu realmente conhecesse C #. No entanto, com alguma navegação na documentação e um pouco de ajuda de Jon Skeet , consegui juntar algo que funcionasse.
fonte
Vim challenge por @DJMcMayhem
Já faz um tempo desde que não consegui sair do vim , eis a minha solução (observe que é muito mais que
23
bytes - portanto, provavelmente não é a solução pretendida):Experimente online!
A idéia é simplesmente canalizar os dois números inteiros para
awk
viabash
, uma vez que,=
e+
foram desativados, tive que usar uma pequena solução alternativa. Aawk
linha se expande para:Editar : A intenção original era que a entrada já estivesse no buffer, mas isso não seria mais difícil - a principal dificuldade era fazer a adição funcionar.
Aqui está a correção sugerida por @DJMcMayhem: Experimente online!
fonte
[insert your number here]
no modo de inserção. Em vez disso, ele já está no buffer. Mas você pode contornar issoOecho "<esc>Go"|awk...
, então acho que isso conta. Bem feito! Esta não é a rachadura que eu tinha em mente (eu esperava uma resposta pura do vim), então provavelmente postarei uma nova resposta que corrige comandos externos e!
.Java 7 por Poke
Experimente online!
Não são necessários truques específicos do Linux, apenas mascaramento simples de nomes não qualificados
String
e deSystem
classe. Provavelmente, essa não é a solução pretendida, mas funciona.fonte
GolfScript por Ilmari Karonen
Experimente online!
fonte
RProgN2 por @ATaco
Experimente online!
Essa não é, de longe, a melhor resposta que eu poderia ter dado, mas permite adicionar números novamente. Se eu tivesse feito o manuseio adequado da pilha, provavelmente poderia jogar um pouco de golfe, mas a partir de agora estou feliz com a resposta.
No post original do ATaco, ele efetivamente acabou de reatribuir todos os principais operadores aritméticos para destruir suas entradas. Para corrigir esse problema, redefini o que era adição em termos de operações binárias, o que foi uma dor porque o RProgN2 não possui um operador de negação binária ou xor.
Nota: Se você deseja testar a entrada, os números com mais de um dígito precisam estar no formato
"XX..." n
para serem convertidos em um número real, já que o RProgN2 assume cada caractere como está, a menos que seja um conceito ou sequência. Edit: @ATaco observou que adicionar um '$' antes de um número de vários dígitos fará a mesma coisa.EDIT: Aqui está a lógica da minha solução. Como você pode ver, definitivamente não é o código mais refinado, mas funciona.
fonte
56$46$12
vai empurrar os números 5, 6, 46 e 12. Vou postar minha solução real e tal tommorowJavaScript (Node.js) por jrich , 298 bytes
Sinto que essa não é a solução pretendida, mas se for, bem feito, passei um tempo tentando descobrir como obter o nome da função declarada! :)
Experimente online!
fonte