Новый приказ № 3: 5 8 6


16

Введение (может быть проигнорировано)

Размещать все положительные числа в обычном порядке (1, 2, 3, ...) немного скучно, не правда ли? Итак, вот серия проблем, связанных с перестановками (перестановками) всех положительных чисел. Это третья задача в этой серии (ссылки на первую и вторую задачи).

В этой задаче мы упорядочим натуральные числа в строках возрастающей длины таким образом, чтобы сумма каждой строки была простым числом. Что меня действительно удивляет, так это то, что каждое натуральное число имеет место в этом расположении. Номера не пропущены!

Эта визуализация этого расположения выглядит следующим образом:

row             numbers             sum
1                  1                  1
2                2   3                5
3              4   5   8             17
4            6   7   9  15           37
5          10 11  12  13  21         67
6        14  16 17  18  19  23      107
etc.

Мы можем прочитать элементы из строк в этом треугольнике. Первые 20 элементов: 1, 2, 3, 4, 5, 8, 6 , 7, 9, 15, 10, 11, 12, 13, 21, 14, 16, 17, 18, 19 ( да, есть песня New Order, спрятанная в этой последовательности ).

Поскольку это задача «чистой последовательности», задача состоит в том, чтобы вывести a(N) для заданного N качестве входных данных, где a(N) равно A162371 .

задача

Для целочисленного ввода N выведите a(N) в целочисленном формате.

a(N) определяется какN й элемент самой ранней лексикографической перестановки натуральных чисел, такой, что при рассмотрении в виде треугольника, читаемого по строкам, при n> 1 суммы строк являются простыми числами. Поскольку первый лексикографическом перестановки натуральных чисел начинается с 1, ( 1 ) равно 1. Следует отметитьчто по этому определению а ( 1 ) = 1 и ( 1 ) являетсянеобязан быть простым. Это последовательность OEISA162371.a(1)a(1)знак равно1a(1)

Примечание: здесь предполагается индексирование на основе 1; Вы можете использовать индексирование на основе 0, поэтому a(0)знак равно1;a(1)знак равно2 и т. д. Пожалуйста, укажите это в своем ответе, если вы решите использовать это.

Контрольные примеры

Input | Output
---------------
1     |  1
5     |  5
20    |  19
50    |  50
78    |  87
123   |  123
1234  |  1233
3000  |  3000
9999  |  9999
29890 |  29913

правила

  • Вход и выход являются целыми числами (ваша программа должна по крайней мере поддерживать вход и выход в диапазоне от 1 до 32767)
  • Неверный ввод (0, значения с плавающей запятой, строки, отрицательные значения и т. Д.) Может привести к непредсказуемому выводу, ошибкам или (не) определенному поведению.
  • Применяются правила ввода / вывода по умолчанию .
  • Лазейки по умолчанию запрещены.
  • Это , поэтому самые короткие ответы в байтах выигрывают

Можем ли мы вывести последовательность бесконечно или вместо нее вернуть генератор?
Джо Кинг,

2
Err, 1 не простое число
Джо Кинг

1
@JoKing about a (1) = 1: я добавлю это. Это действительно исключение. Это четко указано в записи OEIS, но я не упомянул об этом явно. Я добавлю это к вопросу. Благодарю.
agtoever

@JoKing обратите внимание, что для определения последовательности требуется, чтобы сумма строки была простой при n> 1. Поскольку последовательность - это первая лексикографическая перестановка натуральных чисел, a (1) получается как 1. Таким образом, действительно, 1 не является простым, но задача или определение последовательности не говорят или не требуют, чтобы 1 было простым. .
agtoever

4
Связанная последовательность: A075348 .
jimmy23013

Ответы:



3

Perl 6 , 80 77 байт

{({$!=@_;+(1...{$_$!&&(|$!,$_).rotor(1..*).one.sum.is-prime-1})}...*)[$_]}

Попробуйте онлайн!

Объяснение:

{                                  }  # Anonymous code block
 (                        ...*)[$_]   # Index into the infinite sequence
  {                      }   # Where each element is
   $!=@_;  # Save the list of previous elements into $!
   +(1...{             })    # Return the first number that
          $_$!         # Has not appeared in the list so far
          &&            # And
          (|$!,$_)      # The new sequence
          .rotor(1..*)  # Split into rows of increasing length
                        # And ignoring incomplete rows
          .one          # Have exactly one row
          .sum          # Where the sum
          .is-prime-1   # Is not prime (i.e. just the first row)

3

Haskell , 122 120 байтов

import Data.Numbers.Primes
l%a|(p,q)<-splitAt l a,(s,k:t)<-span(not.isPrime.(+sum p))q=p++k:(l+1)%(s++t)
((1:1%[2..])!!)

Попробуйте онлайн!(имеет дополнительные 2 байта для f=)

РЕДАКТИРОВАТЬ: теперь использует индексирование на основе 0, чтобы сохранить 2 байта. Спасибо @wastl за то, что указал на это, я, должно быть, пропустил это в ОП.

Это было очень весело писать! Вспомогательная функция %принимает длину lи список значений, которые она может использовать a. Возвращает бесконечный список значений для последовательности. Длина на единицу меньше длины текущей строки треугольника, а список бесконечен и предварительно отсортирован. Сначала мы просто выводим первые lзначения из, aа затем просматриваем оставшиеся a, пока не найдем первое (наименьшее) значение, которое делает сумму простой. Мы разбиваем список вокруг этого значения, используя spanи некоторые сопоставления с образцом. Теперь все, что нам нужно сделать, это получить это новое значение и повторить со следующей длиной строки l+1и оставшимися значениями в a. Для окончательного результата мы добавляем 1 (особый случай для n = 0) и индексируем в него с помощью !!.


1
Я думаю, что вы можете удалить 0:как состояние вызова, вы можете использовать индексирование на основе 0.
wastl



0

Lua , 242 228 226 211 байт

s={}u={}i=0 n=0+...while i<n do
n=n-i
x,S=1,0
for j=1,i do
while u[x]do x=x+1 end
s[j]=x
S=S+x
u[x]=0
end
while u[x]or p do
x=x+1
d=S+x
p=F
for c=2,d-1 do
p=p or d%c<1
end
end
i=i+1
s[i]=x
u[x]=0
end
print(s[n])

Попробуйте онлайн!

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.