Отойди от меня, Сатана-Прайм!


22

Сатана-Primes

кто они?
они , Primesсодержащие 666
эти шайтан-Штрихи: [46663,266677,666599,666683,616669]
это НЕ :[462667,665669,36363631,555]

участок

Каждое число больше 6661 имеет сатанинские простые числа позади него

Соревнование

По заданному целому числу n>6661найдите сатану-прайма позади (или равного) и ближе всего к себе.

Примеры

Целый n=30000имеет 3 Сатана-Primes (SP) позади него: [6661, 16661, 26669].
Ваш код должен возвращаться, 26669который находится ближе всего к нему

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

Вход-> Выход

6662->6661    
10000->6661    
66697->66697 (a SP returns himself)  
328765->326663  
678987->676661
969696->966677

правила

Ваш код должен работать для любого nв диапазоне вашего языка.

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


1
определить «около минуты». Это + - 30 секунд? Лично я считаю, что 30 минут и минут не сильно отличаются друг от друга ... Кроме того, бонусы, как правило, не одобряются ... также я думаю, что это могло бы быть лучше в качестве output the nth satan primeвызова ...
Сократик Феникс

хорошо, хорошо люди ... бонус будет удален ...

Надеюсь, вы не возражаете против редактирования, которое я внес в заголовок вызова.
Лохматый

3
@Shaggy Какой пункт служит изменению названия ...?
Конор О'Брайен,

3
@ ConorO'Brien Рифм и появление архаичного, я полагаю.
wizzwizz4

Ответы:



7

Нейм , 9 байт

>ͻ:D+6S𝕚÷

Объяснение:

>         Increment input
 ͻ        Start infinite loop
  :        Previous prime
   D       Duplicate
    +6     Push 666
      S    Swap
       𝕚   See if 666 is a substring of the top of the stack
        ÷  If true, break

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


Так есть ли встроенная функция для нажатия «66 с префиксом к цифре»? О_О Нейм прогрессировал.
Эрик Outgolfer

1
Как +6пуш 666? Или Нейм просто тот металл?
Роберт Фрейзер

6
@RobertFraser Видимо +xозначает 612 + код символа x. Код 6бывает 54, поэтому 612 + 54 = 666.
fergusq

@EriktheOutgolfer Ну, Neim может представлять все трехзначные числа и несколько четырехзначных, используя два байта.
Okx

2
@EriktheOutgolfer '\+*=100,356,612,868 (плюс порядковый номер следующего символа)
Джонатан Аллан

7

Желе , 10 9 байт

Сэкономили 10% благодаря @Dennis!

ÆRwÐf666Ṫ

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

объяснение

ÆR          # All primes in range [2, input]
   Ðf      # Keep those which satisfy
  w        # truthy if y is in x
     666   #           ^ (this is y)
        Ṫ  # Tail (take the last element)

Альтернатива:ÆRẇ@Ðf666Ṁ
г-н Xcoder

5
Мне нравится, что Хвост (сразу после 666 года) выглядит как крест.
kaine

4
wдолжен работать вместо ẇ@.
Деннис

@Dennis s / sh / w / конечно, это работает: p
Эрик Outgolfer

5

Pyth , 15 14 байтов

Сохранено 1 байт с помощью Дейва .

Ошибки памяти для 969696чего-либо и выше на моей машине, но это нормально, если ему достаточно памяти.

ef&/`T*3\6P_TS

Попробуйте здесь или проверьте комплект тестов.


Как?

ef & / `T * 3 \ 6P_TSQ - полная программа с неявным вводом (Q) в конце

             SQ - Диапазон [1, Q]
 f - Фильтр.
          P_T - премьер?
  & - А также
   / `T * 3 \ 6 - содержит 666.
e - Последний элемент.
                - Неявно вывести результат.

Pyth , 14 байт

ef/`T*\63fP_TS

Попробуй это здесь!


