Changer le code, changer la séquence: voleurs

15

C'est un défi de . Pour le fil des flics, allez ici .

Ce défi implique deux séquences OEIS choisies par les flics - S 1 , S 2 - et la façon dont ces séquences peuvent être jouées et masquées.

Les flics construisent le code A qui produit S 1 et donnent un nombre X qui, selon eux, est la meilleure distance Levenshtein possible (en caractères) pour créer B qui produit S 2 .

Le défi des voleurs

Pour casser la soumission d'un flic particulier, les voleurs doivent trouver un programme C dans le même langage (et la même version) que cette réponse qui produit S 2 (n) et le caractère Y change de A (avec Y <= X). Les voleurs n'ont pas nécessairement besoin de trouver exactement le même code B que le flic (secrètement) a produit. Les soumissions des voleurs doivent respecter le même indice 0 ou 1 que celui spécifié par la soumission du policier.

Si vous gérez cela, postez une réponse avec la solution, en vous liant à la réponse du policier et laissez un commentaire sur la réponse du policier en vous reliant à la vôtre.

Chaque réponse de flic ne peut être crackée qu'une seule fois, et bien sûr, vous n'êtes pas autorisé à cracker votre propre réponse. Si la réponse du policier s'avère invalide avant ou après avoir été piratée, elle n'est pas prise en compte dans le score du voleur.

Gagner et marquer

Les voleurs sont notés par (X - Y)*5 + 5pour chacune de leurs fissures, et le voleur avec le score global le plus élevé l'emporte.

Règles supplémentaires

  • Vous ne devez utiliser aucune fonction intégrée pour le hachage, le chiffrement ou la génération de nombres aléatoires (même si vous amorcez le générateur de nombres aléatoires sur une valeur fixe).
  • Les programmes ou les fonctions sont autorisés, mais le code ne doit pas être un extrait de code et vous ne devez pas assumer un environnement REPL.
  • Vous pouvez prendre des entrées et des sorties dans n'importe quel format pratique . Les méthodes d'entrée / sortie doivent être les mêmes pour les deux séquences.
  • La calculatrice définitive pour la distance de Levenshtein pour ce défi est celle-ci sur Planet Calc.
  • En plus d'être un défi CnR, il s'agit de donc toutes les règles de golf habituelles s'appliquent.
AdmBorkBork
la source

Réponses:

7

Pyke, Levenshtein distance de 1, A036487 , A135628 - score 5

Fissure d'une entrée par muddyfish

wX*e

Essayez-le ici!

Le code d' origine, X*e, carrés l'entrée, X, multiplie que par l'entrée *, et puis moitiés étages du résultat, e.

L'astuce est que 'X'56 est dans la représentation de base 96 w, donc wXdonne 56, multipliez cela par l'entrée puis le plancher et la moitié et vous obtenez 28 fois l'entrée selon les besoins.

Jonathan Allan
la source
Exactement ce que j'avais. A duré un peu plus longtemps que prévu
Blue
Dès que je l'ai vu, j'ai su que c'était la solution envisagée.
Jonathan Allan
4

Brain-Flak , 28 octets, Distance de 4, A002817 , A090809

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

Cette réponse a été découverte à l'aide d'un brutal-forcer, qui a généré 35000 programmes possibles (beaucoup d'entre eux étaient déséquilibrés, et donc un code de flak de cerveau invalide, mais j'ai roulé avec le bogue et trouvé la réponse de toute façon). C'était environ le 20 millième programme testé, et il m'a fallu environ une heure pour le trouver (même si je ne sais pas exactement combien de temps depuis mon absence quand il a terminé).

Je ne voulais pas encore publier cette réponse, car je n'ai pas encore une compréhension complète du fonctionnement de ce programme. Cependant, la réponse est sur le point d'être sûre, donc je ne veux pas qu'elle expire. J'espère mettre à jour cette réponse une fois que je la comprendrai parfaitement, ainsi que publier le code que j'ai utilisé pour trouver cette réponse. Mais pour l'instant, je vais juste poster une explication partielle.

