Великі числа


24

Давши додатне ціле число як вхід, визначте, чи є великим числом.

Величезне число - це таке число, що будь-яке вставлення +знаку між будь-якими двома цифрами в базі 10 призводить до вираження просте ціле число.

Наприклад, 40427 є великодумним, оскільки

4+0427  = 431  is prime
40+427  = 467  is prime
404+27  = 431  is prime
4042+7  = 4049 is prime

Вихідні дані

Ви повинні вивести два різних значення, одне, коли вхід великодумне, і одне, коли вхід не.

Оцінка балів

Метою цього конкурсу буде зробити розмір вихідного коду, написаного для вирішення цього завдання, заданого в байтах, якомога меншим.

Випробування

1       -> True
2       -> True
4       -> True
10      -> False
98      -> True
101     -> True
109     -> False
819     -> False
4063    -> True
40427   -> True
2000221 -> True

OEIS 253996


Мене просто бентежить визначення завдання, як 1 і 2 є навіть дійсними вхідними даними. Не кажучи вже про те, що 1зі знаком плюс, вставленим між будь-якими двома символами (без вставки), може бути лише результат 1, який сам по собі не є простим.
Чарівний восьминога Урна

4
@MagicOctopusUrn Плюс повинен бути вставлений між двома цифрами, тому оскільки 1та 2не має двох цифр, набір виразів порожній. Усі члени порожнього набору є простими. Крім того, жодна з них не є, але це крім точки. Це трохи заплутано, я вам це скажу, але, думаю, це має більше сенсу, ніж альтернативи.
Пшеничний майстер

Відповіді:


8

05AB1E , 10 байт

Код

η¨¹.s¨R+pP

Використовує кодування 05AB1E . Спробуйте в Інтернеті! або Перевірте всі тестові випадки!

Пояснення

η¨             # Take the prefixes of the input and remove the last element
  ¹.s¨         # Take the suffixes of the input and remove the last element
      R        # Reverse the array of suffixes
       +       # Vectorized addition
        p      # Check if each element is prime
         P     # Product of the array

Як це працює 1 - 9. Добуток порожнього набору дорівнює 1? Чому?
Чарівний восьминога Урна

@MagicOctopusUrn Порожній продукт завжди дорівнює 1.
Аднан

@MagicOctopusUrn Взяття продукту в основному починається з 1і помножується на кожен предмет у наборі, так що ...
ETHproductions

1
Ах, математично має сенс. Вгадайте, як і як sumна []це еквівалентно 0, з допомогою індукції власності при реалізації була досить розумна.
Чарівний восьминога Урна

@jontro Так, в UTF-8 це 14 байт. Однак 05AB1E використовує кодову сторінку 05AB1E , де це 10 байт.
Аднан

7

C (gcc) , 8384 85 83 84 86 75 111 байт

Усі оптимізації вимкнено і лише на 32-розрядному GCC.

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

+ кілька байт для 1випадку.

+ кілька байтів для багаторазових функцій.

i,j,r,s;f(a){for(i=10,r=1;a/i;i*=10)for(s=a%i+a/i,r*=s-1,j=2;j<s;)r*=s%j++>0;a=!r;}

Вводиться як ціле число. Повернення 1 для помилкових випадків, 0 для справжніх випадків.

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

Дивіться ще одну мою відповідь щодо коду Mathematica (55 байт).


Це повинні бути дві окремі відповіді. Крім того , рішення Mathematica дає невірні результати 1, 98і 4063.
ngenisis

6

Сітківка , 38 байт

\B
$`$*_$'$*_
S`\d
G`^_$|^(__+)\1+$
^$

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

Відбитки 1для великодумних чисел і в 0іншому випадку.

Пояснення

\B
$`$*_$'$*_

Почнемо з зіставлення кожної позиції між двома цифрами (позиціями, які не є межами слова), і вставляючи як префікс, так і суфікс цього збігу в одинаковому, використовуючи _як одинарну цифру. Отже, замість того, щоб вставляти +s, ми безпосередньо вставляємо туди одинарний результат суми.

S`\d

Тепер ми розділимо рядок навколо цифр, так що кожна сума йде по своєму рядку, і ми позбудемося цих цифр (також буде порожній провідний і кінцевий рядок, але це не важливо).

G`^_$|^(__+)\1+$

Це стандартний регулярний вираз, що відповідає непростим числам в одинакових. Використання Gетапу повторення означає, що ми просто зберігаємо всі рядки, що містять позитивні непримітки (відмінюючи порожні рядки).

^$

