Inversões Ocultas (Fio de Ladrão)


16

Este é um quebra cabeça de , o tópico dos policiais pode ser encontrado aqui.

Sua tarefa será encontrar um anagrama dos programas fornecidos no encadeamento da polícia que executa seu inverso esquerdo.

Depois de resolver uma resposta, publique a solução como resposta abaixo e notifique o atendedor original.

Você será pontuado no número de programas que você é o primeiro a quebrar.

Respostas:


21

Python 3, 46 bytes, Lynn

lambda x0223334566789:(x0223334566789*89)//178

Como "notifico o atendedor original"?
GB

Deixou um comentário vinculando sua resposta ao original
Sefa 16/01

Você deve soltar o f=no início do seu código, pois ele não é necessário e não faz parte da função original
0

Feito, eu apenas copiei e colei rápido demais.
GB

16
Aqui, na verdade, sou grosseiro forçando uma solução (e até supondo que exista uma) e você apenas evita todo o problema! 1
orlp 16/01/19

14

Python 2, 225 bytes, orlp

p=90930641353124136621573325641513715557077985927835294018496194596645372722158;q=101979812089012306249375934082966806799688507587087308196267706260111970225882#--223444799
lambda n:pow(n,pow(65537,(p*q-2*(p+q))/4,p*q),~p*~q)

Acho que tive sorte depois de adivinhar divisores primos aleatórios o dia todo ...

(O limite de ponto c4.8xlarge padrão é 4, mas eu consegui aumentá-lo para 10 no ano passado. Tive que ajustar a configuração do FAAS de 16 escravos para 6 embora (+3 mpi, 1 mestre). 25m linalg, 30m sqrt Custo total ~ $ 70. Pelo menos @orlp foi bom o suficiente para escolher um tamanho solucionável, mas não vou fazer isso de novo! Graças a @IlmariKaronen, para a última etapa, e sim, estou brincando sobre o adivinhação: P)


Eu ... o que ... Agora me sinto mal por lhe custar dinheiro :( Eu escolhi intencionalmente um tamanho que ainda seria razoavelmente pequeno, mas muito alto para atacar. Na verdade, eu não achava que alguém gastaria dinheiro com isso.
orlp 22/01

1
@orlp Vale totalmente a pena como uma experiência única para mim. Espero que as pessoas aprender algo sobre a segurança RSA de 512 bits em estado selvagem a partir deste :)
SP3000

Esta é uma verdadeira dedicação ao golfe, gastando não apenas tempo, mas dinheiro! Interessante notar que um invasor pode potencialmente quebrar o RSA de 512 bits gratuitamente por meio de avaliações de serviços de computação em nuvem.
miles

@miles Devo mencionar que a AWS tem crédito para os alunos se alguém quiser tentar, e eu não ficaria surpreso se outros serviços fizessem o mesmo. Portanto, você provavelmente não está muito longe dessa idéia de testes, pelo menos pela primeira vez. (Se alguém quiser tentar embora - certifique-se de eliminar todos os volumes, AMIs, etc. uma vez que você está feito porque senão você vai ser cobrado para armazenamento)
SP3000

11

Python 2, 83 bytes, orlp

Original:

#((()))****+,,---/2289;==oppppppqqqqqw~~
lambda n:pow(n,65537,10998167423251438693)

Rachadura:

p=3207399658;q=3428998126#--11
lambda n:pow(n,pow(65537,(p*q-2*(p+q))/4,p*q),~p*~q)

Experimente online!

Rachadura de RSA feita por Wolfram Alpha . ;)


Acabei de perceber que ~p*~qé mais curto do que -~p*-~q, oops.
precisa saber é

Como você fez a engenharia reversa da (p*q-2*(p+q))/4peça? :)
orlp 16/01

Essa foi a parte mais complicada, não foi? Basicamente, o conhecimento da função Carmichael eo fato de que p/2e q/2foram ambos primos ímpares, e um monte de tentativa e erro para encontrar algo que iria trabalhar usando os caracteres disponíveis.
Ilmari Karonen

