W tym wyzwaniu staramy się rozwiązać dwa ważne problemy jednocześnie. Oni są:
- Podane liczby całkowite i b , stwierdzić, czy b -1 jest liczbą pierwszą.
- Podane liczby całkowite i b , powrót NCR (a, b).
W szczególności musisz napisać dwa programy, jeden, który wykonuje pierwsze zadanie, a drugi, który wykonuje drugie. Ponieważ chcemy rozwiązać oba problemy jednocześnie, zaleca się użycie tego samego fragmentu kodu w obu programach.
Punktacja
Wynik odpowiedzi to odległość Levenshteina między dwoma programami. Niższy wynik jest lepszy. W przypadku remisu wygrywa odpowiedź z najkrótszym połączonym kodem dwóch programów. Możesz użyć tego skryptu, aby obliczyć wynik swojego rozwiązania.
Zasady
- Musisz napisać dwa programy w tym samym języku, które rozwiązują zadania opisane powyżej. Możesz użyć dowolnej metody we / wy. W przypadku zadania 1 możesz zwrócić wartość prawda / fałsz lub wybrać dwie wartości oznaczające prawda i fałsz i odpowiednio je zwrócić. Na przykład. możesz wybrać, co
"prime"
oznacza prawda, a"not prime"
fałsz. - Algorytmy, których używasz, muszą działać dla wszystkich możliwych danych wejściowych, ale jest to OK, jeśli kod zawiedzie w przypadku dużych liczb z powodu ograniczeń używanego typu liczb. Możesz założyć, że dane wejściowe są prawidłowe.
Żaden podzbiór programu nie może rozwiązać problemu, tj. kod nie może działać, jeśli zostaną usunięte jakiekolwiek znaki. Na przykład poniższy kod jest niepoprawny, ponieważ możliwe jest usunięcie nieużywanego bloku else bez uszkodzenia programu:
if (1) { /* change to 0 to get the second program*/ ... } else { ... }
Standardowe luki są niedozwolone.
Przypadki testowe
a b -1 jest liczbą pierwszą?
a b
1 1 false
2 3 true
5 2 false
2 5 true
4 3 false
2 7 true
nCr
a b nCr(a,b)
1 1 1
5 2 10
4 3 4
10 7 120
12 5 792
Odpowiedzi:
MATLAB, odległość 10
Pierwotność:
nCr:
źródło
PHP, odległość 29
a^b-1
wypisuje 0 dla wartości true i dowolną wartość całkowitą> 0 dla wartości falsenCr(a,b)
PHP, odległość 36
a^b-1
drukuje 1 za prawdę, nic za fałsznCr(a,b)
źródło
Rubin, Odległość 1, Łączna długość 194
Kontrola wstępna:
Wypróbuj online!
nCr:
Wypróbuj online!
Jak przewidziano w komentarzach, jakiś szarpnięcie zawsze musi być sprzeczne z duchem problemu. Fajnie było znaleźć sposób na obejście tego! Oto jak to działa: Mamy dwa osobne rozwiązania problemów. Uruchamiamy oba, umieszczamy je w tablicy, a następnie albo wybieramy 0-ty element, albo 1-ty, dla odległości edycji wynoszącej 1. Zwykle byłoby to nielegalne, ponieważ można było po prostu usunąć wszystko oprócz żądanych obliczeń i nadal działałoby . Jednak każdy fragment kodu jest pisany w taki sposób, aby polegał na ładowaniu tej samej biblioteki standardowej
'mathn'
:prime?
mathn
zmianie sposobu działania podziału - przed załadowaniem3/4
ocenia na0
, a następnie na ułamek(3/4)
. Ponieważ pośredni wynik(a+1-i)/i
nie zawsze jest liczbą całkowitą, ogólny wynik jest niepoprawny bez biblioteki.Teraz musimy tylko uzależnić ładowanie biblioteki od niezmodyfikowania reszty kodu. Robimy to, generując nazwę mathn przy użyciu długości znaków reszty głównego kodu: połączone obliczenia mają długość 55, która podwojona do 110 jest wartością ASCII „n”. Tak więc powiązanie tego z ciągiem „matematyka” daje pożądaną bibliotekę.
Jako bonus, wprowadzenie zależności biblioteki sprawia, że kod działa w rozsądnym czasie. W szczególności naiwne podejście do nCr nie wygenerowałoby ułamkowych wyników pośrednich.
źródło
05AB1E , odległość 3
nCr
Wypróbuj online!
isPrime (a ^ b-1)
Wypróbuj online!
źródło
Ułożone , odległość 13
Wypróbuj online! Pierwszy oblicza nCr, drugi pierwszeństwo, używając twierdzenia Wilsona.
(f g h) fork!
wyrzucaN
argumenty ze stosu (wywołuje jea0 ... aN
) i stosujea0 ... aN f a0 ... aN h g
.Dla pierwszego programu:
A po drugie:
źródło
Python 2 , dystans 15 , długość 172
Zadanie 1
Zadanie 2
Wypróbuj online!
źródło
Matematyka, odległość 10
Zadanie 1:
PrimeQ[#2^#-1]&
Zadanie 2:
Binomial[#2,#]&
Obie funkcje przyjmują dane wejściowe w kolejności
b,a
.źródło
JavaScript ES7, odległość 14
Dzięki @Conor O'Brien za zmniejszenie odległości o 7
Pierwotność:
Zwraca 1, jeśli liczba pierwsza zwraca 0, jeśli nie liczba pierwsza.
Niesamowicie nieefektywna kontrola pierwsza, sprawdza liczbę modulo każdej liczby mniejszej od niej i większej niż 1 ...
nCr:
Mnoży 1 przez każdą liczbę od y + 1 do x i dzieli przez każdą liczbę od 1 do xy (x! / Y!) / (Xy)!
źródło
f=x=>y=>{t=x+1;s=1;for(i=1;i<t;i++){if(y<i)s*=i/(i-y)}return s}
dystans edycji 14. Wypróbuj online!Oktawa, dystans
171615nCr
Wypróbuj online!
isprime(a^b-1)
Wypróbuj online!
Nie jestem zbyt biegły w Octave, więc nie wiem, czy jest wbudowane narzędzie do obliczania nCr.
źródło
MATL , dystans 4, długość 6
Powiedz, czy
a^b-1
jest liczbą pierwszą:Wypróbuj online!
Oblicz
nCr(a,b)
:Wypróbuj online!
Jak to działa
Powiedz, czy
a^b-1
jest liczbą pierwszą:Oblicz
nCr(a,b)
:źródło
Pyth, odległość 4, całkowita długość 8
Pierwszeństwo
a^b-1
Wypróbuj online!
nCr (a, b)
Wypróbuj online!
Oba przyjmują dane wejściowe jako krotki / listy liczb całkowitych (np
(1,2)
.).źródło
PHP, odległość 14
Napisanie programu z dwiema funkcjami i wywołanie tylko jednej z nich doprowadziłoby do odległości 1, ale byłoby zbyt kiepskie.
Test wstępny, 100 bajtów:
nCr, 98 bajtów:
źródło
Galaretka , odległość 4, długość 5
Zadanie 1
Zadanie 2
Wypróbuj online!
Jak to działa
Zadanie 1
Zadanie 2
źródło
JavaScript, wynik: 1, długość:
144142126117funkcja (a, b) {s = "a = Math.pow (a, b) -s.length + 79; for (b = 2; a% b ++;); b> a1for (t = s.length-79 ; b;) t = t * a - / b - "; return eval (s.split (1) [1])}Oba podprogramy używają długości drugiego do obliczania własnej stałej, więc nie można usunąć znakuźródło