Billar de código (Levenshtein golf)

24

Debe usar un idioma para escribir programas que realicen las siguientes nueve tareas, en el orden que desee .

  • Convierta un número ingresado de base 10 a base 36.
    • Entrada de muestra: 1000
    • Salida de muestra: RS(la salida debe estar en mayúscula)
  • Convierta cada carácter en una cadena a sus códigos ASCII decimales de base 10 e imprima los códigos concatenados juntos.
    • Entrada de muestra: Scrambled 3GG5
    • Salida de muestra: 839911497109981081011002051717153
  • Determine si un número ingresado es divisible por 1738.
    • Devuelve un valor verdadero si es así y un valor falso si no lo es.
  • Determine si una cadena tiene la letra q.
    • Devuelve un valor verdadero si lo hace y un valor falso si no lo hace.
  • Codifique una cadena de letras ingresada con un cifrado César de +1.
    • El caso debe ser preservado. Los caracteres que no sean letras se imprimirán sin modificaciones.
    • Entrada de muestra: Good morning, World!
    • Salida de muestra: Hppe npsojoh, Xpsme!
  • Encuentra e imprime la suma de los factores primos de un número.
    • Entrada de muestra: 1320
    • Salida de muestra: 21
  • Imprimir PPCG.
  • Imprime los primeros nenteros positivos que son divisibles por floor(sqrt(n)).
    • n es un entero ingresado.
  • Reemplace cada oy Oen una cadena ingresada con .
    • Entrada de muestra: Onomatopoeia
    • Salida de muestra: ಠnಠmatಠpಠeia

Te habrás dado cuenta de que este desafío es Code Billiards, no Code Golf. El objetivo de este desafío, como en el billar, es configurar su código para que pueda modificarse solo ligeramente para el próximo desafío. Es por eso que sus programas no tienen que resolver las tareas anteriores en orden.

Su puntaje se determina de la siguiente manera

  • Su puntaje aumenta por 1cada byte en sus programas.
  • Su puntaje aumenta floor(n^(1.5))si dos programas consecutivos tienen una distancia de Levenshtein de n. Por ejemplo, si su primer programa es potatoy su segundo programa es taters, su puntaje aumenta en 12 por 12 bytes y por 11= floor(5^(1.5))para una distancia de Levenshtein de 5.

El objetivo de este desafío es tener el puntaje más bajo posible después de haber escrito los nueve programas. Se aplican las reglas estándar de CG.


Para ver la tabla de clasificación, haga clic en "Mostrar fragmento de código", desplácese hacia abajo y haga clic en "► Ejecutar fragmento de código". Fragmento hecho por Optimizer.

Arcturus
fuente
1
Whoa ... Literalmente tuve la misma EXACTA idea para un desafío anoche. Qué raro ...
ETHproductions
@ETHproductions Anoche también tuve la idea, y escribí algo al respecto en el Sandbox. ¿Tu idea surgió de allí? Si no, la coincidencia es realmente divertida.
Arcturus
1
No, tuve la idea cuando iba camino a la cama. ¡No vi tu publicación en absoluto! Supongo que este es un ejemplo de "las mentes del código de golf piensan igual";)
ETHproductions
¿Cuál es la distancia de Levenshtein y a? ¿Es 1 (contando como 1 char) o 2 (porque en realidad son 2 bytes)?
Jakube
1
@Mego Aquí hay un algoritmo más rápido. :) Además, es posible que no hayas visto esto, pero en mi respuesta hay un fragmento que organiza automáticamente los programas en el orden óptimo, y también utiliza el algoritmo súper rápido.
ETHproductions

Respuestas:

8

Japt , 886 866 766 725 688 669

