Целочисленный вызов отрицательного порядка, но это Prime Time!


12

Я говорю об этом вопросе , посмотрите на него, если вы немного запутались.

Основная задача

Ваша задача - выводить сцепленные целые числа в порядке убывания, но увеличивая максимальное целое число при каждом нажатии 1 (для этого вопроса 1 будет рассматриваться как простое число) . Хотя это и не похоже на первый вопрос, здесь возникает сложная часть: все выведенные числа могут быть только простыми числами . Они будут объединены в одну строку без пробелов и переносов. Ваш вклад также будет простым числом .

Пример:

1
21
321
5321
75321
1175321
Valid output:
1213215321753211175321

вход

Ваш код может принимать только один вход: наибольшее простое число для печати. Этот вход может поступать откуда угодно (графический, STDIN). Вы уверены, что ввод является простым числом.

Выход

Вам нужно будет вывести итоговое число. Вы можете получить этот номер, продолжая обратный отсчет, считайте только число, если оно простое, а затем соедините все результаты вместе в одно число. Последний номер «строки» (например 7, 5, 3, 2, 1) должен быть напечатан полностью. Выходные данные могут быть любыми (числа, строки, графические данные), если они доступны для чтения. Для проверки ваших тестов применяется тот же шаблон Regex:

^(\D*(\d)+\D*|)$

Если ваш вывод не соответствует этому шаблону, ваш код недействителен.

правила

  • Входные данные гарантированно просты, не включают обработку ошибок, если вы не хотите / не хотите.
  • Выход может быть только полносвязным числом, поэтому не может быть разделен ничем, даже символом новой строки.
  • Ваш алгоритм должен проверять не первый экземпляр Nпоявления (например, 17in 1175321), а первый экземпляр Nфактического числа.
  • Ваш вклад будет положительным, не добавляйте обработку, если вы не хотите / не хотите.

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

