Code Billiards (Levenshtein golf)

24

Você deve usar um idioma para escrever programas que executem as nove tarefas a seguir, na ordem que desejar .

  • Converta um número inserido da base 10 para a base 36.
    • Entrada de amostra: 1000
    • Saída de amostra: RS(a saída deve estar em maiúsculas)
  • Converta cada caractere em uma seqüência de caracteres em seus códigos ASCII decimais de base 10 e imprima os códigos concatenados juntos.
    • Entrada de amostra: Scrambled 3GG5
    • Saída de amostra: 839911497109981081011002051717153
  • Determine se um número inserido é divisível até 1738.
    • Retorne um valor verdadeiro, se for, e um valor falso, se não for.
  • Determine se uma string tem a letra q.
    • Retorne um valor verdadeiro, se houver, e um valor falso, se não houver.
  • Codifique uma sequência de letras inserida com uma cifra de César de +1.
    • O caso deve ser preservado. Caracteres que não sejam letras serão impressos sem modificação.
    • Entrada de amostra: Good morning, World!
    • Saída de amostra: Hppe npsojoh, Xpsme!
  • Encontre e imprima a soma dos fatores primos de um número.
    • Entrada de amostra: 1320
    • Saída de amostra: 21
  • Imprimir PPCG.
  • Imprima os primeiros nnúmeros inteiros positivos que são divisíveis por floor(sqrt(n)).
    • n é um número inteiro inserido.
  • Substitua every oe Oem uma string inserida por .
    • Entrada de amostra: Onomatopoeia
    • Saída de amostra: ಠnಠmatಠpಠeia

Você deve ter notado que esse desafio Code Billiardsnão é Code Golf. O objetivo desse desafio, como no bilhar, é configurar seu código para que ele possa ser modificado apenas um pouco para o próximo desafio. É por isso que seus programas não precisam resolver as tarefas acima em ordem.

Sua pontuação é determinada da seguinte forma

  • Sua pontuação aumenta a 1cada byte em seus programas.
  • Sua pontuação aumenta floor(n^(1.5))se dois programas consecutivos tiverem uma distância de Levenshtein n. Por exemplo, se o seu primeiro programa é potatoe o segundo taters, sua pontuação aumenta 12 por 12 bytes e 11= = floor(5^(1.5))para uma distância de Levenshtein de 5.

O objetivo desse desafio é ter a menor pontuação possível depois que todos os nove programas tiverem sido escritos. Aplicam-se as regras padrão de CG.


Para ver a tabela de classificação, clique em "Mostrar trecho de código", role para baixo e clique em "► Executar trecho de código". Snippet criado pelo Optimizer.

Arcturus
fonte
11
Whoa ... Eu literalmente tive exatamente a mesma idéia para um desafio ontem à noite. Que estranho ...
ETHproductions
@ETHproductions Também recebi a ideia ontem à noite e escrevi algo sobre ela na Sandbox. A sua ideia veio daí? Caso contrário, a coincidência é realmente engraçada.
Arcturus
11
Não, tive a ideia enquanto estava a caminho da cama. Não viu sua postagem! Eu acho que este é um exemplo de "mentes code-golfe pensam da mesma forma";)
ETHproductions
Qual é a distância de Levenshtein e a? É 1 (contando como 1 caractere) ou 2 (porque na verdade são 2 bytes)?
21416 Jakarta
11
@ Mega Aqui está um algoritmo mais rápido. :) Além disso, você pode não ter visto isso, mas na minha resposta há um trecho que organiza automaticamente os programas na ordem ideal e também usa o algoritmo super-rápido.
ETHproductions

Respostas:

8

Japt , 886 866 766 725 688 669

As tarefas 5 e 6 são matadoras. Talvez haja maneiras mais curtas de fazê-las. Eu acho que as distâncias de Levenshtein ainda poderiam ser reduzidas também.

  • Tarefa 3 (divisibilidade): !(U%#ۊ
    7 bytes (caracteres árabes atrapalham o alinhamento)
  • Tarefa 4 (verificação 'q'): U!=Uk'q7 bytes, dist 11
  • Tarefa 1 (conversão de base): Us36 u6 bytes, dist 14
  • Tarefa 2 (códigos ASCII): UmX=>Xc7 bytes, dist 14
  • Tarefa 7 (veja você mesmo): "PPCG"6 bytes, dist 18
  • Tarefa 9 (ಠ substituição): Ur"[Oo]",'ಠ13 bytes, dist 27
  • Tarefa 8 (piso (sqrt (n))): X=Uq f;XoU*X+1,X16 bytes, distância 52
  • Tarefa 6 (soma dos fatores primos): 2oU fX=>2oX eY=>X%Y &&!(U%X)r(X,Y =>X+Y39 bytes, dist 172
  • Tarefa 5 (cifra de César): UmX=>128o mY=>Yd)a k'A i#Z,'A k'a i#z,'a gXc44 bytes, dist 216

Aqui está um trecho que mostra a você (uma) as maneiras mais eficientes de organizar seus programas:

Com o versão mais recente do Japt (não concorrente neste desafio), a maioria das tarefas fica mais curta:

  • Tarefa 1: s36 u5 bytes
  • Tarefa 2: mc 2 bytes
  • Tarefa 3: v#ۊ
    4 bytes
  • Tarefa 4: oq 2 bytes
  • Tarefa 5: ;B±B+C²UrF,@Bg1+BbX 19 bytes
  • Tarefa 6: k â x 5 bytes
  • Tarefa 7: "PPCG 5 bytes
  • Tarefa 8: B=U¬f)oU*B+1B 13 bytes
  • Tarefa 9: ro'ಠ'i 6 bytes