Las tareas 5 y 6 son asesinas. Quizás hay formas más cortas de hacerlas. Creo que las distancias de Levenshtein también podrían reducirse también.

  • Tarea 3 (divisibilidad): !(U%#ۊ
    7 bytes (el carácter árabe desordena la alineación)
  • Tarea 4 (verificación 'q'): U!=Uk'q7 bytes, dist 11
  • Tarea 1 (conversión base): Us36 u6 bytes, dist 14
  • Tarea 2 (códigos ASCII): UmX=>Xc7 bytes, dist 14
  • Tarea 7 (compruébelo usted mismo): "PPCG"6 bytes, dist 18
  • Tarea 9 (ಠ reemplazo): Ur"[Oo]",'ಠ13 bytes, dist 27
  • Tarea 8 (piso (sqrt (n))): X=Uq f;XoU*X+1,X16 bytes, dist 52
  • Tarea 6 (suma de factores primos): 2oU fX=>2oX eY=>X%Y &&!(U%X)r(X,Y =>X+Y39 bytes, dist 172
  • Tarea 5 (cifrado César): UmX=>128o mY=>Yd)a k'A i#Z,'A k'a i#z,'a gXc44 bytes, dist 216

Aquí hay un fragmento que le indicará (una de) las formas más eficientes de organizar sus programas:

Con la última versión de Japt (que no compite en este desafío), la mayoría de las tareas se acortan:

  • Tarea 1: s36 u5 bytes
  • Tarea 2: mc2 bytes
  • Tarea 3: v#ۊ
    4 bytes
  • Tarea 4: oq2 bytes
  • Tarea 5: ;B±B+C²UrF,@Bg1+BbX19 bytes
  • Tarea 6: k â x5 bytes
  • Tarea 7: "PPCG5 bytes
  • Tarea 8: B=U¬f)oU*B+1B13 bytes
  • Tarea 9: ro'ಠ'i6 bytes

¡El orden óptimo ahora es 2,4,3,1,6,7,9,8,5, llegando a un puntaje enorme de 217 , menos de un tercio del original!

Sugerencias bienvenidas!

ETHproducciones
fuente
7

Pyth, puntuación 489

Conversión de la base: 15