Eu escolhi intencionalmente pe q(os reais, aquele no código são p-1e q-1para fins de golfe) tal que (p-1)/2é primordial para que possamos φ(φ(pq)) = ((p-1)/2-1)((q-1)/2-1). Isso nos permite calcular o inverso modular do 65537mod φ(pq)(o que precisamos para o RSA) usando a identidade de Euler, tornando a resposta muito mais curta, porque não precisamos implementar lógica inversa modular ou codificar outra constante grande. Além do -~q*-~p-> ~q*~p, você encontrou exatamente a minha função :)
orlp 16/01

1
Na verdade, para escolher um pouco menor, acredito φ(φ(pq)) = 2((p-1)/2-1)((q-1)/2-1)em números primos seguros pe q, porque φ(4) = 2. Mas λ(φ(pq)) = lcm(2, (p-1)/2-1, (q-1)/2-1)é, no máximo ((p-1)/2-1)((q-1)/2-1)/2, e qualquer múltiplo disso, menos um, servirá para o expoente. :)
Ilmari Karonen

7

Python 3, 80 bytes, Wolfram

from bisect import*
q=int(input())
print(bisect([(h+1)**2 for h in range(q)],q))

Isso foi realmente difícil de decifrar! Eu uso a biblioteca bisect , que está incluída na distribuição do Python 3. A bisectfunção pega uma lista classificada e um elemento e retorna o índice mais à direita onde o elemento pode ser inserido para manter a ordem. Apenas fornecemos a qlista de quadrados a partir de 1e o elemento q.


1
Eu sugeriria mudar (h+1)para -~h. Então eu percebi que esse não é o objetivo desse desafio: P
ETHproductions 20/01

@ETHproductions Isso estaria incorreto de qualquer maneira devido à precedência do operador.
Sp3000 21/01

@ Sp3000 Huh, eu não tinha ideia de que **tem maior precedência do que ~em Python. Suponho que seja melhor do que em JS, onde -~2**2gera um erro de sintaxe ("a expressão unária não parênteses é mostrada no lado esquerdo de '**'").
ETHproductions

@ETHproductions Eles realmente fez isso com ambigüidades EVITAR, que, como eu poderia acrescentar, é muito pouco característico da maioria de design JS.
Esolanging Fruit

@ Challenger5 Na verdade, eu teria que discordar de você: nos últimos anos, o TC39 foi extremamente cuidadoso para garantir que quaisquer novos recursos adicionados sejam o mais completamente possível de ambiguidades possível (o que inclui o **operador, adicionado no ES2017)
ETHproductions

6

Javascript, 21 bytes, Arnauld

Original

b=>Math.pow(b,torc=3)

Rachadura

o=>Math.cbrt(o,pbw=3)

Retorna a raiz do cubo.


Ai está! ;)
Arnauld

@ Arnauld: Acho um pouco estranho o JS permitir que você chame funções com mais argumentos do que eles estão definidos. Eu me pergunto qual é o pensamento por trás disso.
Emigna

6
Você está certo, o JS permite isso por design. Porém, argumentos extras não são completamente perdidos, pois são armazenados no objeto de argumentos que podem ser acessados ​​manualmente pela função.
Arnauld

5

7, 9 bytes, ais523

00000000: 0173 dc25 7e13 dcb6 1f                   .s.%~....

Porque a força bruta sempre vence e 9! é apenas 362880


4

Processing.js, 59 bytes, Kritixi Lithos

Original:

float igetuwebaoli(int p){return p*(((17*-4*-3)))+0+0;}//,,

Rachadura:

int loabewuteg(float p,i){return (i+0**+0,(p/17/(-4*-3)));}

Bem, isso foi fácil. A parte mais difícil foi descobrir onde colocar as vírgulas e asteriscos extras. Felizmente, parece que o Processing permite parâmetros de função extras não utilizados, bem como expressões de vírgula no estilo C.


1
Aparentemente, o intérprete que vinculei estava errado. De fato, a maioria (ou mesmo todos) os intérpretes online provavelmente estarão errados, pois o Processing-java é pré-compilado no Processing.js. No momento, acho que o melhor curso de ação seria para mim e para você alterar nossas respostas para "Processing.js" em vez de Processing, porque então sua resposta seria válida (Processing-java fornece muitos erros). Vou postar uma resposta separada com o mesmo código que Processing-java, mas, para isso, o intérprete de ninho seria instalá-lo a partir de processing.org. Bem feito de qualquer maneira!
Kritixi Lithos