#Push the sum of:
(

    #The (n-1)th triangular number, and the range [1, n] (The range doesn't count towards the sum I believe)
    ({(({})[()])}{})

    #Triangulate every number on the stack
    {{({}[()])}{}}

)

Cela est logique car OEIS déclare:

Pour n> 0, les termes de cette séquence sont liés à A000124 par a (n) = somme (i * A000124 (i), i = 0..n-1). [Bruno Berselli, 20 décembre 2013]

Et A000124 sont les nombres triangulaires + 1. Cependant, je ne sais pas exactement ce qu'est le forumla, donc je ne peux pas expliquer complètement comment cela fonctionne.

DJMcMayhem
la source
3

Perl 6, 19 octets, X = 1, A000045 → A000035

{(0,1,*+<*...*)[$_]}

+>à la place de +<fonctionnerait également.

Essayez-le en ligne!

Comment ça fonctionne

infix ... est très utile pour les séquences récursives simples. La (0,1,*+*...*)partie du code d'origine, qui est un raccourci pour

(0, 1, -> $x, $y { $x + $y } ... *)

spécifie une séquence qui commence par 0 et 1 , puis ajoute des éléments en calculant la somme des deux anciens éléments de la séquence.

En revanche, (0,1,*+<*...*)utilise le décalage binaire gauche ( +>, le décalage binaire droit fonctionnerait également) pour construire la séquence de parité. Puisque le décalage de 1 unité zéro vers la gauche est 1 , et le décalage de 0 une unité vers la gauche est 0 , nous obtenons les motifs alternés souhaités de uns et de zéros.

Dennis
la source
2

Perl 6 , 10 octets, distance 1 - score 5

Fissure d'une entrée par smls

*[0]o 1***

Devient:

*[0]o 1*+*

Essayez-le en ligne!

Jonathan Allan
la source
Bon travail! Je n'ai pas pensé à cette solution, la mienne était un peu plus délicate et exigeait en fait *[0]o d'être là. Je suppose que cela signifie que je peux trouver un autre défi basé sur mon "truc" ... :)
smls
Je ne connais pas vraiment Perl, je viens de voir ***et j'ai pensé qu'il pourrait se dérouler l'opération de multiplication dyadique *, avec les arguments précédents, je ne sais vraiment pas ce que fait réellement le code. N'hésitez pas à modifier certaines explications!
Jonathan Allan
2
1***est analysé comme 1 ** *, c'est-à-dire un lambda qui fait "1 à la puissance de x". 1*+*est analysé comme 1 * (+*), c'est-à-dire un lambda qui fait "1 multiplié par (x converti en nombre)".
smls
2

Perl 6 , distance 2, smls

Original:

+(*%%2)

Fissure:

+(*+0%2)

Essayez-le en ligne!

Joey Marianer
la source
Bon sang, encore une solution simple que je n'ai pas envisagée ... (La mienne était la plus obscure +(^*Z%2). Je suppose que je ne suis pas très douée pour rédiger ces défis.
smls
2

WolframAlpha, Distance 1, Greg Martin , A002378 , A000537

(sum1to#of n^1)^2&

Comment ça fonctionne

J'ai réalisé qu'intéressant, (n * (n + 1) / 2) ^ 2 est une formule pour la deuxième séquence. Puisque la somme (1 à n) est équivalente à n * (n + 1) / 2, je n'ai eu qu'à changer le * en a ^.

accro aux mathématiques
la source
Vous devez l'informer que vous avez craqué sa réponse
Post Rock Garf Hunter
Bien repéré! :)
Greg Martin
2

Brain-Flak , 20 octets, DJMcMayhem

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

Essayez-le en ligne!

Ajout d'un ({})au début de la boucle pour doubler la valeur à chaque itération.

Martin Ender
la source
Agréable! FWIW, la solution de 18 octets que j'avais était({(({}[()])){}}{})
DJMcMayhem
1