Нарешті ми перевіряємо, чи рядок порожній. Якщо введення було великодумним, попередній етап відкинув би всі рядки (тому що всі вони були праймерами), і це дає нам 1. В іншому випадку, якщо будь-який рядок не був простим, він залишатиметься в рядку, і регулярний вираз виходить з ладу, даючи 0.


4

Python 2 , 82 79 78 байт

f=lambda n,d=10:n<d or d/n<all((n/d+n%d)%k*f(n,10*d)for k in range(2,n/d+n%d))

Це повільно і може впоратися лише з тестовими випадками із запам'ятовуванням.

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

Альтернативна версія, 79 байт

f=lambda n,d=10:n<d or f(n,10*d)>d/n<all((n/d+n%d)%k for k in range(2,n/d+n%d))

Підсилюється ціною одного байта.

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


3

Розумне використання d!
Ерік Аутгольфер

@EriktheOutgolfer - це третя альтернатива, яку я спробував, після "всіх розділів -> фільтр на довжину 2" та "J, неправда, розділ кожен"
Leaky Nun,

3

Java 8, 175 171 94 88 байт

n->{long d=10,r=0,i,t;for(;d<=n;d*=10,r|=t-i)for(t=n/d+n%d,i=1;t%++i%t>0;);return r==0;}

-77 завдяки @PeterTaylor , використовуючи арифметику (замість String з .substring) та позбувшись окремого методу, щоб перевірити, чи є ціле число простим.
-6 байтів, використовуючи метод основного перевірки @SaraJ, тож переконайтесь, що ви підтримали її!

Спробуйте тут.

Пояснення:

n->{                  // Method with long as both parameter and return-type
  long d=10,r=0,i,t;  //  Some temp longs
  for(;d<=n           //  Loop as long as `d` is below or equal to input `n`
                      //  (inclusive instead of exclusive due to special case 10)
      ;               //    After every iteration:
       d*=10,         //     Multiple `d` by 10
       r|=t-i)        //     and Bitwise-OR `r` with `t-i`
    for(t=n/d+n%d,    //   Set `t` to `n` integer-divided by `d` plus `n` modulo-`d`
        i=1;          //   Set `i` to 1
        t%++i%t>0;);  //   Inner oop as long as `t` modulo `i+1` modulo `t` is not 0 yet
                      //   (after we've first increased `i` by 1 with `++i`)
                      //   (if `t` equals `i` afterwards, it means `t` is a prime)
  return r==0;}       //  Return if `r` is still 0

1
Я думаю, що принаймні два способи скоротити це: по-перше, замінити цикл на pрекурсію; по- друге, акумулювати результати такі , що основна функція вимагає тільки одне returnзаяву, зробивши значення дозорного від pбути -1і використанням , &щоб перевірити , що все повернені значення -1.
Пітер Тейлор

1
Насправді, велике: не використовуйте рядки.
Пітер Тейлор

n->{for(long d=10,m=1;d<n;d*=10)m|=p(n/d+n%d,2)-2;return m>0;}long p(long n,int i){return i<n?p(n%i<1?1:n,i+1):n;}
Пітер Тейлор

@PeterTaylor Дякую за пропозиції! Що стосується запропонованої вами функції в кінці, ви впевнені, що вона правильна? На даний момент я даю невірні результати , якщо тільки я не роблю щось не так.
Kevin Cruijssen

1
Гаразд, d<=nвпоратися 10. Переповнення стека не є проблемою (специфікація не дає діапазон вхідних даних, з якими потрібно обробляти), але можна виправити та отримати більшу економію, повернувшись у цикл та вкладиш .
Пітер Тейлор

2

Піт , 14 байт

.AmP_ssMcQ]dtU

Спробуйте в Інтернеті! Відобразиться, Trueякщо число є великодумним, Falseінакше. Приймає число як рядок.

Пояснення

.AmP_ssMcQ]dtU

              Q    # Implicit input Q
            tU     # Generate the range [1, 2, ..., len(Q)-1]
  m                # For each index d in the above range...
        cQ]d       # Split Q at index d
      sM           # Convert the two parts to integers
     s             # Sum
   P_              # Check it is a prime
.A                 # ...end for. Check all elements are True

2

Python 2 , 104 102 98 96 103 байт

  • Завдяки @Wheat Wizard за 2 байти: зроблено iабсолютно анонімно, оскільки його називають лише один раз.
  • Завдяки @Hyperneutrino за 4 байти: розумніший спосіб отримання чисел із основного числа замість нарізки
  • @Hyperneutrino врятувало ще 2 байти: x-1просто xдля простого перевірки rarnge.
  • Виправлено помилку для випадку x=10, таким чином додавши 7 байт, завдяки @Dennis та @Wheat Wizard за те, що його помітили: моя попередня версія розглядала 1 простий