s@L+s`MTrG1jQ36

Cifrado César: 13 + 11 ^ 1.5

u.rGHrBG1z 36

Divisible por 1738: 7 + 11 ^ 1.5

!%Q1738

Primeros N enteros positivos: 8 + 8 ^ 1.5

*Rs@Q2SQ

Suma de factores primos: 4 + 6 ^ 1.5

s{PQ

Apariencia de q en cadena: 4 + 4 ^ 1.5

}\qz

Únete a todos los códigos ASCII: 5 + 4 ^ 1.5

jkCMz

Imprimir "PPCG": 5 + 5 ^ 1.5

"PPCG

Reemplazar con : 9 + 7 ^ 1.5

Xz"oO"\ಠ
Jakube
fuente
3

Rubí, 1488

Probablemente hay mucho margen de mejora aquí. Pasé la mayor parte del tiempo calculando la puntuación ...

Suma de factores primos : 64
require'prime';p gets.to_i.prime_division.reduce(0){|s,a|s+a[0]}
Base 36 : 30 + 47 1.5 = 352
puts gets.to_i.to_s(36).upcase
Divisible por 1738 : 22 + 15 1.5 = 80
puts gets.to_i%1738==0
Imprimir PPCG : 9 + 18 1.5 = 85
puts:PPCG
¿La cadena contiene q? : 10 + 8 1.5 = 32
p gets[?q]
Reemplazaro : 23 + 16 1.5 = 87
puts gets.gsub(/o/i,?ಠ)
Cifrado César : 32 + 21 1.5 = 128
puts gets.tr 'A-Za-z','B-ZAb-za'
Códigos ASCII : 37 + 26 1.5 = 169
puts gets.chomp.chars.map(&:ord).join
Enteros divisibles por raíz cuadrada : 72 + 56 1.5 = 491
puts *(1..1/0.0).lazy.select{|i|i%Math.sqrt(i).floor==0}.take(gets.to_i)
daniero
fuente
Puede obtener una mejora si convierte sus programas a lambdas
No es que Charles el
3

Java, puntaje 8331

Las distancias levenshtein están matando mi puntuación aquí.

(Estos programas toman la entrada como argumentos de línea de comando)

Programa 1 (119):

class L{public static void main(String[]a){System.out.print(Integer.toString(Integer.parseInt(a[0]),36).toUpperCase());}}

Programa 2 (120 + 56 1.5 = 539):

class L{public static void main(String[]a){/*System.out.print*/for(char b:a[0].toCharArray())System.out.print((int)b);}}

Programa 3 (101 + 49 1.5 = 444):

class L{public static void main(String[]a){System.out.print/*for*/(Integer.parseInt(a[0])%1738==0);}}

Programa 4 (108 + 20 1.5 = 197):

class L{public static void main(String[]a){System.out.print(/*forInteger.parseInt(*/a[0].indexOf('q')>=0);}}

Programa 5 (186 + 107 1.5 = 1293):

class L{public static void main(String[]a){for(char b:a[0].toCharArray())System.out.print(Character.isLetter(b)?Character.isUpperCase(b)?b>'Y'?'A':(char)(b+1):b>'y'?'a':(char)(b+1):b);}}

Programa 6 (327 + 228 1.5 = 3747):

class L{public static void main(String[]a){int i,k=0,j=i=Integer.parseInt(a[0]);for(;i>0;i--)if(p(i)&&j%i==0)k+=i;System.out.print(k);}static boolean p(int n){if(n<2)return 0>0;if(n==2||n==3)return 1>0;if(n%2==0||n%3==0)return 0>0;int i,k=(int)Math.sqrt(n)+1;for(i=6;i<=k;i+=6)if(n%(i-1)==0||n%(i+1)==0)return 0>0;return 1>0;}}

Programa 7 (336 + 10 1.5 = 368)

class L{public static void main(String[]a){/*int i,k=0,j=i=Integer.parseInt(a[0]);for(;i>0;i--)if(p(i)&&j%i==0)k+=i;*/System.out.print("PPCG");}static boolean p(int n){if(n<2)return 0>0;if(n==2||n==3)return 1>0;if(n%2==0||n%3==0)return 0>0;int i,k=(int)Math.sqrt(n)+1;for(i=6;i<=k;i+=6)if(n%(i-1)==0||n%(i+1)==0)return 0>0;return 1>0;}}

Programa 8 (351 + 34 1.5 = 549):

class L{public static void main(String[]a){int i,k=1,j=(int)Math.sqrt(i=Integer.parseInt(a[0]));for(;k<i;k++)/*if(p(i)&&j%i==0)k+=i;*/System.out.println(j*k);}static boolean p(int n){if(n<2)return 0>0;if(n==2||n==3)return 1>0;if(n%2==0||n%3==0)return 0>0;int i,k=(int)Math.sqrt(n)+1;for(i=6;i<=k;i+=6)if(n%(i-1)==0||n%(i+1)==0)return 0>0;return 1>0;}}

Programa 9 (305 + 84 1.5 = 1075):

class L{public static void main(String[]a){int i,k=1,j=0;System.out.print(a[0].replaceAll("o|O",""+(char)3232));}static boolean p(int n){if(n<2)return 0>0;if(n==2||n==3)return 1>0;if(n%2==0||n%3==0)return 0>0;int i,k=(int)Math.sqrt(n)+1;for(i=6;i<=k;i+=6)if(n%(i-1)==0||n%(i+1)==0)return 0>0;return 1>0;}}
SuperJedi224
fuente
3
Es Java No debe esperar un puntaje corto ...;)
kirbyfan64sos
interface l {static void main (String ...
Rohan Jhunjhunwala
1

Pyth, puntaje 817

número 1:24

Jjk+UTrG1VjKvz36=+k@JN;k

número 2: (9 + 16 1.5 = 73)

Vz=+kCN;k

número 3: (5 + 8 1.5 = 27)

/QC"ۊ

número 4: (5 + 14 1.5 = 57)

hxz\q

número 5: (39 + 37 1.5 = 264)

J+GrG1VzIhxJNKChCNIhxJKpK)EpC-CK26))EpN

número 6: (4 + 39 1.5 = 247)

s{PQ

número 7: (5 + 4 1.5 = 13)

"PPCG

número 8: (12 + 12 1.5 = 53)

VK/@Q2 1*KhN

número 9 (13 + 13 1.5 = 59)

j\ಠcj\ಠcz\o\O

No es lo mejor, comencé a aprender pyth hoy y pensé en intentarlo, el número 5 realmente mató mi puntaje, creo que puedo acortar algunos de ellos, pero eso me hará más daño en las distancias. Se agradece cualquier consejo de usuarios de Pyth más experimentados.

Phyxie
fuente
El número 6 es lo que realmente mató mi puntaje. Bueno, los números 5, 6 y 9.
SuperJedi224
@ SuperJedi224 Puede cambiar el orden de los programas. Por ejemplo, cambiar 5 y 7 aquí reduciría un poco la puntuación.
Arcturus el
@Eridan Espera, ¿puedes hacer eso? Creo que lo haré esta tarde.
SuperJedi224
@ SuperJedi224 ¡ You must use one language to write programs that perform the following nine tasks, in any order.Buena suerte!
Arcturus
3
5 + 14^1.5no es 19
Jakube
-1

Python 3 (actualmente no válido), 621 bytes

from numpy import base_repr
import math
print(base_repr(int(input()),36))
print("".join([str(ord(c)) for c in input()]))
if int(input())%1738 == 0:print(True)
else:print(False)
if "q" in input().lower():print(True)
else:print(False)
t=bytes.maketrans(b"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ",b"bcdefghijklmnopqrstuvwxyzaBCDEFGHIJKLMNOPQRSTUVWXYZA")
print(input().encode("utf-8").translate(t).decode("utf-8"))
print("PPCG")
n=int(input())
for i in range(1,n):
    if i%math.floor(i**0.5)==0:print(i,end=" ")
print("")
y=input()
z=""
for i in y:
    if i.lower()=="o":z+="0"
    else:z+=i
print(z)

Realmente no es un buen código, pero de alguna manera funciona: D. La suma de los factores primos no funciona. Siempre obtengo un resultado diferente de su ejemplo, así que lo eliminé. Además, Python no admite el carácter, por lo que reemplaza el os con 0s

IO INFO:

Primera entrada: int en base 10 | Salida: ese número en la base 36

2da entrada: una cadena | Salida: números ASCII de la cadena

3ª entrada: entero | Salida: Verdadero o Falso dependiendo de si el número es divisible por 1738

4ta entrada: cadena | Salida: T o F dependiendo de si la cadena tiene "q"

5ta entrada: cadena | Salida: Caser Cipher +1 de la cadena

6to: simplemente imprime "PPCG" literalmente

7ma entrada: int n | Salida: primeros n ints divisibles por piso (sqrt (n))

8ª entrada: cadena | Salida: Reemplazó todas las os con 0 (no con ಠ porque python no admite ese carácter, no te enojes demasiado :))

Ciprum
fuente
Oh si. ¿Podría hacer una explicación básica del cálculo de los factores primos porque siempre obtengo un resultado diferente al de su ejemplo?
Ciprum
13
¡Bienvenido a Programming Puzzles y Code Golf! Esto no cumple con los requisitos del desafío ya que el desafío es solicitar un programa diferente para cada tarea. Además, deberá seguir las reglas de puntuación para este desafío, especialmente teniendo en cuenta la función de distancia de Levenshtein.
AdmBorkBork
3
Python admite ಠ, solo pon au delante de la cadena. u "ಠ_ಠ" <- así
DJgamer98