Роздрукуйте перші 128 простих чисел без використання зарезервованих слів


13

Очевидним рішенням було б просто надрукувати їх як рядок, але чи можна написати коротший код?

Вимоги:

  1. Вхід не повинен оброблятися, а вихід має бути у формі 2 3 5 7 11 13 ... тощо.
  2. Жодні застережені слова в мові взагалі не використовуються
  3. Мова повинна принаймні дозволяти структуроване програмування та мати зарезервовані слова (інакше пункт 2 буде суперечливим).

спершу я мав на увазі виключно C / C ++, але продовжив питання, намагаючись запобігти обман


1
На жаль, Tcl не має зарезервованих слів.
Йоханнес Кун

Відповіді:


14

C, 60 символів

Обмеження "без ключових слів" тут не має значення. Я майже впевнений, що покращення його, якщо можливо, не буде здійснено шляхом додавання ключових слів.

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

Альтернативна версія:
Вихід не такий гарний, але мені подобається printfзловживання.

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

Трюк в обох рішеннях полягає в об'єднанні двох циклів (реалізованих рекурсією) в одну.
nце наступний потенційний прайм, mнаступний подільник потенціалу.
У кожному рекурсивному виклику ми збільшуємо або приріст n(при встановленні mйого попереднього значення), або зменшення m.


7

Пітон, 108 символів

Python не був зроблений для цього виклику. Хочете print? Це зарезервовано. Ну, а як ми користуємось stdout? Ну, це коштуватимеimport ... ви здогадалися, зарезервовано. Ну ... я на unix, тому я можу відкрити дескриптор файлу 1, який буває stdout. Хак!

Людина, а ітерація? Нічого, але eval. Звичайно, немає циклів, але ми навіть не можемо визначити функцію за допомогою defабо lambda. І щоб додати образи до травми, ми навіть не можемо використати розуміння списку! Я завжди шукаю привід використовувати такі речі, як map(p.__mod__,...)у коді гольф ... розуміння завжди краще. Дотепер, тобто.

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

Тепер ви можете поскаржитися, що execце ключове слово, навіть якщо я не використовував ключове слово (я навіть не evalвикористовував exec). Ну, ось 117-символьне рішення, яке не використовується '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)

1
друк не зарезервований у Python3 :) ви можете використовувати __import__, але це коштуватиме символів
gnibbler

6

JavaScript (80 символів)

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

Запустіть консоль веб-браузера.

Використовували першочергове сито, яке виявилося дуже конденсованим.


4

C, 183 символів

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

Ну ось швидка перша спроба. Я вважаю, що це повинно відповідати вимогам. Я використовую простий пробний поділ, щоб знайти праймери та розкручений цикл, побудований за допомогою препроцесора, щоб повторити його, поки я не знайшов їх достатньо. Кількість повторень була перероблена, так що було надруковано рівно 128 прайменів.


4

C, 87 символів

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

(Я намагався написати це в більш функціональному стилі, але моя нездатність використовувати returnтакий вид вбитого цього плану.)


3

C, 134 символів

Ось альтернативне рішення, яке намагається уникати використання слів максимально, зарезервовано чи іншим способом:

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

Все, що він використовує, - printfі mainз одним аргументом.


3

Математика 50 символів

Я не впевнений, як інтерпретувати "зарезервовані слова" для Mathematica, але я хочу грати, тому я вважаю, що це робити без вбудованих функцій для генерації прайметів або тесту на первинність.

Fold[#2Cases[#/#2,1|_Rational]&,#,#]&@Range[2,719]

2

Хаскелл, 72 символи

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

Правда, уникнути ключових слів не дуже складно в Haskell.


Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.