lambda x:all((lambda x:x>1and all(x%j for j in range(2,x)))(x/10**j+x%10**j)for j in range(1,len(`x`)))

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



Круто, спасибі @HyperNeutrino
officialaimm

1
96 байт : вам не потрібен x-1кінець діапазону; Правовий ряд ексклюзивний.
HyperNeutrino

1
Це не вдається для 10 (новий тестовий випадок).
Денніс

1
Це не вдається для 10. Я також вважаю, що 10 - це єдине число, для якого це не вдається.
Пшеничний майстер

2

Japt , 24 16 байт

Це було значною мірою співпрацею між @Shaggy, @ETHproduction та мною.

¬£[YîU UtY]xÃÅej

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

Вводиться як рядок.


Гах! Майже ідентичний альтернативному рішенню, над яким я працював! Ось 22 байти, які я мав до цього часу. EDIT: Зменшив її до 20 байт , комбінуючи речі з обох.
Кудлатий

@Shaggy Досить смішно, я працюю над моїм редагуванням прямо зараз ... Це приголомшливо схоже на ваше: ethproductions.github.io/japt/…
Олівер

Підказка: xавтоматично перетворює елементи масиву в цифри ;-)
ETHproductions

Так, саме тут я б пішов, @ETHproductions: 16 байт .
Кудлатий

Також XîUгеній. Я думаю, що U¯Xпрацює однаково, але все ж
ETHproductions

2

Піп , 25 24 байти

$&0N_%,_=1M$+(a^@_)M1,#a

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

Пояснення

aє першим аргументом командного рядка. 1,#aстворює Діапазон, що містить числа 1наскрізь len(a)-1. Для цього ми відображаємо функцію лямбда:

$+(a^@_)
   a^@_   Split a at this index
$+(    )  Fold the resulting 2-element list on +

Далі ми відображаємо ще одну лямбда-функцію 0N_%,_=1, яка перевіряє первинність. Я взяв це з цієї відповіді ; ви можете прочитати пояснення там. Нарешті, складемо список на логічний AND ( $&). Результат - 1якщо всі суми були основними, 0якщо б хтось із них не був.

Приклад, із введенням 4063:

                    1,#a   [1; 2; 3]
           $+(a^@_)M       [67; 103; 409]
  0N_%,_=1M                [1; 1; 1]
$&                         1

2

CJam , 22 байти

r:L,({)_L<i\L>i+mp!},!

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

Друкує додатне ціле число для правди, нульове для помилки.

-1 завдяки розумній хитрості Пітера Тейлора .
-3 завдяки черговій підказці Пітера Тейлора.


0&!коротше1+:*
Пітер Тейлор

@ PeterTaylor О, це розумно ... ви зловживали тим фактом, що !повертає булеве значення, і використовували набір перетину з фальшивим значенням, 0так що ви можете робити 0&!в 3 замість 1&!!...
Ерік Атгольфер

Ви можете зберегти ще 3 байти, призначивши вхід змінній, що спрощує маніпуляції зі стеком, а ,замість цього використовується оператор фільтра f.
Пітер Тейлор

PS Я не бачу жодних зловживань у використанні !для перетворення на булевий: це було стандартом у GolfScript і є стандартним у CJam. І 1&!!було б невірно: 0&!це очевидний тест, оскільки вимога всебічна, не існує.
Пітер Тейлор

@PeterTaylor Це не те, що я мав на увазі ...: P
Erik the Outgolfer

2

Japt , 23 байти

Вводиться як рядок.

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

£i+Ýe@OxXr"%+0+"'+)j

Перевірте це


@ETHproductions, ні, ви мали рацію; початкова версія була неправильною; лише перевірка на великодушні праймери . ¬£i+YÄÃe@OxX j
Кудлатий

Я знав, що не втратив розуму; P
ETHproductions

1
Не 4063вдалося (має бути правдою, помилково). Хитрість тут полягає в тому, що JS вважає провідним 0означає, що ви хочете восьмерики ...
ETHproductions

Гммм ... Гаразд, думаю, у мене є альтернатива - знадобиться кілька хвилин, щоб протестувати її та пограти в гольф.
Кудлатий

Я думаю, що це не вдасться зараз у випадку, який містить два 0, а потім дві інші цифри ... ( 40043наприклад, просто) Додайте +після, 0щоб виправити це.
ETHproductions

2

Математика, 75 байт

