Code Bilard (Levenshtein golf)

24

Musisz używać jednego języka do pisania programów, które wykonują dziewięć następujących zadań, w dowolnej kolejności .

  • Konwertuj wprowadzoną liczbę z bazy 10 na bazę 36.
    • Przykładowe dane wejściowe: 1000
    • Przykładowe dane wyjściowe: RS(dane wyjściowe muszą być pisane wielkimi literami)
  • Konwertuj każdy znak w ciągu na jego podstawowe 10 dziesiętnych kodów ASCII i drukuj kody połączone razem.
    • Przykładowe dane wejściowe: Scrambled 3GG5
    • Przykładowe dane wyjściowe: 839911497109981081011002051717153
  • Ustal, czy wprowadzona liczba jest podzielna przez 1738.
    • Zwróć prawdziwą wartość, jeśli tak jest, i wartość fałsz, jeśli nie jest.
  • Sprawdź, czy ciąg zawiera literę q.
    • Zwróć wartość prawdy, jeśli tak się dzieje, i wartość fałszowania, jeśli tak nie jest.
  • Zakoduj wprowadzony ciąg liter za pomocą szyfru Cezar +1.
    • Sprawa musi zostać zachowana. Znaki nieliterowe będą drukowane bez modyfikacji.
    • Przykładowe dane wejściowe: Good morning, World!
    • Przykładowe dane wyjściowe: Hppe npsojoh, Xpsme!
  • Znajdź i wydrukuj sumę czynników pierwszych liczby.
    • Przykładowe dane wejściowe: 1320
    • Przykładowe dane wyjściowe: 21
  • Drukuj PPCG.
  • Wydrukuj pierwsze ndodatnie liczby całkowite, które można podzielić floor(sqrt(n)).
    • n jest wprowadzoną liczbą całkowitą.
  • Zamień każdy oi Owprowadzony ciąg na .
    • Przykładowe dane wejściowe: Onomatopoeia
    • Przykładowe dane wyjściowe: ಠnಠmatಠpಠeia

Będziesz zauważyć, że to wyzwanie Code Billiards, nie Code Golf. Celem tego wyzwania, podobnie jak w grze bilardowej, jest skonfigurowanie kodu, aby można go było modyfikować tylko nieznacznie dla następnego wyzwania. Właśnie dlatego wasze programy nie muszą po kolei rozwiązywać powyższych zadań.

Twój wynik jest określany w następujący sposób

  • Twój wynik rośnie o 1każdy bajt w twoich programach.
  • Twój wynik rośnie, floor(n^(1.5))jeśli dwa kolejne programy mają odległość Levenshteina wynoszącą n. Na przykład, jeśli twoim pierwszym programem jest, potatoa drugim programem taters, twój wynik wzrasta o 12 dla 12 bajtów i przez 11= floor(5^(1.5))dla odległości Levenshteina 5.

Celem tego wyzwania jest uzyskanie jak najniższego wyniku po napisaniu wszystkich dziewięciu programów. Obowiązują standardowe zasady CG.


Aby zobaczyć tabelę wyników, kliknij „Pokaż fragment kodu”, przewiń w dół i kliknij „► Uruchom fragment kodu”. Snippet wykonany przez Optimizer.

Arktur
źródło
1
Whoa ... Dosłownie miałem DOKŁADNY ten sam pomysł na wyzwanie zeszłej nocy. Jak dziwne ...
ETHprodukcje
@ETHproductions Wpadłem także na ten pomysł zeszłej nocy i napisałem coś o tym na Sandbox. Czy twój pomysł pochodzi stamtąd? Jeśli nie, zbieg okoliczności jest naprawdę zabawny.
Arcturus,
1
Nie, wpadłem na ten pomysł, gdy szedłem spać. W ogóle nie widziałem Twojego postu! Sądzę, że jest to przykład „umysłu golfa
myślącego
Jaka jest odległość Levenshteina i a? Czy to 1 (licząc jako 1 znak) czy 2 (ponieważ tak naprawdę to 2 bajty)?
Jakube,
1
@Mego Oto szybszy algorytm. :) Być może tego nie widziałeś, ale w mojej odpowiedzi jest fragment, który automatycznie porządkuje programy w optymalnej kolejności i używa również superszybkiego algorytmu.
ETHprodukcje

