Какой самый короткий способ вычислить n-е простое число?

Какой самый короткий C-код для "вычисления n-го простого числа"?

Наименьший с точки зрения значащих символов, то есть количества точек с запятой, непробельных символов, ключевых слов и запятых.

Входные данные:

Целые числа n от стандартного ввода, разделенные новыми строками. Ввод будет завершен EOF.

Выход:

Сразу после ввода n выведите n-е простое число в стандартный вывод, разделенный новыми строками.

(Вы можете предположить, что простые числа < 10000, то есть n <1230.)


Тестовые случаи:

Input:
    1
    2
    4
    8
    32
    999
    42
    5

Output:
    2
    3
    7
    19
    131
    7907
    181
    11

Моя попытка:

 #define m 10000
 a[m],b[m],x;

 main(i,j){
   for(i=2;i<m;i++)
      {
       if (!a[i])
       for (b[++x]=i,j=2*i;j<m;j+=i)
            a[j]=1;
      }
   for(;~scanf("%d",&i);printf("%d\n",b[i]));
  }

Для этой проблемы удобочитаемость не является проблемой. Более дорогой код с точки зрения времени и памяти, но удовлетворяющий ограничению, будет рассматриваться здесь лучше.

3 ответа

Mathematica: 13 символов

Prime@Input[]

Prime функция встроенная


Как ответ: 34 символа

While[0<(s=Input[]),Print@Prime@s]

или, выполняя ровно 10000 раз, в 29 символах:

Print@Prime@Input[]~Do~{1*^4}

C: 104 символа

i,t,n;g(){!--n?t=1:g();for(i=++t;1<--i;i=t%i?i:t++);}main(){for(;~scanf("%d",&n);g(),printf("%d\n",t));}

(И, конечно, он работает в экспоненциальном времени.)

(Кстати, ограничение до C скучно. Большинство code-golf здесь в наше время language-agnostic.)

Вот попытка в Python. Я не понял, что именно вы имели в виду в формате ввода, но это должно позаботиться о всех случаях. Кроме того, он ужасно медленный и занимает несколько секунд, чтобы сгенерировать простые числа, прежде чем он будет готов к обработке ввода. Странный синтаксический анализ ввода приводит к тому, что он начинает перетекать во все входные данные сразу, прежде чем начать производить вывод, поэтому вы должны ввести числа и завершить список EOF, а затем получить ответы сразу (или перенаправить ввод из файла).

import sys
p=[2]
for i in xrange(3,105000,2):
    if all(i%x for x in p):
        p.append(i)
print '\n'.join(str(p[int(i)-1]) for i in sys.stdin.read().split())

152 символа (с пробелами)

130 символов (без пробелов)

Другие вопросы по тегам