Забери мене позаду Сатану-Прем'єр!


22

Сатана-Прими

хто вони?
вони 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 Якому моменту служить зміна заголовка ...?
Conor O'Brien

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, що призначається до цифри"? O_O Neim прогресував.
Erik the 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
Erik the 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 - Останній елемент.
                - Неналежне виведення результату.

Піт , 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

Математика, 64 62 61 53 байт

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

-1 байт завдяки @KellyLowder

-8 байт (уау) завдяки @Notatree

Пояснення

Візьміть вклад. Ми декрементуємо його за таких умов:

  • вхід не є простим, АБО

  • цифри входів не містять трьох 6-х рядів.

Повторюємо це, поки не буде досягнуто сатанинського розквіту.


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

@KellyLowder хороший момент
JungHwan Min

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

1
@Notatree вау! приємно!
JungHwan Min


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

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 як аргумент.

Безголівки:

#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-ігор, 33

  • 2 байти збережено завдяки @FedericoPoloni.
primes 2 $[$1+1]|grep 666|tail -1

Спробуйте в Інтернеті .


Ви можете зберегти 1 байт, якщо замінити останні дві команди на tail -n1.
Федеріко Полоні

@FedericoPoloni duh - не можу повірити, що tailтут я забув . Насправді tail -1навіть на 1 менше.
Digital Trauma


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

Рубі, 67 , 66 , 58 , 56 байт

Включає +7байти для-rprime

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

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


1

Стакс , 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. FYI, це також можна зробити кілька випадків, використовуючи опцію «Сепаратор» , як це
рекурсивний

@recursive ах, 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);}

Спробуйте в Інтернеті!

Я не впевнений, наскільки цей підхід вписується в рамки коду-гольфу через те, що потрібно встановити Func<int,int> f = nullперший, і fце викликається знову, але не рахується до байтів. Будь-яке уточнення буде вдячне.

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