Cambiar el código, cambiar la secuencia: policías

27

Este es un desafío de . Para el hilo de los ladrones, ve aquí .

Este desafío involucra dos secuencias OEIS elegidas por los policías - S 1 , S 2 - y qué tan bien esas secuencias pueden ser golfizadas y ofuscadas.

El desafío de los policías

Su desafío como policía es elegir un idioma disponible libremente y dos secuencias OEIS. Luego, escriba el código A en ese lenguaje que toma la entrada n y produce S 1 (n). Cuando ese código se modifica por una distancia de Levenshtein de X caracteres (con X no más que 0.5 * (length A)), y se convierte en código B en el mismo lenguaje, entonces debe producir S 2 (n). En realidad, debe escribir este código B , pero no lo revele hasta que su desafío sea seguro (ver más abajo).

Las presentaciones de los policías deben incluir el nombre del idioma, el código completo A , el recuento de bytes de A , el valor X de cuántos cambios para llegar a su código secreto B y los números de secuencia S 1 y S 2 elegidos . Puede elegir si cada secuencia está indexada a 0 o indexada a 1, pero especifíquelo en su envío.

Para descifrar una presentación en particular, los ladrones deben idear un programa C en el mismo lenguaje (y versión) que produce S 2 (n) y si el carácter Y cambia de A (con Y <= X). Los ladrones no necesariamente necesitan encontrar exactamente el mismo código B que produjo el policía (en secreto).

Ganar y anotar

Si su respuesta de policía no se ha descifrado en 7 días (168 horas), puede revelar su propia solución B , momento en el cual su respuesta se considera segura. Siempre y cuando no reveles tu solución, los ladrones todavía pueden descifrarla, incluso si ya han pasado los 7 días. Si su respuesta se agrieta, indíquelo en el encabezado de su respuesta, junto con un enlace a la respuesta del ladrón correspondiente.

Los policías ganan al tener la presentación sin descifrar con la A más corta . Si está atado, entonces la X más pequeña se usará como desempate. Si aún está empatado, la presentación anterior ganará.

Reglas adicionales

  • No debe utilizar ninguna función integrada para generar hash, cifrado o generación de números aleatorios (incluso si coloca el generador de números aleatorios en un valor fijo).
  • Se permiten programas o funciones, pero el código no debe ser un fragmento y no debe asumir un entorno REPL.
  • Puede tomar entrada y dar salida en cualquier formato conveniente . Los métodos de entrada / salida deben ser los mismos para ambas secuencias.
  • La calculadora definitiva para la distancia de Levenshtein para este desafío es esta en Planet Calc.
  • Además de ser un desafío CnR, este es el por lo que se aplican todas las reglas habituales de golf.
AdmBorkBork
fuente
Además, asegúrese de que si cambia algo en esta pregunta, actualice la de los ladrones.
mbomb007
¿Qué pasa si un policía nombra una función / variable realmente grande con respecto al código real que genera la secuencia? Será posible crear cualquier secuencia en este caso con una distancia de lev menor(0.5*len(A))
hashcode55
@ hashcode55 Dos cosas: 1) no es probable que sea un buen candidato para ganar el hilo de la policía. 2) si es enorme así, también da un buen margen para que los ladrones lo quiebren.
AdmBorkBork
1
" este es el código de golf, por lo que se aplican todas las reglas habituales de golf ". ¿Significa esto que el código A debe ser golfizado tanto como sea posible, o puede escribirse intencionalmente de una manera demasiado detallada / incómoda para hacerlo más similar al código B ?
sonríe

Respuestas:

10

Brain-Flak , 28 bytes, Distancia de 4, A002817 , A090809 Agrietado

Esta respuesta usa indexación 1

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

Pruébalo en línea

Para cualquier persona interesada, hay 27475 programas válidos de Brain-Flak con Levenshtein distancia 4 de este programa y 27707 con distancia 4 o menos. Por lo tanto, una solución de fuerza bruta sería factible en una computadora de grado de consumo.

Asistente de trigo
fuente
Probablemente sería más corto y más rápido de leer si tienes en X = 4lugar de Levenshtein distance of 4.
mbomb007
1
@ mbomb007 Personalmente me confundo un poco cuando los desafíos usan un montón de variables de letras para representar cosas que estaba tratando de evitar confusiones. Lo he hecho más corto ahora, con suerte sin causar ninguna confusión.
Wheat Wizard
encogimiento de hombros . Si todos leen la pregunta, deberían obtenerla. Xes realmente la única variable que necesitan saber.
mbomb007
@ mbomb007 Aunque, la pregunta también pide un recuento de bytes.
DLosc
1
¡Agrietado!
DJMcMayhem
6

