Вывести первые 128 простых чисел без использования каких-либо зарезервированных слов


13

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

Требования:

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

Сначала я имел в виду исключительно C / C ++, но расширил вопрос, все еще пытаясь предотвратить мошенничество


1
К сожалению для меня, Tcl не имеет зарезервированных слов.
Йоханнес Кун

Ответы:


14

С, 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. Hack!

Человек, а итерации? Ничего, кроме 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
print не зарезервирован в 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

С, 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

Mathematica 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.