Biorąc pod uwagę liczbę N , narysuj wyrównaną do lewej tablicę liczb N x N , pozostawiając 1 pustą (jako spację) (pokażę schematy z N = 5)
2 3 4 5
6 7 8 9 10
11 12 13 14 15
16 17 18 19 20
21 22 23 24 25
Twoim zadaniem jest krok po kroku zbudować sito Eratostenesa. Najpierw zacznij od 2. Jest liczbą pierwszą, więc zostaw ją tam i zastąp wszystkie pozostałe liczby podzielne przez 2 odpowiednią liczbą spacji.
2 3 5
7 9
11 13 15
17 19
21 23 25
Następnie przejdź do następnego niezadrukowanego numeru ( 3
w tym przypadku) i zrób to samo.
2 3 5
7
11 13
17 19
23 25
I tak dalej, aż dojdziesz N .
Najpierw musisz wydrukować całą siatkę i za każdym razem, gdy przejdziesz do nowego numeru, wydrukuj tablicę z usuniętymi wielokrotnościami. Upewnij się, że wydrukowałeś pustą linię pomiędzy!
Przykłady
Tekst w nawiasach służy ()
wyłącznie jako odniesienie, nie trzeba go drukować
N = 2:
2 (complete grid)
3 4
2 (remove multiples of 2)
3
N = 3:
2 3 (complete grid)
4 5 6
7 8 9
2 3 (remove multiples of 2)
5
7 9
2 3 (remove multiples of 3)
5
7
Pamiętaj, to jest kodowanie w golfa , więc wygrywa kod z najmniejszą liczbą bajtów.
N=10
,100
nie jest liczbą pierwszą, więc zostaną usunięte w pewnym momencie. Czy wszystkie liczby muszą być uzupełnione do 3 znaków, ponieważ100
mają 3 cyfry?Odpowiedzi:
Galaretka , 34 bajty
Wypróbuj online!
Jak to działa
źródło
Perl,
250243231202157 bajtówSprawdź aktualny golf online! (pamiętaj, aby uruchomić jako
perl -M5.010 main.pl
)Dwa dosłowne znaki nowej linii zapisują 1 bajt zamiast \ n.
Przykładowe dane wyjściowe (wejście 7):
Jestem pewien, że nie grałem zbyt dobrze w golfa, więc kiedy wrócę do domu, spojrzę na to jeszcze raz, aby zobaczyć, ile mogę się ogolić.
Edytuj 1: -7 bajtów (zmieniając „sprint wydruku” na oczywisty „printf”)
Edycja 2: Zapisano 12 bajtów, używając jawnie $ d w jednym miejscu, w którym został wywołany, zamiast tworzyć osobną zmienną, łącząc niektóre deklaracje i eliminując jeden z moich warunków dla
next
instrukcji wewnątrz pierwszejforeach
pętli, dodając spację gdzie indziej . Wyodrębniono dodatkowe 29 bajtów, przerabiając dwa pętle for w pojedynczą pętlę, eliminując dwie deklaracje zmienne i przekształcającunless
instrukcje w instrukcje if-not. Zadeklarowanie,my$e=$n*$n;
a następnie zastąpienie trzech instancji $ n * $ n przez $ e (pozwalając mi upuścić paren dla jednego z nich) okazało się, że daje ± 0 bajtów, ale i tak go zachowałem.Edycja 3: Dzięki @Dada wyodrębniono kolejne 40 bajtów (zmienne deklaracje, „foreach” staje się „for”, domyślnie $ _ w kilku lokalizacjach i ograniczenie wielkości instrukcji printf). Dodatkowy 1 bajt został ogolony przez przekształcenie
if!($c%$p||$c==$p||$p==1)
wif!($p~~[(1,$_)]||$_%$p)
. Niestety [] wokół tablicy jest konieczne, ponieważ operator smartmatch ~~ jest nadal eksperymentalny i wydaje się, że nie działa poprawnie na rzeczywistych tablicach, ale zamiast tego działa na odniesieniach do nich. 4 kolejne bajty zostały usunięte przez usunięcie dwóch średników i pustego zestawu znaków cudzysłowu po ostatnimsay
.źródło
my
). Użyj-p
flagi, aby miećN
wewnątrz$_
zamiast używać$n=<>
. Napiszfor
zamiastforeach
(ta instrukcja jest odpowiednikiem). Upuścić nawiasów wokół kondycjiif
, które znajdują się w pozycji oświadczenie modyfikatora (na przykładif!$c%$n
zamiastif(!$c%$n)
No nawias potrzebne do zainicjowania.@a
:@a=0..$e
. Można spaść dofor
zmiennej i$_
wiil być stosowany zamiast pisać.printf"%*s",1+length$e,$a[$c]
(Z `` sprintf` doc o szczegóły, które*
)$"
zamiast" "
.say""
zamiastprint"\n"
(masz literę nowego wiersza w kodzie, ale nie mogę tego napisać w komentarzu) (dodasz, aby dodać-M5.010
do wiersza poleceń, ale to się nie liczy w liczbie bajtów). Prawdopodobnie można użyć0..$e=$n*$n
do zapisania jednego bajtu przy inicjalizacji$e
. Spójrz na perlowe wskazówki dotyczące gry w golfa , zawiera wiele przydatnych wskazówek. Ale miło jest widzieć nowego golfisty Perla, witamy! :) (i wybaczam moje błędy ortograficzne, być może napisałem mój poprzedni komentarz zbyt szybko)if!$c%$n
,! operator ma pierwszeństwo przed operatorem%, więc technicznie byłoby toif((!$c)%$n)
fałszem dla czegoś innego niż $ c = 0 (czego nie chcę). Jeśli chodzi o inne wskazówki, zobaczę, co mogę zrobić! Dziękuję Ci bardzo!!
, że nie było mnie na komputerze, żeby to sprawdzić. Myślę, że powinieneś być w stanie sprowadzić do 160 znaków.PHP, 155 bajtów
@Crypto -3 Bytes Thank You @Titus -6 Bytes Thank You
Spróbuj
Pierwszy raz używam print w stanie po pętli
Awaria
Poprzednia wersja 174 bajtów
źródło
!($d<2||$a[$d]>0)
=>$d>1&&$a[$d]<1
$l=strlen($m)+1
do$l=log10($m)+2
$i=$d*$x=$d>1
zamiast$i=$d<2?0:$d
i$x
dla dwóch pozostałych przypadków$d>1
$n*$n>=$i+=$d
zamiast($i+=$d)<=$m=$n**2
i$n*$n
przy innym wystąpieniu$m
Groovy,
201195191 bajtówTo jest gromada absolutna ... Lewe wyrównanie zamordowało moją liczbę bajtów. Ale hej, to działa. Oto wynik dla 4:
Nie golfowany:
W pobliżu
źródło
Perl,
115114113112 bajtówObejmuje +1 dla
-a
Uruchom z numerem wejściowym na STDIN:
sieving.pl
:Potrzebuje wystarczająco niedawnego perla, aby to
-a
sugerowało-n
. Jeśli twój perl jest za stary, dodaj-n
opcję.Drukuje znak nowej linii, który jest dozwolony.
źródło
Python 2,
199 202201 bajtów+3 bajty (nie zatrzymywałem się wcześnie)
-1 bajt dzięki @Oliver (brakowało spacji)
repl.it
źródło
1
ifor
JavaScript (ES6),
190189 bajtówDrukuje bezpośrednio na konsoli.
Próbny
Pokaż fragment kodu
źródło
Partia, 464 bajty
To było trochę pracochłonne. Objaśnienie: Zaczyna od kwadratu,
n
dzięki czemu może obliczyć żądaną szerokość kolumnyc
i odpowiednią ilość wypełnieniap
za pomocą pętli:l
. Zewnętrzna pętla od1
don
następnie działa raz dla każdej siatki, wywołując podprogram:i
. Najpierw sprawdzana jest wartość, aby zobaczyć, czy jest to 1, czy liczba pierwsza; jeśli nie, to siatka jest pomijana. Wewnętrzna pętla od1
don*n
następnie obsługuje wiersze i kolumny siatki, wywołując podprogram:j
. Każda wartość jest sprawdzana, aby sprawdzić, czy jest to jedna z liczb pierwszych znalezionych do tej pory, czy też żadna z znalezionych liczb pierwszych nie dzieli jej. Jeśli tak, to wartość jest konkatenowana do bufora wyjściowego, który jest następnie dopełniany do pożądanej szerokości kolumny. Bufor jest drukowany i czyszczony w każdymn
wierszu, a na końcu siatki dodawany jest dodatkowy pusty wiersz. The:f
etykieta oznacza podprogram sprawdzający czynnik; f (x, y) dodaje 1 dof
każdej liczby całkowitej między 2 ix
która dzieliy
, wyłączający
siebie.źródło
R,
195191185204 bajtówDzięki @Billywob zaoszczędzono 6 dodatkowych bajtów!
Wcięte, z nowymi liniami:
Stosowanie:
źródło
^
jest jedynym, który nie jest wektoryzowany podczas generowania sekwencji za pomocą,:
co oznacza, że możesz użyć np.1:2^2
Do pobrania1 2 3 4
. Po drugie, jeśli zdefiniujesza=b=1:n^2
, możesz później użyćfor(j in b)
zamiast definiowania innego wektora do zapętlenia. Powinieneś zaoszczędzić kilka bajtów.J, 125 bajtów
Jest to wyraźne, nie milczące J, ale powinien istnieć sposób na milczenie w golfa.
Stosowanie
źródło
Mathematica, 133 bajty
źródło
PHP,
155150147145142140 bajtówawaria
źródło
$a[$i]="";
zamiastunset($a[$i]);
oszczędzać 4 bajty$i%$k<1
zamiast!($i%$k)
uratować jeden bajt