14 байтов:ef&/`T*3\6P_TS
Дейв

Я добавил окончание Q по ошибке, его 14
Дейв

"666"менее эффективный способ описать строку 666, которая*3\6
Дейв


4

Bash + Core Utils, 51 49 байт

seq $1|tac|factor|awk 'NF==2&&/666/&&!a--&&$0=$2'

Принимает аргумент командной строки. Может быть довольно медленным с большими числами.


Это выводит все «простые числа сатаны» вплоть до 6661, но при этом следует печатать только самый близкий под входом: попробуйте это онлайн . Одним из решений было бы просто добавить |head -1в конец.
Джастин Маринер

@JustinMariner LOL, упс, исправил это
markasoftware

4

Mathematica, 64 62 61 53 байта

#//.i_/;!PrimeQ@i||ToString@i~StringFreeQ~"666":>i-1&

-1 байт благодаря @KellyLowder

-8 байт (вау) благодаря @Notatree

объяснение

Принять вход. Мы уменьшаем его в следующих условиях:

  • вход не прост, ИЛИ

  • цифры входов не содержат три 6 в ряд.

Мы повторяем это, пока не будет достигнуто простое сатана.


2
Очень хорошо. Вы можете потерять еще один _ в конце, так как простое не может закончиться в 6.
Келли Лоудер

@KellyLowder хорошая точка зрения
JungHwan Мин

1
Это еще короче со строками:#//.i_/;!PrimeQ@i||ToString@i~StringFreeQ~"666":>i-1&
Не дерево

1
@ Нет, вау! хороший!
JungHwan Мин


3

Japt , 14 байт

õ fj w æ_sø666

Попробуй это

Наблюдение , поскольку там был а- на основе времени 50% бонус: завершает тест 969696в возрасте до половины секунды.


объяснение

Неявный ввод целого числа U.

õ

Создайте массив целых чисел от 1до U.

fj

Фильтр ( f) простых чисел.

w

Обратный.

æ_

Вернуть первый элемент, который возвращает истинное значение (в данном случае 1) при прохождении через функцию, которая проверяет, если ...

sø666

Целое число, преобразованное в строку ( s), содержит ( ø) 666.


Более быстрая альтернатива, 15 байт

Опять же, учитывая, что изначально был бонус, основанный на времени, вот альтернативное, и гораздо более быстрое, решение, которое мне больше не по душе.

U-@j *U´sø666}a

Попробуй это


2

PowerShell , 128 байт

param($n)function f($a){for($i=2;$a-gt1){if(!($a%$i)){$i;$a/=$i}else{$i++}}}for(){if($n-match666-and($n-eq(f $n))){$n;exit}$n--}

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

PowerShell не имеет встроенных модулей факторизации, поэтому этот код заимствован из моего ответа на Prime Factors Buddies .

Мы берем ввод $n, затем объявляем новый, function fкоторый вычисляет факторы ввода $a. Если вход $aпрост, то это вернет просто $a.

Основная часть программы - бесконечный for()цикл. Внутри цикла мы проверяем, является ли $n -matches против 666и $nявляется ли простое число (то есть $nсоответствует ли все факторы $n). Если это так, мы помещаем $nв конвейер и exit, с неявным выводом. В противном случае мы уменьшаем $n--и продолжаем цикл.


Урезал мою версию и только что смог набрать
TessellatingHeckler

2

Python 2 , 77 76 байт

Редактировать: -1 байт благодаря @ Mr.Xcoder

Медленное время работы, работает в O(n^2)

lambda x:max(q for q in range(x+1)if"666"in`q`*all(q%t for t in range(2,q)))

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

Еще одно 76-байтовое решение

lambda x:max(q*("666"in`q`*all(q%t for t in range(2,q)))for q in range(x+1))

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

С SymPy 73 байта

lambda x:max(q for q in primerange(0,x+1)if"666"in`q`)
from sympy import*

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


76 байт: lambda x:max(q for q in range(x+1)if"666"in`q`*all(q%t for t in range(2,q)))- использовать max()вместо[][-1]
г-н Xcoder

2

PowerShell , 71 69 64 байта

param($s)for(;$s-notmatch666-or(2..($s/2)|?{!($s%$_)});$s--){}$s

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

  • 328765 занимает ~ 30 секунд на моей машине, но время ожидания 60 секунд на Tio.run превышено.

  • 678987 занимает ~ 1,5 минуты.

  • 969696 занимает ~ 4,5 минуты.

Умный способ сделать факторы.
AdmBorkBork

2

MATL, 16 байт

ZqP"@V'666'Xf?@.

Попробуйте это на MATL Online

объяснение

         Implicitly grab input (n)
Zq       Compute the primes up to n (output is in increasing order)
P        Flip the array (so larger primes come first)
"        For each prime
  @V     Convert it to a string
  '666'  Push the string literal '666' to the stack
  Xf     Find the location of '666' in the prime
  ?      If it was present...
    @.   Push it to the stack and break
         Implicitly display the stack contents

2

C ++ 389 байт

#include <iostream>
#include <boost/multiprecision/cpp_int.hpp>
#include <boost/multiprecision/miller_rabin.hpp>
using namespace boost::random;typedef boost::multiprecision::cpp_int Z;int main(int,char**v){mt19937 m(clock());independent_bits_engine<mt11213b,256,Z>g(m);Z n{v[1]},p;while(p++<=n)if(miller_rabin_test(p,25,g)&&p.convert_to<std::string>().find( "666" )!=-1)std::cout<<p<<" ";}

Это полная программа!
Вам понадобится Boost для его компиляции. (Или скопируйте и вставьте в свою любимую онлайн-оболочку C ++.)
Запустите его из командной строки, давая n в качестве аргумента.

Ungolfed:

#include <iostream>
#include <boost/multiprecision/cpp_int.hpp>
#include <boost/multiprecision/miller_rabin.hpp>
using namespace boost::random;

typedef boost::multiprecision::cpp_int integer;

int main( int argc, char** argv )
{
  mt19937 mt( clock() );
  independent_bits_engine <mt11213b, 256, integer> rng( mt );

  integer input {argv[ 1 ]};
  integer possible;

  while (possible++ <= input)
    if (
      // is_prime( possible )
      miller_rabin_test( possible, 25, rng )
    && 
      // possible has "666" in it
      (possible.convert_to <std::string> ().find( "666" ) != std::string::npos))

    std::cout << possible << " ";
}

Ярлыки были сделаны с точки зрения тестирования случайных чисел. Исходный код начал тестирование возможных простых чисел на 6661 и увеличен на два. Вы также получите предупреждение компилятора из-за этого (-1) вместо npos.

Тем не менее, это работает довольно быстро. На моем старом AMD Sempron 130 потребовалось всего около 40 секунд, чтобы найти все 214 простых чисел сатаны до 1 000 000.

: ^ D


2

Пакет bash + bsd-games, 33

  • 2 байта сохранены благодаря @FedericoPoloni.
primes 2 $[$1+1]|grep 666|tail -1

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


Вы можете сохранить 1 байт, если замените последние две команды на tail -n1.
Федерико Полони

@FedericoPoloni Дух - не могу поверить, что я забыл tailздесь. На самом деле tail -1даже на 1 меньше.
Цифровая травма


1

JavaScript (ES6), 55 54 байта

-1 байт благодаря @ThePirateBay.

f=n=>/666/.test(d=n)&eval("while(n%--d);d<2")?n:f(n-1)

Очень медленно с большими входами. Тест на первичность, адаптированный по этому коду .

Задержки

  • Ввод 10000занял 10 секунд
  • Ввод 328765занял 3 минуты
  • Ввод 678987занял 9 минут
  • Ввод 969696занял 16 минут

тесты

Некоторые из них повесят ваш браузер на несколько минут.

Быстрая версия, 56 байт

Завершает каждый тест менее чем за секунду.

f=n=>/666/.test(n)&&eval("for(d=2;n%d++;);d>n")?n:f(n-1)

;[6662, 10000, 328765, 678987, 969696].forEach(n=>console.log(`f(${n}) -> ${f(n)}`))


2
Вы никогда не должны делать это. Это код гольф, и производительность абсолютно не имеет значения. Я настоятельно рекомендую вернуться к вашему предыдущему 55-байтовому ответу. Кроме того, вы можете уменьшить его до 54 байтов, заменив d==1с d<2тех пор n>6661.

52 байта: f=n=>/666/.test(n)&(g=d=>n%--d?g(d):d<2)(n)?n:f(n-1)но выдаст ошибку рекурсии для больших чисел.
Лохматый

f=n=>/666/.test(d=n)-eval("while(n%--d);d")?f(n-1):n
l4m2

1

Ruby, 67 , 66 , 58 , 56 байтов

Включает +7байты для-rprime

->z{z.downto(1).find{|x|/666/=~x.to_s&&x.prime?}}

Он довольно быстрый, вычисляет значения ~2^52примерно за секунду и 2^64менее чем за 5 минут (MBP 2011, Ruby 2.3.1).


1

Stax , 10 байт

ü>:Ñb/VP6─

Запустите и отладьте его

Объяснение (без упаковки):

^w:pc$666$#! Full program, implicit input-parsing
^            Increment input
 w           do-while:
  :p           Previous prime
    c$         Copy and stringify
      666$     Push "666"
          #    Number of occurences
           !   Logical not
             Implicit output

Хорошая программа. Спасибо за попытку Stax. К вашему сведению, также возможно выполнить несколько дел, используя опцию «Разделитель», как это
рекурсивный

@ рекурсивный ах, thx
wastl



0

C # (.NET Core) , 117 115 112 байтов

f=>{for(int i=f;i>1;i--){int p=1,j=2;while(j<i)if(i%j++<1)p=0;if(p>0&$"{i}".Contains("666"))return i;}return 0;}

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

  • 2 байта сохраняются путем удаления ненужных скобок.
  • 3 байта сохраняются путем объединения intобъявлений.

Я уверен, что это можно сделать короче; может быть, рекурсивно вызывая func fи удаляя внешнюю forпетлю.

Рекурсивный подход, 85 байт

i=>{int p=1,j=2;while(j<i)if(i%j++<1)p=0;return p>0&$"{i}".Contains("666")?i:f(--i);}

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

Я не уверен, насколько хорошо этот подход вписывается в рамки code-golf из-за необходимости устанавливать Func<int,int> f = nullпервое, и это fвызывается снова, но не учитывается в байтах. Любое разъяснение будет оценено.

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