4

JavaScript (ES6), 63 bytes, SLuck49

Original:

x=>eval(atob`eCp4KzEvLyAgfXBModLS4TvEn4wp1iys9YRRKC85KLIhNMC=`)

Rachadura:

x=>eval(atob`CgpNYXRoLnBvdyh4LTEsMC41KSAvLw4589CEIKKMRefipyz=`)

O código base64 acima decodifica para:



Math.pow(x-1,0.5) //...

onde ...significa um monte de lixo aleatório que é ignorado pelo interpretador JS, pois está em um comentário.

Encontrei esta solução por tentativa e erro. No final, a única parte realmente complicado foram as duas novas linhas no início do código, necessários para fazer a linha de resto corretamente e para obter o Mem Mathpara base64 codificar em algo que estava disponível no conjunto de caracteres originais. Tentei primeiro os espaços, mas " M"codificava o base64 "ICBN"e precisava do único disponível Bpara codificar ".po"posteriormente no código. "0+M", "1*M", "1?M"Ou quaisquer outros prefixos não-op semelhantes que eu poderia pensar não quer trabalhar, mas novas linhas fez.

Eu suspeito que isso pode não ser exatamente a solução pretendida, mas seja o que for - funciona. :)

Demo:

var f = x=>eval(atob`eCp4KzEvLyAgfXBModLS4TvEn4wp1iys9YRRKC85KLIhNMC=`)
var g = x=>eval(atob`CgpNYXRoLnBvdyh4LTEsMC41KSAvLw4589CEIKKMRefipyz=`)
for (var i = -0; i <= 10; i++) console.log(i, '->', f(i), '->', g(f(i)))


Bom trabalho encontrar algo que funcionou, eu esperava colocar os caracteres extras no início faria este um pouco mais difícil
SLuck49

Impressionante :) Fiz exatamente a mesma abordagem, mas não pensei em experimentar a nova linha. Eu estava tentando perder um C em outro lugar, mas estava chegando a lugar nenhum.
Chris M

3

Brain-Flak, 26 bytes, Assistente de Trigo

Original (adiciona 13)

((((()()())){}[()]){}{}{})

Rachadura (subtrai 13)

([(((()())()){}){}{}](){})

3

J, 8 bytes, milhas

[:]-:[+:

Troca simples de +:for -:(duplo para metade).


Além disso, você pode trocar os verbos esquerda e direita: [:[+:]-:.
randomra



3

JavaScript (ES6), 46 bytes, SLuck49

Original (calcula ln (x + 1))

x=>Math.log(x+(+String(t=985921996597669)[5]))

Rachadura

x=>Math[(lg=19979699+55686).toString(9+25)](x)

Eu nunca teria rachado isso se não tivesse percebido que o inverso é Mathembutido . (lg=19979699+55686).toString(9+25)é apenas uma maneira complicada de retornar "expm1".


Bem feito! Sim, eu estava examinando as funções do Math para decidir o que usar, vi expm1e disse: "Espere, isso é uma coisa?"
precisa saber é o seguinte

2

J, 10 bytes, milhas

1%:@*~>:[<

Eu tenho que escrever algo aqui porque a resposta é muito curta.


2

J, 29 bytes, Zgarb

Original

5#.[:,(3 5&#:(-$]-)7)#.inv"0]

Rachadura

[:(](07-5)"3 #.-:&#$,)5#.inv]

Experimente online!

Outro equivalente de crack é

[:((3 ]7-5)#.-:&#$,)5#.inv"0]

Explicação

[:(](07-5)"3 #.-:&#$,)5#.inv]  Input: integer n
                            ]  Get n
                      5        The constant 5
                       #.inv   Get the digits of n in base 5
[:(                  )         Operate on those digits D
                    ,            Flatten D (does nothing since it is already a list)
                  #              Get the length of D
               -:&               Halve it
                   $             Reshape D to half its length (only the base 2 digits)
    (07-5)"3                     The constant 2 with rank 3
             #.                  Convert the front-half of D to a decimal from base 2
   ]                             Return the right result

Sim, isso funciona! É um pouco diferente da minha solução, mas há muita margem de manobra. A lógica básica é a mesma.
Zgarb
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.