JavaScript, Distance 4, LliwTelracs

Original:

f=x=>{return x?2*x-1+f(x-1):0}

Fissure:

f=x=>{return x?2*(-0+f(x-1)):1}

Essayez-le en ligne!

Kritixi Lithos
la source
1

JavaScript (ES6), Distance 1, Advancid

Original:

as=function(){ return 2*2**((11)*-1*~arguments[0]/11-(4-(as+[]).length%89))-(as+[]).length%7}

Fissure:

as=function(){ return 0*2**((11)*-1*~arguments[0]/11-(4-(as+[]).length%89))-(as+[]).length%7}

Essayez-le en ligne!

ou

as=function(){ return 2*1**((11)*-1*~arguments[0]/11-(4-(as+[]).length%89))-(as+[]).length%7}

Essayez-le en ligne!

D'une manière ou d'une autre, j'ai pu le faire se comporter différemment entre TIO et repl.it (absolument aucune idée pourquoi 2 * 1 ^ ... serait égal à 0 comme selon repl.it)

fəˈnɛtɪk
la source
Je suis trop bête, je ne pensais pas à changer 2 à 0. Voici la fonction B: as=function(){ return 2*2**((1^1)*-1*~arguments[0]/11-(4-(as+[]).length%89))-(as+[]).length%7}.
1

Java, Distance 4, Peech , A094683 , A000290

Original:

int x{double r=1;for(int i=0;i<42;i++)r=r/2+n/r/2;int k=(int)((int)n*(float)n/Math.pow(n,(Math.sin(n)*Math.sin(n)+Math.cos(n)*Math.cos(n))/2));return n%4%2==(int)Math.log10(Math.E)/Math.log((double)'H'-'@')?(int)r:k;}

Fissure:

int x{double r=1;for(int i=0;i<42;i++)r=r/2+n/r/2;int k=(int)((int)n*(float)n/Math.pow(n,(Math.sin(n)*Math.sin(n)+Math.cos(n)*Math.cos(n))/2));return n%4%1==(int)Math.log10(Math.E)/Math.log((double)'H'-'@')?(int)n*n:k;}
                                                                                                                                                          ^                                                         ^^^

renvoie n * n

fəˈnɛtɪk
la source
1

Javascript, Advancid , distance de 2, A059841 et A000004

Ne laisser que le code derrière le lien TIO car il semble casser le site.

Merci à @nderscore, dont le code j'ai utilisé pour décrypter le code initial

Il y avait du code redondant comme l'utilisation de !! [] + [] + [] au lieu de !! [] + [].

L'ajout de! + [] - (! + []) (+ 1-1) a initialement empêché le déchiffrement.

Essayez-le en ligne

fəˈnɛtɪk
la source
1

Pyke, Levenshtein distance de 2, A008788, A007526

'SS^

Essayez-le ici!

Comment ça fonctionne

Cela fait une conversion de base mixte.

'Ssaisit l'entrée n et applique, en poussant [1, ..., n] sur la pile. Le suivant Sprend l'entrée n et pousse à nouveau le même tableau. 'semble provoquer l'application de la commande suivante au sommet précédent de la pile; Je suis un peu flou sur les détails.

Enfin, ^applique une conversion de base mixte, donc [1, ..., n] [1, ..., n] f calcule
a (n): = [1] n + n + (n) (n-1) .. . + [n!] 1 où les parenthèses indiquent la valeur de position et le nombre à leur droite le chiffre.

Maintenant, a (n) = (1 + (1) (n-1) + (n-1) (n-2) (n-3) + ... + (n-1)!) N = n ( a (n) + 1) , qui est la même formule récursive qui définit a (n) dans [A007526]. Comme une somme vide est nulle, a (0) = 0 et le cas de base correspond également.

Dennis
la source
Comment l'avez-vous obtenu avec si peu de tentatives? Je suis intéressé par vos processus de pensée
Blue
La conversion de base mixte est un tour de golf assez courant. Ce n'est pas la première fois que je l'utilise.
Dennis