2
Попробуйте онлайн! или проверить все тестовые случаи.
Как это работает
1
||answer||
Пиф, 18 15 14 байт
Спасибо @Maltysen за -1 байт
$n
Программа, которая принимает входные данные на STDIN и выводит [0]
или ?
по мере необходимости.
Попробуйте онлайн
Как это работает
Where-Object
Старая версия с сокращением, 18 байт
($n-1)..2
Попробуйте онлайн
Как это работает
$n
||answer||
Regex (ECMAScript или лучше), 33 32 байта
3
Принимает свои входные данные в унарном виде, как последовательность $n
characters whose length represents the number.
Попробуйте онлайн! - ECMAScript
Попробуйте онлайн! - Перл
Попробуйте онлайн! - Ява
Попробуйте онлайн! - Питон
Попробуйте онлайн! - Руби
Попробуйте онлайн! - ПКРЕ
Попробуйте онлайн! - .NET (С#)
Попробуйте онлайн! - .NET (PowerShell)
Наконец-то я нашел применение положительному упреждающему тесту на простоту, который придумал 7 декабря 2018 г.! Это на 2 байта длиннее, чем "стандартный" отрицательный упреждающий тест на простоту, но позволяет сделать полное регулярное выражение на 1 байт короче:
while
Вот регулярное выражение, реализованное на некоторых основных языках, где оно либо превосходит другие представленные решения, либо является единственным на своем языке:
\$\large\textit{Анонимные функции}\$
Юлия v0.4+, 58 байт
$n
Попробуйте онлайн!
Вышеупомянутое возвращает истинность для ввода param($n)while($n-gt2){$n-=(($n-1)..2|?{'1'*$_-match'^(?!(..+)\1+$)..'})[0]}!--$n
. If returning falsey for 1(?!(11+)\1+$)11+~1
^11$~0
N
были необходимы, это было бы 60 байт:
0
Попробуйте онлайн!
или 59 байт в Julia v0.7 и более ранних версиях с 11
: Попробуйте онлайн!
Конечно, что касается Джулии v0.4, Ответ Глена О превосходит это при размере 32 байта, но для версии 0.5 и более поздних этот и последующие варианты могут быть оптимальным гольфом.
Юлия v0.7+, 54 байта
11
Попробуйте онлайн!
Юля v1.2+, 53 байта
1
Попробуйте это онлайн!
PowerShell, 52 51 байт
p~?1_$-1p:;
_~
n=i(0)?1_$-1p:;
Попробуйте онлайн!
-1 байт благодаря Джулиану
Питон, 70 69 байт
break
Попробуйте онлайн!
Питон, 73 байта
_
Попробуйте онлайн!
(Если это должна быть чистая лямбда.)
JavaScript (ES6), 58 54 байта
1_
Попробуйте онлайн!
-4 байта благодаря технологии, используемой РК. и CubeyTheCube
Перл, 49 47 байт
-2 байта Спасибо дингледупер
p~?1_$-1p:;
n=i(0)?1_$-1p:;
_~
N=n
Попробуйте онлайн!
Это лучше, чем порт Тон Хоспел 41 байт отвечать (57 байт):
p~?1_$-1p:;
n=i(0)?1_$-1p:;
_~
N=n
1(?!(11+)\1+$)11+~1
^11$~0
N
Попробуйте онлайн!
Даже если разрешено изменять глобальную переменную # show what is returned and if it is truthy
sub show ($_) {
# 「.&{…}」 uses the block as a method and implicitly against 「$_」
my $value = .&{any($_,{$_-(^$_).grep(*.is-prime)[*-1]}...3>*)==1}
say join "\t", $_, ?$value, $value.gist;
}
show 3; # 3 True any(False, True)
show 4; # 4 True any(False, True)
show 5; # 5 False any(False, False)
show 10; # 10 True any(False, False, True)
show 28; # 28 False any(False, False, False)
show 49; # 49 False any(False, False)
show 50; # 50 True any(False, False, True)
(51 байт):
# bare block lambda with implicit parameter 「$_」
# used to generate all of the rest of the elements of the sequence
{
# create an any Junction of the following list
any(
$_, # initialize sequence with the inner block's argument
# bare block lambda with implicit parameter 「$_」
{
# take this inner block's argument and subtract
$_ -
( ^$_ ) # Range up-to and excluding 「$_」
.grep(*.is-prime)\ # find the primes
[ * - 1 ] # return the last value
}
... # keep doing that until
3 > * # the result is less than 3
# test that Junction against 「1」
# ( returns an 「any」 Junction like 「any(False, False, True)」 )
) == 1
}
Попробуйте онлайн!
Рубин, 48 45 байт
{any($_,{$_-(^$_).grep(*.is-prime)[*-1]}...3>*)==1}
Попробуйте онлайн!
-2 байта, переключая истинное значение с «строки {($_,{$_-($_-1...2).first: *.is-prime}...3>*)[*-1]==1}
{($_,{$_-($_-1...2).first: *.is-prime}...3>*).any==1}
{any($_,{$_-($_-1...2).first: *.is-prime}...3>*)==1}
characters whose length is the input number" to "the integer value < Traverse the code in this direction, rotating on the line.
For the sake of reading the code easier, I'm reversing the
code on this line. This will be the order executed.
D[1-Dp(;]-D3/)[1-)1l)0Nx]
D Duplicate the top member of the stack.
[ ] Do the stuff in brackets until break is called.
1- Subtract 1 from the top item of the stack.
D Duplicate the top member of the stack.
p( If the top member is a prime...
; break;
- Pop a, b, push a - b.
D3/)[ ] If this value is less than 3, do the bracketed code.
1- Subtract the top item of the stack by 1.
) If the top item is zero...
1 Push 1.
l) If the length of the stack is zero...
0 Push 0.
N Output the top member of the stack.
x System.exit(0);
", сохраняя при этом то же ложное значение <]xN0)l1)-1[)/3D-];(pD-1[D
-1 байт с помощью [ [ dup 1 - primes-upto last - dup 2 > ] loop 1 = ]
instead of math.primes
PHP, 89 75 71 байт
r=lambda n:n>2and r(n-[a for a in range(2,n)if all(a%b for b in range(2,a))][-1])or n<2
Попробуйте онлайн!
-4 байта при переключении с (?!<$)
to as the repeated character
Р, 73 72 68 63 байта
..+
Попробуйте это онлайн! / Попробуйте онлайн!
^\1
Попробуйте это онлайн! / Попробуйте онлайн!
-1 байт спасибо Джузеппе
-4 байта с помощью (?<!^\1\2+(.+.))
instead of (?<!^\1\2+(.+.)|$)
или ..+
-5 байт за счет использования нового синтаксиса анонимной функции, представленного в R v4.1.0.
Поскольку TIO использует R v3.5.2, ссылки TIO имеют старую версию. 68 байт версии функции.
Java 8, 92 89 88 71 байт
(?<=(.*))
Попробуйте онлайн!
(?<=(.*))..+(?<!^\1\2+(.+.)|$)
Попробуйте онлайн!
-17 байт, просто сопоставляя регулярное выражение со строкой символов NUL вместо замены NUL на +
Java 11, 61 байт
(?>(?<=(.*))..+(?<!^\1\2+(.+.)|$))+
Попробуйте онлайн!
-10 байт относительно Java <11, спасибо Кевину Круйссену
\$\large\textit{Полные программы}\$
Питон 2, 69 байт
^(?>(?<=(.*))..+(?<!^\1\2+(.+.)|$))+.$
Выходы через код выхода, ценить #!/usr/bin/perl -p
$_=1x$_;$_=$`while/\B(?!(11+)\1+$|$)|11$/
for truthy (by exiting normally), and reach1.pl
для фальси (вызвав -p
).
Попробуйте онлайн!
Питон 2, 71 байт
ri e# Read input and convert to integer N.
{ e# Run this block as long as N is positive (or until the program aborts
e# with an error)...
_1| e# Duplicate and OR 1. This rounds up to an odd number. For N > 2, this
e# will never affect the greatest prime less than N.
{mp}, e# Get all primes from 0 to (N|1)-1.
e# For N > 2, this will contain all primes less than N.
e# For N = 2, this will contain only 2.
e# For N = 1, this will be empty.
W= e# Select the last element (largest prime up to (N|1)-1).
e# For N = 1, this will result in an error and terminate the program, which
e# still prints the stack contents though (which are 1, the desired output).
- e# Subtract from N. Note that this gives us 0 for N = 2, which terminates the
e# loop.
}h
Выходы через код выхода, ценить ri{_1|{mp},W=-}h
for truthy (by triggering a ` % Do...while
t % Duplicate. Takes input implicitly in the first iteration
qZq % All primes less than that
0) % Get last one
- % Subtract (this result will be used in the next iteration, if any)
t % Duplicate
2> % Does it exceed 2? If so: next iteration. Else: execute the "finally"
% block and exit do...while loop
} % Finally
o % Parity. Transforms 2 into 0 and 1 into 1
% End do...while implicitly
% Display implicitly
), и `tqZq0)-t2>}o
for falsey (by exiting normally).
Попробуйте онлайн!
Питон 2, 79 байт
‡∆ṗεẊ1=
‡∆ṗε # lambda x: abs(x - prev_prime(x))
Ẋ # repeat that on the input until it doesn't change
1= # does that equal 1?
Выходы ‡∆ṗεẊ1=
or 1 The input is 1,
| or:
X≜ X is the integer with the least absolute value such that
-↙X it is positive, and if it is subtracted from the input
ṗ∧ the result is prime.
! Consider no other value of X.
↰ Call this predicate again with X as the input.
через стандартный вывод.
Попробуйте онлайн!
Питон 3, 84 байта
1|-↙Xṗ∧X≜!↰
Попробуйте онлайн!
Перл {⍵<3:⍵=1⋄∇⍵-⊃⌽(⊢~∘.×⍨)2↓⍳⍵}
⍵<3 ⍝ Termination condition
:⍵=1 ⍝ return value
⋄ ⍝ Separator
∇ ⍝ Recursive call
⍵-⊃⌽ ⍝ Subtract largest prime
(⊢~∘.×⍨) ⍝ Calculate primes less than argument
2↓⍳⍵ ⍝ Range 2–(N-1)
, 45 43 bytes
-2 байта Спасибо дингледупер
f=lambda n,p=0:n>2and(any(p%x==0for x in range(2,p))and f(n,p-1)or f(n-p,n+~p))or n
Попробуйте онлайн!
Избитый Тон Хоспел 41 байт отвечать который смешивает регулярное выражение и код.
Перл, 46 44 байта
import sympy
f=lambda n:n>2and f(n-sympy.prevprime(n))or n<2
Попробуйте онлайн!
Теперь превосходит порт ответа Тона Хоспела (45 байт):
# This is simply the argument of the function.
//. This is the 'ReplaceRepeated' operator, which applies
a substitution until the its left-hand argument stops
changing.
x_/;x>2 The substitution pattern. Matches any expression x as
long as that expression is greater than 2.
:> Replace that with...
NextPrime@-x Mathematica has a NextPrime built-in but no
PreviousPrime built-in. Conveniently, NextPrime
works with negative inputs and then gives you the
next "negative prime" which is basically a
PreviousPrime function (just with an added minus sign).
x+ This gets added to x, which subtracts the previous
prime from it.
2>( ) Finally, we check whether the result is less than 2.
Попробуйте онлайн!