Wydrukuj pierwsze 128 liczb pierwszych bez użycia słów zastrzeżonych

13

Oczywistym rozwiązaniem byłoby po prostu wydrukowanie ich jako łańcucha, ale czy można napisać krótszy kod?

Wymagania:

  1. Żadne dane wejściowe nie powinny być przetwarzane, a dane wyjściowe powinny mieć postać 2 3 5 7 11 13 ...itp.
  2. W ogóle nie są używane słowa zastrzeżone
  3. Język powinien przynajmniej umożliwiać programowanie strukturalne i mieć zarezerwowane słowa (w przeciwnym razie punkt 2 byłby dyskusyjny).

najpierw miałem na myśli wyłącznie C / C ++, ale rozszerzyłem to pytanie, wciąż próbując zapobiec oszustwom

vsz
źródło
1
Niestety dla mnie Tcl nie ma słów zastrzeżonych.
Johannes Kuhn,

Odpowiedzi:

14

C, 60 znaków

Ograniczenie „brak słów kluczowych” nie ma tutaj znaczenia. Jestem prawie pewien, że poprawa, jeśli to możliwe, nie zostanie dokonana przez dodanie słów kluczowych.

n=2;main(m){n<720&&main(m<2?printf("%d ",n),n:n%m?m-1:n++);}

Alternatywna wersja:
wynik nie jest tak fajny, ale lubię printfnadużycia.

n=2;main(m){n<720&&main(m<2?printf("%*d",n,n):n%m?m-1:n++);}

Sztuką w obu rozwiązaniach jest połączenie dwóch pętli (zaimplementowanych przez rekurencję) w jedną.
njest następną potencjalną liczbą pierwszą, mkolejnym potencjalnym dzielnikiem.
W każdym wywołaniu rekurencyjnym zwiększamy n(przy ustawieniu mdo poprzedniej wartości) lub zmniejszamy m.

ugoren
źródło
7

Python, 108 znaków

Python nie został stworzony do tego wyzwania. Chcesz print? To jest zarezerwowane. A może skorzystamy stdout? To będzie kosztować import... zgadłeś, zarezerwowane. Cóż ... Jestem na Uniksie, więc mogę otworzyć deskryptor pliku 1, który jest zwyczajny. Włamać się!

Człowiek i iteracja? Nic, tylko eval. Oczywiście żadnych pętli, ale nie możemy nawet zdefiniować funkcji za pomocą deflub lambda. Aby dodać obrażenia do obrażeń, nie możemy nawet korzystać ze zrozumienia listy! Zawsze szukam wymówki, by używać takich rzeczy jak map(p.__mod__,...)w golfie kodowym ... rozumienie jest zawsze lepsze. To znaczy do tej pory.

p=1
eval(compile("p+=1;open('/dev/fd/1','w').write('%s '%p*all(map(p.__mod__,range(2,p))));"*720,'','exec'))

Teraz można narzekać, że execjest to słowo kluczowe, choć nie użyć słowa kluczowego (I nawet nie ). Cóż, oto rozwiązanie 117 znaków, które nie używa .evalexec'exec'

p=2
s="eval('('+s*(p<720)+')',open('/dev/fd/1','w').write('%s '%p*all(map(p.__mod__,range(2,p)))),{'p':p+1})";eval(s)
boothby
źródło
1
print nie jest zarezerwowany w Python3 :) możesz go użyć __import__, ale będzie to kosztować znaki
gnibbler
6

JavaScript (80 znaków)

eval((s=Array(719)).join("s[j=++n]?j:"+s.join("s[j+=n]=")+"r+=n+' ';"),r="",n=1)

Uruchom w konsoli przeglądarki internetowej.

Zastosowano główne sito, które okazało się bardzo skondensowane.

Kopiuj
źródło
4

C, 183 znaków

#define q j*j<k?i%p[j++]||(i++,j=0):printf("%d\n",p[j=0,k++]=i++)
#define A q;q;q;q;q;q;q;q
#define B A;A;A;A;A;A;A;A
#define C B;B;B;B;B;B;B
main(){int i=2,j=0,k=0,p[999];C;C;C;C;C;}

Oto szybka pierwsza próba. Uważam, że powinno to spełniać wymagania. Korzystam z prostego podziału prób, aby znaleźć liczby pierwsze, i rozwiniętą pętlę zbudowaną za pomocą preprocesora, aby iterować, dopóki nie znajdę wystarczającej ich liczby. Poprawiono liczbę powtórzeń, aby wydrukować dokładnie 128 liczb pierwszych.

Ilmari Karonen
źródło
4

C, 87 znaków

d;p(n){--d<2||n%d&&p(n);}r(n){p(d=n);d<2&&printf("%d\n",n);++n<720&&r(n);}main(){r(2);}

(Próbowałem napisać to w bardziej funkcjonalnym stylu, ale moja niezdolność do użycia returnzabiła ten plan).

chlebak
źródło
3

C, 134 znaki

Oto alternatywne rozwiązanie, które stara się unikać używania słów tak często, jak to możliwe, zastrzeżone lub w inny sposób:

main(i){i<9?main(2953216):i>4097?--i&4094?i/4096%(i%4096)?main(i):
main((i/4096-1)*4097):printf("%d\n",i>>12,main((i/4096-1)*4097)):0;}

Wszystko to wykorzystuje to printfi mainza pomocą jednego argumentu.

chlebak
źródło
3

Mathematica 50 znaków

Nie jestem pewien, jak interpretować „zastrzeżone słowa” dla Mathematiki, ale chcę grać, więc wezmę to pod uwagę, że nie trzeba mieć wbudowanych funkcji generowania liczb pierwszych ani testowania pierwotności.

Fold[#2Cases[#/#2,1|_Rational]&,#,#]&@Range[2,719]
Mr.Wizard
źródło
2

Haskell, 72 znaki

main=putStrLn.unwords$take 128[show p|p<-[2..],all((>0).mod p)[2..p-1]]

Co prawda, unikanie słów kluczowych nie jest zbyt trudne w Haskell.

hammar
źródło