Нове замовлення №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 ( так, є пісня нового замовлення, прихована в цій послідовності ).

Оскільки це завдання "чистої послідовності", завдання полягає у виведенні а(н) для заданого н якості вхідного сигналу, де а(н) - A162371 .

Завдання

З урахуванням цілого вводу н , виведіть а(н) у цілочисленному форматі.

а(н) визначається якн й елемент лексикографічно найбільш ранньої перестановки натуральних чисел таким, що, якщо розглядати їх як трикутник, прочитаний рядками, при n> 1 суми рядків є простими числами. Оскільки перший лексикографічному перестановки натуральних чисел починається з 1, ( 1 ) дорівнює 1. Слід зазначитищо за цим визначенням а ( 1 ) = 1 і ( 1 ) єНЕзобов'язаний бути простим. Це послідовність OEISA162371.а(1)а(1)=1а(1)

Примітка: тут передбачається індексація на основі 1; Ви можете використовувати індексацію 0 на основі, так ( 0 ) = 1 ; a ( 1 ) = 2 і т. д. Будь ласка, зазначте це у своїй відповіді, якщо ви вирішили скористатися цим.а(0)=1;а(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
Помилка, 1 - не прем'єр
Джо Кінг,

1
@JoKing про (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= )

EDIT: Тепер використовується індексація на основі 0, щоб зберегти 2 байти. Дякую @wastl за вказівку на це, я, мабуть, пропустив це в ОП.

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


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



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