7 , 33 caracteres, 13 bytes, X = 10, A000124A000142 , Seguro

171720514057071616777023671335133

Pruébalo en línea!

La distancia de Levenshtein se mide en términos de caracteres, por lo que he escrito el programa en términos de los caracteres que contiene arriba (y ¡Pruébelo en línea!, Incluido el lenguaje en sí, se complace en ejecutar programas codificados en ASCII). Sin embargo, el programa se almacena en el disco utilizando la codificación de sub-byte de 7, lo que significa que el programa en sí es el siguiente hexdump (por lo tanto, 13 bytes de longitud):

00000000: 3cf4 2982 f1ce 3bfe 13dc b74b 7f         <.)...;....K.

(Debido a que la distancia de Levenshtein se mide en términos de caracteres, no necesariamente agrega / elimina / cambia 10 bytes aquí, por lo que probablemente sea mejor trabajar con el ASCII original).

El programa tal como está escrito implementa A000124 (números triangulares + 1); cualquier grieta debe implementar A000142 (factoriales). Ambos programas toman la entrada de stdin (como enteros decimales), escriben su salida en stdout y tratan una entrada de 1 como el primer elemento de la secuencia (y una entrada de 2 como el segundo elemento, etc.).

Con suerte, el valor X muy alto detendrá a las personas que fuerzan el programa, esta vez (que siempre es un riesgo con las entradas de policías y ladrones en 7).

La solución

177172051772664057074056167770236713351353

Pruébalo en línea!

Diferencias con el original:

17 172051 405707 1 61677702367133513 3
17 7 172051 77266 405707 405 61677702367133513 5 3

No tengo explicaciones preparadas sobre cómo funcionan, por lo que me llevará un tiempo obtener una explicación, ya que voy a tener que resolverlo casi desde cero. Esperemos que haya una explicación eventualmente.


fuente
4

Perl 6 , 10 bytes, X = 1, A000012A001477

¡Agrietado!

*[0]o 1***
  • S 1 = A000012 = 1,1,1,1,1,...= La secuencia de todos los 1. (0 indexado)

  • S 2 = A001477 = 0,1,2,3,4,...= Los enteros no negativos. (0 indexado)

Pruébalo en línea!

Confirmado para trabajar con la versión Perl 6 2017.01 , y con la versión Perl6 ejecutándose en TIO.

( A podría jugar más golf 1***, espero que también esté permitido como está).

smls
fuente
3

Perl 6 , 13 bytes, X = 1, A161680 A000217

¡Seguro!

{[+] [,] ^$_}
  • S 1 = A161680 = 0 0 1 3 6 10 15 21...= Cero seguido de los números triangulares.
  • S 2 = A000217 =0 1 3 6 10 15 21 28 ... = Los números triangulares.
  • Indexado a cero.

Pruébalo en línea!

(Confirmado para trabajar con la versión de Perl 6 que se ejecuta en TIO).

Solución

{[+] [\,] ^$_}

Cómo funciona el original:

{           }  # A lambda.
          $_   # Lambda argument.                     e.g. 4
         ^     # Range from 0 to n-1.                 e.g. 0, 1, 2, 3
     [,]       # Reduce with comma operator.          e.g. 0, 1, 2, 3
 [+]           # Reduce with addition operator.       e.g. 6

Cómo funciona la solución:

{            } # A lambda.
           $_  # Lambda argument.                     e.g. 4
          ^    # Range from 0 to n-1.                 e.g. 0, 1, 2, 3
     [\,]      # Triangle reduce with comma operator. e.g. (0), (0,1), (0,1,2), (0,1,2,3)
 [+]           # Reduce with addition operator.       e.g. 10

Explota el hecho de que los operadores numéricos como la suma tratan una lista como su número de elementos, por lo que en el ejemplo la suma es 1 + 2 + 3 + 4 = 10 .

Y sí, el no operativo "Reducir con operador de coma" en el original está un poco eludiendo las reglas del código de golf, pero prefiero verlo como un algoritmo tonto que se ha jugado tanto como sea posible (espacios en blanco, etc.) lo que es... :)

smls
fuente
Esto es suplicar ser forzado, si tuviera el tiempo o la inclinación (y el conocimiento de Perl).
Rohan Jhunjhunwala
Esto ha sobrevivido lo suficiente como para ser marcado como seguro
fəˈnɛtɪk
2

Gelatina , 11 bytes, X = 5, A005185A116881

ịḣ2S;
1Ç¡ḊḢ

Este es un programa completo que toma un número entero como argumento de línea de comando e imprime un número entero.