A ordem ideal agora é 2,4,3,1,6,7,9,8,5, chegando a uma pontuação gritante de 217 , menos de um terço do original!

Sugestões são bem-vindas!

ETHproductions
fonte
7

Pyth, pontuação 489

Conversão base: 15

s@L+s`MTrG1jQ36

Cifra de César: 13 + 11 ^ 1,5

u.rGHrBG1z 36

Divisível por 1738: 7 + 11 ^ 1,5

!%Q1738

Primeiros N números inteiros positivos: 8 + 8 ^ 1,5

*Rs@Q2SQ

Soma dos fatores primos: 4 + 6 ^ 1,5

s{PQ

Aparência de q na sequência: 4 + 4 ^ 1,5

}\qz

Junte-se a todos os códigos ASCII: 5 + 4 ^ 1,5

jkCMz

Imprimir "PPCG": 5 + 5 ^ 1,5

"PPCG

Substitua por : 9 + 7 ^ 1,5

Xz"oO"\ಠ
Jakube
fonte
3

Ruby, 1488

Provavelmente há muito espaço para melhorias aqui. Passava a maior parte do tempo calculando a pontuação ...

Soma dos fatores 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
Divisível por 1738 : 22 + 15 1,5 = 80
puts gets.to_i%1738==0
PPCG de impressão : 9 + 18 1,5 = 85
puts:PPCG
A string contém q? : 10 + 8 1,5 = 32
p gets[?q]
Substituao : 23 + 16 1,5 = 87
puts gets.gsub(/o/i,?ಠ)
Cifra de Ceasar : 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
Números inteiros divisíveis por raiz quadrada : 72 + 56 1,5 = 491
puts *(1..1/0.0).lazy.select{|i|i%Math.sqrt(i).floor==0}.take(gets.to_i)
daniero
fonte
Você pode obter uma melhoria se você converteu seus programas para lambdas
Não que Charles
3

Java, pontuação 8331

As distâncias levenshtein estão matando minha pontuação aqui.

(Esses programas recebem entrada como argumentos de linha 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
fonte
3
É Java. Você não deve esperar uma pontuação curta ...;)
kirbyfan64sos
interface l {static void main (String ...
Rohan Jhunjhunwala /
1

Pyth, pontuação 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

Não é o melhor, eu apenas comecei a aprender pitay hoje e pensei em tentar, o número 5 realmente matou minha pontuação, acho que posso diminuir alguns deles, mas isso só vai me machucar mais nas distâncias. Todas as dicas de usuários mais experientes de pyth são apreciadas.

Phyxie
fonte
Número 6 é o que realmente matou minha pontuação. Bem, números 5, 6, e 9.
SuperJedi224
@ SuperJedi224 Você pode alterar a ordem dos programas. Por exemplo, alternar 5 e 7 aqui reduziria um pouco a pontuação.
Arcturus
@ Eridan Espere, você pode fazer isso? Acho que vou fazer isso esta tarde.
SuperJedi224
@ SuperJedi224 You must use one language to write programs that perform the following nine tasks, in any order.Boa sorte!
Arcturus
3
5 + 14^1.5não é 19
Jakube 13/11/2015
-1

Python 3 (atualmente invá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)

Não é realmente esse código bom, mas funciona um pouco: D. A soma dos fatores primos não está funcionando. Eu sempre recebo um resultado diferente do seu exemplo, então o removi. O Python também não suporta o char , substituindo os opor 0s

IO INFO:

1ª entrada: int na base 10 | Saída: esse número na base 36

2ª entrada: uma string | Saída: números ASCII da string

Terceira entrada: inteiro | Saída: Verdadeiro ou Falso, dependendo do número ser divisível em 1738

4ª entrada: string | Saída: T ou F, dependendo da sequência de caracteres "q"

5ª entrada: string | Saída: Cifra Caser +1 da sequência

6: apenas imprime "PPCG" literalmente

7ª entrada: int n | Saída: primeiras n polegadas divisíveis por piso (sqrt (n))

8ª entrada: string | Saída: todos os substituídos por 0 (não por ಠ porque python não suporta esse caractere, não fique muito bravo :))

Ciprum
fonte
Oh sim. Você poderia, por favor, fazer uma explicação básica do cálculo dos fatores primos, porque eu sempre obtenho um resultado diferente daquele em seu exemplo.
Ciprum 12/11/2015
13
Bem-vindo à Programação de Puzzles e Code Golf! Isso não atende aos requisitos do desafio, pois o pedido está solicitando um programa diferente para cada tarefa. Além disso, você precisará seguir as regras de pontuação para esse desafio, principalmente a função de distância de Levenshtein.
AdmBorkBork
3
Python suporta ಠ, basta colocar au na frente da string. u "ಠ_ಠ" <- assim
DJgamer98 13/11/2015