Odpowiedzi:

8

Japt , 886 866 766 725 688 669

Zadania 5 i 6 to zabójcy. Być może istnieją krótsze sposoby ich realizacji. Myślę, że odległości Levenshteina można jeszcze zmniejszyć.

  • Zadanie 3 (podzielność): !(U%#ۊ
    7 bajtów (znak arabski zmienia wyrównanie)
  • Zadanie 4 (sprawdzenie „q”): U!=Uk'q7 bajtów, dist 11
  • Zadanie 1 (konwersja podstawowa): Us36 u6 bajtów, dist 14
  • Zadanie 2 (kody ASCII): UmX=>Xc7 bajtów, dist 14
  • Zadanie 7 (przekonaj się sam): "PPCG"6 bajtów, dist 18
  • Zadanie 9 (ಠ zamiana): Ur"[Oo]",'ಠ13 bajtów, dist 27
  • Zadanie 8 (piętro (sqrt (n))): X=Uq f;XoU*X+1,X16 bajtów, dist 52
  • Zadanie 6 (suma czynnika pierwszego): 2oU fX=>2oX eY=>X%Y &&!(U%X)r(X,Y =>X+Y39 bajtów, dist 172
  • Zadanie 5 (szyfr Cezara): UmX=>128o mY=>Yd)a k'A i#Z,'A k'a i#z,'a gXc44 bajty, dist 216

Oto fragment, który powie Ci (jeden z) najbardziej wydajnych sposobów aranżacji programów:

Dzięki najnowszej wersji Japt (nie konkuruje w tym wyzwaniu) większość zadań jest krótsza:

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

Optymalna kolejność wynosi teraz 2,4,3,1,6,7,9,8,5, osiągając niesamowity wynik 217 , mniej niż jedną trzecią oryginału!

Sugestie mile widziane!

ETHprodukcje
źródło
7

Pyth, ocena 489

Konwersja bazy: 15

s@L+s`MTrG1jQ36

Szyfr Cezara: 13 + 11 ^ 1,5

u.rGHrBG1z 36

Podzielny przez 1738: 7 + 11 ^ 1,5

!%Q1738

Pierwsze N ​​dodatnich liczb całkowitych: 8 + 8 ^ 1,5

*Rs@Q2SQ

Suma czynników pierwszych: 4 + 6 ^ 1,5

s{PQ

Wygląd q w ciągu: 4 + 4 ^ 1,5

}\qz

Połącz wszystkie kody ASCII: 5 + 4 ^ 1,5

jkCMz

Drukuj „PPCG”: 5 + 5 ^ 1,5

"PPCG

Zamień na : 9 + 7 ^ 1,5

Xz"oO"\ಠ
Jakube
źródło
3

Ruby, 1488

Prawdopodobnie jest tu dużo miejsca na ulepszenia. Większość czasu spędzałem na obliczaniu wyniku ...

Suma czynników pierwszych : 64
require'prime';p gets.to_i.prime_division.reduce(0){|s,a|s+a[0]}
Podstawa 36 : 30 + 47 1,5 = 352
puts gets.to_i.to_s(36).upcase
Podzielny przez 1738 : 22 + 15 1,5 = 80
puts gets.to_i%1738==0
Drukuj PPCG : 9 + 18 1,5 = 85
puts:PPCG
Czy ciąg zawiera q? : 10 + 8 1,5 = 32
p gets[?q]
Wymieńo : 23 + 16 1,5 = 87
puts gets.gsub(/o/i,?ಠ)
Szyfr Cezara : 32 + 21 1,5 = 128
puts gets.tr 'A-Za-z','B-ZAb-za'
Kody ASCII : 37 + 26 1,5 = 169
puts gets.chomp.chars.map(&:ord).join
Liczba całkowita podzielna przez pierwiastek kwadratowy : 72 + 56 1,5 = 491
puts *(1..1/0.0).lazy.select{|i|i%Math.sqrt(i).floor==0}.take(gets.to_i)
daniero
źródło
Możesz uzyskać poprawę, jeśli przekonwertujesz swoje programy na lambdas
Nie to, że Charles
3

Java, wynik 8331

Ich odległości levenshtein zabijają mój wynik tutaj.

(Te programy pobierają dane wejściowe jako argumenty wiersza poleceń)

Program 1 (119):

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

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

Program 3 (101 + 49 1,5 = 444):

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

Program 4 (108 + 20 1,5 = 197):

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

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

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

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

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

Program 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
źródło
3
To Java. Nie należy się spodziewać krótkiego wyniku ...;)
kirbyfan64sos,
interfejs l {static void main (String ...
Rohan Jhunjhunwala,
1

Pyth, wynik 817

numer 1: 24

Jjk+UTrG1VjKvz36=+k@JN;k

liczba 2: (9 + 16 1,5 = 73)

Vz=+kCN;k

liczba 3: (5 + 8 1,5 = 27)

/QC"ۊ

liczba 4: (5 + 14 1,5 = 57)

hxz\q

liczba 5: (39 + 37 1,5 = 264)

J+GrG1VzIhxJNKChCNIhxJKpK)EpC-CK26))EpN

liczba 6: (4 + 39 1,5 = 247)

s{PQ

liczba 7: (5 + 4 1,5 = 13)

"PPCG

liczba 8: (12 + 12 1,5 = 53)

VK/@Q2 1*KhN

liczba 9 (13 + 13 1,5 = 59)

j\ಠcj\ಠcz\o\O

Nie najlepiej, właśnie zacząłem dzisiaj uczyć się pytha i pomyślałem, że spróbuję, numer 5 naprawdę zabił mój wynik, myślę, że mogę uzyskać kilka z nich krótszych, ale to tylko zrani mnie bardziej na odległości. Wszelkie wskazówki od bardziej doświadczonych użytkowników pyta są mile widziane.

Phyxie
źródło
Liczba 6 naprawdę zabiła mój wynik. No cóż, liczby 5, 6 i 9.
SuperJedi224,
@ SuperJedi224 Możesz zmienić kolejność programów. Na przykład przełączenie tutaj 5 i 7 nieco obniży wynik.
Arcturus,
@Eridan Czekaj, możesz to zrobić? Chyba zrobię to dziś po południu.
SuperJedi224,
@ SuperJedi224 You must use one language to write programs that perform the following nine tasks, in any order.Powodzenia!
Arcturus,
3
5 + 14^1.5nie jest 19
Jakube,
-1

Python 3 (obecnie niepoprawny), 621 bajtów

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)

Niezbyt dobry kod, ale działa: D. Suma czynników pierwszych nie działa. Zawsze otrzymuję inny wynik niż twój przykład, więc go usunąłem. Również Python nie obsługuje znaku, więc zamiast tego zamienia os na 0s

INFORMACJE IO:

1. wejście: int w bazie 10 | Wyjście: ta liczba w bazie 36

Drugie wejście: ciąg | Wyjście: liczby Ascii ciągu

3. wejście: liczba całkowita | Wyjście: prawda lub fałsz, w zależności od tego, czy liczbę można podzielić przez 1738

Czwarte wejście: ciąg | Dane wyjściowe: T lub F, w zależności od tego, czy ciąg zawiera „q”

Piąte wejście: ciąg | Dane wyjściowe: Caser Cipher +1 ciągu

6: po prostu drukuje „PPCG” dosłownie

7. wejście: int n | Wyjście: pierwsze n ints podzielne przez piętro (sqrt (n))

8. wejście: ciąg | Wyjście: Zamieniono wszystkie os na 0 (nie na ಠ, ponieważ python nie obsługuje tej postaci, nie denerwuj się :))

Ciprum
źródło
O tak. Czy mógłbyś podać podstawowe wyjaśnienie dotyczące obliczania czynników pierwszych, ponieważ zawsze otrzymuję inny wynik niż ten z twojego przykładu.
Ciprum,
13
Witamy w Programowaniu zagadek i Code Golf! To nie do końca spełnia wymagania wyzwania, ponieważ wyzwanie wymaga innego programu dla każdego zadania. Ponadto musisz przestrzegać zasad punktacji dla tego wyzwania, szczególnie zwracając uwagę na funkcję odległości Levenshteina.
AdmBorkBork,
3
Python obsługuje ಠ, po prostu umieść au przed ciągiem. u "ಠ_ಠ" <- jak to
DJgamer98