Input: -2, 0
Output: Any, or none (number isn't positive)

Input: 9
Output: Any, or none (number isn't prime)

Input: 1
Output: 1

Input: 7
Output: 121321532175321

Input: 23
Output: 1213215321753211175321131175321171311753211917131175321231917131175321

победитель

Это , поэтому выигрывает автор кода с наименьшей длиной в байтах!


8
Я не буду предлагать изменить задачу, но я не думаю, что 1это простое определение.
Эрик Outgolfer

3
1. Наличие контрольного примера 1прямо противоречит спецификации, которая « гарантирует », что входное число будет простым числом. 2. Выходная спецификация, кажется, содержит множество противоречий и неясностей. « Последний номер« ряда »(например, 7, 5, 3, 2, 1) должен быть напечатан полностью », - а остальные нет? « Применяется тот же шаблон Regex для проверки ваших тестовых случаев », но « Выходные данные могут быть только полносвязными числами, поэтому не разделены ничем », что противоречит этому регулярному выражению. Но регулярное выражение в любом случае явно изворотливо, потому что оно допускает пустую строку, и нет никакого ввода, которое могло бы это дать.
Питер Тейлор

1
1. « Разрешен одиночный завершающий перевод строки. » Является избыточным / несовместимым с шаблоном регулярных выражений, который допускает любое количество конечных символов. 2. Вводное предложение « Ваша задача - вывести целые числа » вводит в заблуждение, поскольку позже вы попросите вывести одно число. 3. Полное объяснение последовательности и результатов сбивает с толку - люди в основном должны перепроектировать то, что вы имеете в виду, изучая примеры (список последовательностей и контрольные примеры). Последний вызов также имел эти проблемы, и я обратился к ним там в предложенном редактировании там, которое вы отклонили ... :(
smls

5
Какой смысл произвольно делать 1 простым?
Ксандерхолл

1
Целочисленный вызов отрицательного порядка, но каждый раз, когда это простое число, становится быстрее;)
SplittyDev

Ответы:


5

Желе , 9 байт

ÆR1;;\UFV

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

Как это устроено

ÆR1;;\UFV  Main link. Argument: n

ÆR         Prime range; yield all primes up to n.
  1;       Prepend the "prime" 1.
    ;\     Cumulative concatenation; yield all prefixes of the prime range.
      U    Upend; reverse each prefix.
       F   Flatten the resulting 2D array.
        V  Eval. This casts the integer array to string first, thus concatenating
           the integers.

Я знаю, что слишком глубоко изучаю гольф, когда читаю «Желе», чтобы понять вопрос, а не наоборот. (На самом деле это довольно удобочитаемая программа Jelly; единственное, что меня смущает, это странный особый случай Vв списке.)

5

Обработка, 161 байт

int p(int n){for(int k=1;++k<=sqrt(n);)if(n%k<1)return 0;return 1;}void t(int n){for(int i=1,j;i<=n;i++){if(p(i)<1)continue;for(j=i;j>0;j--)print(p(j)<1?"":j);}}

Одна функция выполняет проверку первичности, другая - печать. Позвониt(7)

Ungolfed

Первая функция выполняет проверку первичности. Он возвращает intвместо a, booleanтак как таким образом сохраняется больше байтов. ( intвместо boolean, 0вместо false, 1вместо true)

int Q103891p(int n){
  for(int k=1;++k<=sqrt(n);)
    if(n%k<1)return 0;
  return 1;
}

Вторая функция выводит строку. Он перебирает все числа, если это не простое число, переходите к следующей итерации. Если это простое число, оно продолжается до печати внутри другого forцикла. Опять же, если число простое, то мы его печатаем, иначе нет.

void Q103891(int n){
  for(int i=1,j;i<=n;i++){
    if(p(i)<1)continue;
    for(j=i;j>0;j--)
      print(p(j)<1?"":j);
  }
}

5

Желе , 12 байт

ÆR;@1
ÇÇ€UVV

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

Если бы это не было для 1s, мой код был бы только ÆRÆRUVVдля 7 байтов.

Расширенное объяснение:

ÇÇ€UVV Main link. Arguments: z.
Ç      Run link1 on z.
 ǀ    Run link1 on z's elements.
   U   Reverse z's elements.
    V  Flatten z.
     V Concatenate z's elements.

ÆR;@1 Link 1. Arguments: z.
ÆR    Range of primes [2..z].
    1 Integer: 1.
  ;@  Concatenate x to y.

Ирландский парень (называемый Деннис?) Как-то превзошел меня, лол.


4

05AB1E , 19 байтов

LDpÏX¸ì€Lí˜ÐXQsp+ÏJ

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

объяснение

L                     # range [1 ... input]
 DpÏ                  # keep only primes
    X¸ì               # prepend a 1
       €L             # map: range [1 ... n]
         í            # reverse each sublist
          ˜           # flatten list to 1D
           Ð          # triplicate
            XQ        # check elements in one copy for equality with 1
              sp      # check elements in one copy for primality
                +     # add the above lists giving a list with true values at indices
                      # comtaining 1 or a prime
                 Ï    # keep only those elements of the unmodified copy of the list
                  J   # join

Поражен DpÏзаявлением. Хорошо сделано!
devRicher

2

Брахилог , 17 байт

y:{e1|e#p}f@[rcw\

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

Кажется, не может быть короче ...

объяснение

y                      The list [0, ..., Input]
 :{      }f            Find all...
   e1                     ...elements that are 1 (there is 1)...
     |                    ...or...
      e#p                 ...elements that are prime...
           @[          Take a prefix of the result
             rc        Reverse it and concatenate it into a number
               w       Write to STDOUT
                  \    Backtrack: try another prefix

2

Язык GameMaker, 169 байт

Основная функция (68 байт)

b=""for(i=1;i<=argument0;i++){c=i while(j)b+=string(p(c--))}return b

Функция p (46 байт)

for(a=0;a<argument0;a++)while q(++b){}return b

Функция q (55 байт)

n=argument0 for(i=2;i<n;i++)if!(n mod i)p=1return p|n=1


@ FireCubez Спасибо :) Я использовал его много Это был фактически первый язык программирования, который я выучил.
Timtech

1

MATL , 15 байт

Zq"1@ZqP]1v!VXz

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

Zq      % Implicit input. Push array of primes up to that value
"       % For each prime in that array
  1     %   Push 1
  @     %   Push current prime
  Zq    %   Push array of primes up to that
  P     %   Reverse
]       % End
1       % Push 1
&h      % Concatenate all stack horizontally
V       % Convert to string
Xz      % Remove spaces. Implicit display

1

Perl 6 , 41 байт

{[~] flat [\R,] 1,|grep *.is-prime,2..$_}

( Попробуйте онлайн. )

Объяснение:

  • 1, |grep(*.is-prime, 2..$_): Последовательность из 1 и простых чисел ... (1 2 3 5)
  • [,] ...: Уменьшить ("сложить") через оператор запятой ... (1 2 3 5)
  • [\,] ...: С промежуточными результатами ( треугольное уменьшение ) ...((1) (1 2) (1 2 3) (1 2 3 5))
  • [\R,] ...: Применить обратный мета-оператор к запятой ...((1) (2 1) (3 2 1) (5 3 2 1))
  • [~] flat ...: Удалить вложение списка и сложить оператор строки concat ... 1213215321

(Это основано на моем ответе на предыдущий вызов .)


1

Mathematica, 61 байт

ToString/@(1<>Prime@Range[Range@PrimePi@#,0,-1]/.Prime@0->1)&

Безымянная функция, принимающая целочисленный аргумент и возвращающая строку. (Если входное значение не является простым, оно просто «округляет» до ближайшего простого; если входное значение не положительное, оно делает вид, что оно равно 1.)

Эта реализация использует неприятный трюк из ответа Мартина Эндера на аналогичный предыдущий вызов (который сказал, что эта старая собака не может выучить новые трюки?): Злоупотребление, <>чтобы сгладить вложенный список целых чисел.

Вложенный рассматриваемый список начинается с создания такого же вложенного списка, как и в этом ответе, с соответствующей длиной (определяется PrimePi@#числом простых чисел до и включая входные данные); затем Primeприменяется к каждому элементу. Например, для ввода, 5являющегося 3-м простым числом, код Range[Range@PrimePi@#,0,-1]дает результат {{1,0},{2,1,0},{3,2,1,0}}, и применение Primeк каждому элементу дает, {{2,Prime[0]},{3,2,Prime[0]},{5,3,2,Prime[0]}}поскольку 1-е, 2-е и 3-е простые числа равны 2, 3 и 5 соответственно. Я горжусь тем, что мне удалось добавить еще больше ошибок в подход Мартина Эндера - Mathematica жалуется каждый раз, когда пишет Prime[0].

Prime[0]не вещь, но это нормально: /.Prime@0->1превращает их всех в 1с. И мы также хотим получить 1спереди, поэтому мы заменим ""ответ Мартина Эндера на простой 1, который фактически экономит байт.


0

PHP, 72 байта

for(;$n<$argv[1];print$s=$n.$s)for($i=2;$i>1;)for($i=++$n;--$i&&$n%$i;);

Беги остроумие -r

сломать

for(;$n<$argv[1];               // loop $n up to argument:
    print$s=$n.$s)                  // 2. prepend $n to $s, print $s
    for($i=2;$i>1;)                 // 1. find next prime: break if $i<2
        for($i=++$n;--$i&&$n%$i;);      // if $n is prime, $i is 1 after loop (0 for $n=1)

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