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.

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.


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.


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.


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!


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!


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




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)


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


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


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.


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
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.