Ambas secuencias están indexadas como en OEIS, es decir, A005185 está indexado en 1 y A116881 está indexado en 0.

Pruébalo en línea!

Dennis
fuente
2

Javascript, 41 bytes, Distancia de 3, A061313 , A004526 , Agrietado

f=x=>{return x>1?x%2?f(x+1)+1:f(x/2)+1:0}

Pruébalo en línea

Utiliza 1 indexación basada, la solución utiliza 0 indexación basada.

Una vez más, una solución diferente ...

f=x=>{return x>1?x<2?f(x-1)+1:f(x-2)+1:0}
fəˈnɛtɪk
fuente
Agrietado.
Dennis
3
Por cierto, no deberías usar los enlaces permanentes tio.run . Dejarán de funcionar pronto.
Dennis
^ Utilice tio.run/nexus en su lugar.
mbomb007
1

Perl 6 , 19 bytes, X = 1, A000045A000035

¡Agrietado!

{(0,1,*+*...*)[$_]}
  • S 1 = A000045 = 0 1 1 2 3 5 8 13 21 34...= "Números de Fibonacci". ( 0 indexado )
  • S 2 = A000035 = 0 1 0 1 0 1 0 1 0 1...= "Período 2". ( 0 indexado )

Pruébalo en línea!

(Confirmado para trabajar con la versión de Perl 6 que se ejecuta en TIO).

smls
fuente
Agrietado.
Dennis
1

WolframAlpha, 18 bytes, X = 1

Agrietado por math_junkie!

(sum1to#of n^1)*2&

A veces, WolframAlpha podrá mostrar una función pura como esta en forma funcional (otras veces se confunde); pero se puede invocar alegremente con una entrada dada, por ejemplo, (sum1to#of n^1)*2&@5produce30 .

S1 = A002378 (números prónicos)

S2 = A000537 (suma de los primeros ncubos)

Ambas secuencias están indexadas a 0.

Greg Martin
fuente
¡Agrietado!
adicto a las matemáticas
1

Javascript, 15704 bytes, distancia de 2, A059841 y A000004 - descifrado

Esta solución es extremadamente larga, por lo que puede encontrar el código completo en este github gist.

La respuesta original (esta) es 1 indexada. (Sé que esto es demasiado tiempo, es solo por diversión).

Comunidad
fuente
Agrietada . Además, agregar código absolutamente inútil! + [] - (! + []) No está realmente en el espíritu de las reglas
fəˈnɛtɪk
Para que lo sepas, esta respuesta está causando algunos problemas para el OP de este desafío. Aparentemente hace que toda la página se bloquee porque parece JavaScript incompleto. ¿Podrías poner el código en un enlace externo? (Gist, pegado, etc.)
DJMcMayhem
En realidad, lo he puesto en una esencia yo mismo. Si prefiere tener el código en otro lugar, siéntase libre de editarlo nuevamente si he sobrepasado mis límites.
DJMcMayhem
Supongo que el! + [] - (! + []) Lo hace para que no puedas revertir la conversión. Pero parte de la otra basura solo lo hace más largo. El código equivalente es solo 15640 bytes.
fəˈnɛtɪk
0

Javascript, 30 bytes, Distancia de 4, A000290 , A000079 , - ¡Agrietado!

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

Indexación basada en 0

La solución de @Kritixi Lithos era realmente diferente a la mía

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

Pruébalo en línea

fəˈnɛtɪk
fuente
1
Esto es x**2y no2**x
Kritixi Lithos
Creo que es A000290 , no A000079.
betseg
@KritixiLithos se supone que son ambos. Cambié el enlace de secuencia incorrecta en la parte superior cuando cambié el otro extremo.
fəˈnɛtɪk
Agrietado
Kritixi Lithos
0

Javascript (ES6), la distancia es 1, A000079 y A000004 - descifrado

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

La respuesta original (esta) está basada en 0. Ahora que se ha descifrado, aquí está la función B original:

as=function(){ return 2*2**((1^1)*-1*~arguments[0]/11-(4-(as+[]).length%89))-(as+[]).length%7}
Comunidad
fuente
1
Pude hacer que mi crack codegolf.stackexchange.com/a/109976/64505 se comportara de manera inconsistente entre dos entornos diferentes.
fəˈnɛtɪk
0

Java 7, distancia de Levenshtein de 4, A094683 , A000290 , Agrietado

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;}

0 indexado.
Pruébalo aquí!

peech
fuente
@LliwTelracs hizo eso para los primeros 15 enteros no negativos, vea mi respuesta actualizada.
peech
Agrietado
fəˈnɛtɪk