And@@Table[PrimeQ@ToExpression@StringInsert[#,"+",n],{n,2,StringLength@#}]&

Functionякий очікує String. PrimeQ@ToExpression@StringInsert[#,"+",n]повертає, чи вставляє a +після nдесятої цифри дає просте число. Table[...,{n,2,StringLength@#}]дає список цих значень у nдіапазоні від 2до довжини рядка. Потім ми беремо Andкожен з елементів цього списку. Зручно, якщо StringLength@#<2, то Table[...]порожній список, для якогоAnd@@{}==True


2

Математика, 55 50 45 49 50 54 62 байт

Здається, я повинен розмістити його окремо.

+6 байт для переоціненої довжини коду.

+5 байт завдяки ngenisis.

And@@(qPrimeQ[#~Mod~q+⌊#/q⌋])@Rest@PowerRange@#&

Приймає введення як ціле число, а повертає регулярне Trueі False. Між ними є unicode 0xF4A1, короткий для Function[,]. Довжина коду вимірюється за розміром файлу (UTF-8 без BOM), коментуйте, якщо він невірний.

PowerRange[x]повертає 1, 10, 100 ... не більше ніж x, що введено в Mathematica 10.


2

Звичайна англійська 4,204 341 315 251 241 240 байт

(Повторно) включив тестування на первинність у бібліотеку Plain English, перемістивши 3863 байти в бібліотеку Plain English. Видалено 26 байтів пробілу. Збережено 64 байти шляхом скорочення локальних змінних. Збережено 10 байт шляхом скорочення інтерфейсу. За пропозицією RosLuP , збережено 1 байт, змінивши спосіб ініціалізації та нарощування m.

To decide if a n number is g:
Put 1 in a m number.
Loop.
Multiply the m by 10.
If the m is greater than the n, say yes.
Divide the n by the m giving a q quotient and a r remainder.
Add the q to the r.
If the r is not prime, say no.
Repeat.

Невиконана версія остаточного коду:

To decide if a number is magnanimous:
  Put 1 in another number.
  Loop.
    Multiply the other number by 10.
    If the other number is greater than the number, say yes.
    Divide the number by the other number giving a quotient and a remainder.
    Add the quotient to the remainder.
    If the remainder is not prime, say no.
  Repeat.

Примітки: Простий англійський IDE доступний на веб- сайті github.com/Folds/english . IDE працює в Windows. Він компілюється в 32-бітний код x86.

Osmosian Order «s динамічна вилка рівнинних Англійська вже в перевірки простоти версії 4700, але він використовував дуже неефективний алгоритм (станом на січень-червень 2017 року). Версії 4001-4011 динамічної вилки сайту GitHub опустили тестування первинності. Версія 4013 динамічної вилки сайту GitHub включає тестування первинності. Код для перевірки первинності був розроблений як частина попередніх редакцій цієї відповіді.


1

Perl 6 , 58 байт

{?(10,10* *...^*>$_).map({$_ div$^a+$_%$^a}).all.is-prime}

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

10, 10 * * ...^ * > $_- це геометрична послідовність кратних десяти, яка приймається до тих пір, поки елемент не перевищує вхідний параметр $_. Тоді ми просто перевіряємо, що для кожної потужності десяти сума вхідного параметра, взятого div та mod, що потужність є простим.


1

Haskell, 114 110 байт

p x=[x]==[i|i<-[2..x],x`mod`i<1]
i!x|i<1=0<1|0<1=p(uncurry(+)$divMod x$10^i)&&(i-1)!x
f x=(length(show x)-1)!x

Необурені з поясненням:

-- Check if x is a prime number
p x = [x] == [i | i<-[2..x], x`mod`i < 1]
-- Checks all pairs of numbers a '+' can be put in between
i ! x | i<1 = 0<1                                -- Single-digit numbers are always truthy
      | 0<1 = p (uncurry (+) $ divMod x $ 10^i)  -- Does x split at i digits from right sum up to a prime?
           && (i-1) ! x                          -- If so, check next pair
-- Start (!) with the number of digits in x minus one
f x = (length (show x)-1) ! x

Якщо ви використовуєте p x=[x]==[i|i<-[2..x],x`mod`i<1]як основний чек, ви можете зберегти 2 байти.
Пшеничний майстер

Ви також можете використовувати divMod x$10^iзамістьx`divMod`(10^i)
Пшеничний майстер

@WheatWizard: Я знав, що основний тест ще можна якось поліпшити. ;) Спасибі!
siracusa

1

Аксіома, 88 байт

f(n:PI):Boolean==(i:=10;repeat(q:=n quo i;q=0 or ~prime?(q+n rem i)=>break;i:=i*10);q=0)

тест та результати

(10) -> [[i,f(i)]  for i in [1,2,4,10,98,101,109,819,4063,40427,2000221,999999999999999999999999999999999999999999999]]
   (10)
   [[1,true], [2,true], [4,true], [10,false], [98,true], [101,true],
    [109,false], [819,false], [4063,true], [40427,true], [2000221,true],
    [999999999999999999999999999999999999999999999 ,false]]



0

Складено , 51 байт

[tostr:#'1-~>splitat tr['+',' '#`#~prime]map 1,all]

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

Це функція. Він працює, перетворюючи свій аргумент у рядок ( tostr), дублюючи його та отримуючи його довжину ( :#'), віднімаючи 1 ( 1-), роблячи діапазон від 1 до цього числа ( ~>). Стек виглядає приблизно так, для введення 40427:

('40427' (1 2 3 4))

Ми виконуємо векторизований splitatрезультат, в результаті чого наступний масив знаходиться у верхній частині стека:

(('4' '40' '404' '4042') ('0427' '427' '27' '7'))

Транспонуючи це tr, ми отримуємо:

(('4' '0427') ('40' '427') ('404' '27') ('4042' '7'))

Потім ми відображаємо функцію ['+',' '# # ~ prime] (withmap`). Ця функція виконує:

['+',' '#`#~prime]
 '+',                concatenate a plus sign (string)    `('4' '0427' '+')
     ' '#`           join by spaces                      `'4 0427 +'`
          #~         evaluate                            `431`
            prime    check primality                     `1`

Потім, після карти, ми об'єднуємо 1. Це з моменту allповернення undefдля порожнього списку.


0

JavaScript (ES6), 70 байт

P=(n,x=2)=>n%x?P(n,x+1):n==x
f=(n,i=10)=>i>n||P((n/i|0)+n%i)&f(n,i*10)

Помилка останнього випадку в моєму браузері через помилку "занадто багато рекурсії" під час обчислення P(200023). Сподіваємось, це не визнає його недійсним.


0

QBIC , 38 байт

_L;|[a-1|q=q*µ!_sA,b|!+!_sA,b+1,a|!}?q

Пояснення

_L |     Create a variable a and set it to the length of
  ;      the input string (A$)
[a-1|    FOR b = 1 to a-1
q=q*     multiply q by
 µ       -1 if prime, 0 if not, of
  !        a cast of 
   _s       a substring of
     A,       A$
     b        from index 1 to index b (only one index is given, so that is assumed to be the req. length from 1)
      |!   to number
 +         plus
 !         a cast of
  _s         a substring of
    A,         A$
    b+1        from index b+1
    ,a         for the length of a (does not error if it exceeds the end of the string)
      |!   to number
 }       NEXT 
 ?q      PRINT q, which is eitrher -1 or 1 for all-prime sums, or 0 otherwise

0

CJam (21 байт)

r:R,({RiA@)#md+mp!},!

Інтернет демо , онлайн набір тестів

Розсічення

r:R       e# Take a token of input and assign it to R
,(        e# Take the length of R minus one
{         e# Filter i = 0 to (length of R minus two)
  Ri      e#   Push R as an integer value
  A@)#    e#   Push 10 to the power of (i + 1)
  md      e#   divmod
  +mp!    e#   Add, primality test, negate result
},        e# The result of the filter is a list of splits which give a non-prime
!         e# Negate result, giving 0 for false and 1 for true


0

APL (NARS), символи 35, байти 70

{0≥k←¯1+≢⍕⍵:1⋄∧/0π(m∣⍵)+⌊⍵÷m←10*⍳k}

тест:

  f←{0≥k←¯1+≢⍕⍵:1⋄∧/0π(m∣⍵)+⌊⍵÷m←10*⍳k}
  f¨1 2 4 10 98 101 109 819 4063 40427 2000221
1 1 1 0 1 1 0 0 1 1 1 

Це був би переклад у APL з Axiom post algo тут ...

{0≥k←¯1+≢⍕⍵:1⋄∧/0π(m∣⍵)+⌊⍵÷m←10*⍳k}
 0≥k←¯1+≢⍕⍵:1⋄  assign to k the length as array of argument return 1 if that is <=0
 ∧/0π(m∣⍵)+⌊⍵÷m←10*⍳k
              m←10*⍳k  m is the array pow(10,1..k)
           ⌊⍵÷m       the array of quotient of argumet with m
          +           sum 
     (m∣⍵)            with array of remander
   0π                 build the binary array of "are prime each"
 ∧/                   and that array


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