Жодних сусідів-співмешканців немає


33

Враховуючи список натуральних чисел, виведіть, чи має кожна суміжна пара цілих чисел основний коефіцієнт. Іншими словами, виведіть truthy тоді і лише тоді, коли в списку немає двох сусідніх цілих чисел.

Іншими словами: задано список натуральних чисел [a 1 a 2 … a n ] , виведіть чи

       gcd (a 1 , a 2 )> 1 && gcd (a 2 , a 3 )> 1 &&… && gcd (a n − 1 , a n )> 1.

Список завжди буде містити щонайменше два елементи (n ≥ 2).

Однак…

Цей виклик також : кодові точки у вашій відповіді (якою б кодовою сторінкою вона не була) повинні відповідати умові, яку перевіряє ваша програма.

Наприклад, print 2чинна програма. Як перелік кодових точок Unicode, це [112 114 105 110 116 32 50] , яке задовольняє цій умові: 112 і 114 поділяють коефіцієнт 2 ; а 114 і 105 поділяють коефіцієнт 3 і т.д.

Однак неmain можна зустрітись у дійсній програмі (вибачте!), Так як кодові точки Unicode та , а саме 109 та 97 , є спільними. (На щастя, ваше подання не повинно бути повноцінною програмою!)ma

У вашій програмі заборонено містити кодову точку 0.

Тестові справи

Truthy:

[6 21] -> 1
[502 230 524 618 996] -> 1
[314 112 938 792 309] -> 1
[666 642 658 642 849 675 910 328 320] -> 1
[922 614 530 660 438 854 861 357 477] -> 1

Фальсі:

[6 7] -> 0
[629 474 502 133 138] -> 0
[420 679 719 475 624] -> 0
[515 850 726 324 764 555 752 888 467] -> 0
[946 423 427 507 899 812 786 576 844] -> 0

Це : виграє найкоротший код у байтах.


8
Для тих , хто намагається цю проблему в звичайній мові програмування, це список символів , які мають прості кодові в ASCII: %)+/5;=CGIOSYaegkmq\DEL.
Крістіан Лупаску

@Lynn Чи повинні Істини бути послідовними?
H.PWiz

1
@ H.PWiz Nope! -
Лінн

Я насправді мав намір це зробити придатним для деяких нормальних (не для гольфу) мотоциклів, і я відчував сподівання, коли помітив, що print 2це дійсно, але );=aeбути прем'єр -міністром справді важко, я не вважав цього ... Цікаво, чи може щось на зразок Haskell конкурувати?
Лінн

Це обмеження простіше, ніж зворотне питання , припустимо, ніхто не використовує байт 0x02. На це запитання отримайте невідповідну відповідь у Mathematica, Logo, Haskell, Python, Perl, TI-BASIC. У цього вже є Haskell, я думаю, що Mathematica неможлива, але логотип здається можливим, хоча я ще не зробив конструювання рішення.
користувач202729

Відповіді:


15

MATL , 14 байт

!TM1*Zdl2$Xdl-

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

Пояснення

!     % Implicit input. Transpose
TM    % Push input to latest function again
1*    % Multiply by 1 (does nothing, but matches factors)
Zd    % Compute gcd with broadcast: matrix of gcd of all pairs
l     % Push 1
2$    % The next function will use 2 inputs
Xd    % Extract diagonal 1 (i.e. that below the main diagonal) from the matrix
l-    % Subtract 1 from each entry. Implicitly display

4
Вітає з відповіддю , який дійсно задовольняє обмежені вихідні вимоги!
Erik the Outgolfer

13

Haskell , 103 100 байт

Редагувати:

  • -3 байти: Використовується d<-fzзахисник для об'єднання та скорочення останніх двох рядків.

fє основною функцією, яка бере список цілих чисел і повертає a Bool.

Зауважте, що перші два ԁs (тільки) є символами кирилиці (Komi) Unicode, а перед першим є символ вкладки.

f	ԁ=zb[ԁ]id
zb[h:p:l]fz=z h p&&zb[p:l]fz
zb l fz=z 0 2
z 0z=z>z^0
z f fz|f<fz=z fz f|d<-fz=z d$f-d

Спробуйте в Інтернеті! або протестуйте його на собі.

Як це працює

  • fє основною функцією. Все, що він робить, це загорнути свій аргумент ԁу список однотонних (оскільки основне значення ASCII )робить круглі дужки набагато незручнішими, ніж квадратні дужки), та зателефонувати zbз цим та фіктивним аргументом (у функції Haskell idтрапляються лише правильні символи, які підходять тут).
    • Отримати один і той же символ, що підходить для обох =], неможливо за допомогою простого ASCII, тому аргумент названий двобайтовим символом Unicode CYRILLIC SMALL LETTER KOMI DE (ԁ), кодовим значенням 3*7*61=U+0501, яке відповідає всім цим і [.
      • Оскільки кодова точка не є рівним (найменший варіант, який є юридичним ідентифікатором, а також використовує навіть три байти), для цього потрібно використовувати символ табуляції, а не пробіл перед ним.
      • Сім байт більше звичайний варіант ASCII є перейменувати аргумент: f fz|bf<-fz=zb[bf]fz.
  • zbбере два аргументи, список однотонних, елементом якого є реальний список чисел, що повторюються, і фіктивний аргумент, fzнеобхідний лише для отримання a zперед функцією =s.
    • Коли внутрішній список містить щонайменше два елементи, функція zвикликається з першими двома (названими hта p), і якщо це повертається True, zbповторюється в кінці p:lсписку.
    • Якщо внутрішній список містить менше двох елементів, zbповертається True. Оскільки =повинен слідувати персонаж z, найпростіший спосіб зробити це - використовувати виклик zфункції, яка сама, як відомо, повертається True.
  • zбере два аргументи і рекурсивно обчислює їх найбільший спільний дільник, використовуючи віднімання (будь-яке інше відповідне ціле ділення або функція gcd недоступне), повертаючи, Trueякщо воно більше одного.
    • Рекурсія закінчується, коли перший аргумент є 0, другий аргумент - gcd. У цьому рядку також названо другий аргумент z. Тут персонаж 1незручний, тому z^0використовується для отримання номера один.
    • В іншому випадку, якщо перший аргумент fменший за другий fz, вони zпоміняються місцями і повторюються.
    • В іншому випадку менший аргумент віднімається від більшого, а потім zповторюється (також замінюючи аргументи, хоча це просто для уникнення дужок.)

2
Я знав, що там повинна бути якась мова, що не гольфу, яка могла б її витягнути!
Лінн

2
@Lynn Це дійсно допомагає Haskell у такому виклику, що він має досить виразний синтаксичний підмножина з просто одно символьними лексемами. Я думаю, що це приблизно на півдорозі до мови для гольфу.
Ørjan Johansen

Через кирилицю це справді 100 байт? Користувальний сценарій Code Golf Graduation повідомляє про 102 байти UTF-8, але я не знаю, чи це точно / це правильний спосіб підрахунку байтів тут. Неважливо, скільки байтів, це дійсно вражає!
Марк С.

1
@MarkS. TIO повідомляє про 100 байт (і 98 символів). Я підозрюю, що вас зловив символ вкладки, який SE відображає як 3 пробіли (який потім копіюється як такий). Я думаю, я бачив, як хтось використовував попередні теги, щоб уникнути цього, дозвольте спробувати виправити це.
Ørjan Johansen

@MarkS. Зроблено. Хоча я підозрюю, що це може просто сплутати цей сценарій користувача ще більше.
Ørjan Johansen

10

05AB1E , 8 байт

Код

ü‚ÒüÃP≠P

Використовується кодування 05AB1E , яке дає нам наступний перелік кодових точок:

hex: [0xFC, 0x82, 0xD2, 0xFC, 0xC3, 0x50, 0x16, 0x50]
dec: [252,  130,  210,  252,  195,  80,   22,   80]

Спробуйте в Інтернеті! або Перевірте вихідний код!

Пояснення

Оскільки оператор gcd ( ¿) має основну точку коду, мені довелося шукати інші способи перевірки первинності:

ü‚          # Get an array of adjacent pairs of the input
  Ò         # Factorize both elements of each pair in the array
   üà       # For each pair, get the intersection of both prime factorization lists
     P      # Product of each intersection (this leaves 1 when there is no intersection)
      ≠     # Check for each element whether it does not equal 1
       P    # Product of the booleans

Які кодові пункти це на кодовій сторінці 05AB1E? Чи можете ви додати їх у відповідь?
Містер Xcoder

@ Mr.Xcoder додано
Аднан

Будь-яка причина для Òпонад f?
Чарівний восьминіг Урна

10

Лушпиння , 8 байт

Для входів Truthy він повертає додатне ціле число, для Falsy - 0

←▼`Ṡt(ż⌋

Спробуйте в Інтернеті! і випробувано на власних кодових точках

Використовує кодову сторінку Husk

Source -- [ ←  , ▼  , `  , Ṡ  , t  , (  , ż  , ⌋  ]
Hex    -- [0x06,0xbd,0x60,0xd0,0x74,0x28,0xeb,0x8d]
Dec    -- [6   ,189 ,96  ,208 ,116 ,40  ,235 ,141]

Пояснення

          -- implicit input, e.g                                  [63,36,18,3]
  `       -- flip the args of the next function
   Ṡ      -- some combinator (Ṡ f g x = f (g x) x)
    t     -- tail                                                 [36,18,3]
      ż   -- zipWith (note, keeps trailing elems of longer list)  [(63,36),(36,18),(18,3),(3)]
       ⌋  -- gcd                                                  [9,9,3,3]
     (    -- used just to match restricted source criteria
 ▼        -- minimum of the list                                    3
←         -- minus 1                                                2

Як називається позначення, яке ви використовуєте в поясненні ? Я бачу це і на документах у стовпці "тип" на сторінці команд, і я не можу обернути його, тому хочу переглянути його, щоб я міг його вивчити.
Джонатан Аллан

@JonathanAllan Це визначення функції в синтаксисі Haskell. Це перекладається приблизно на Ṡ(f,g,x) = f(g(x),x)більш загальні мови.
Згарб


Хоча, коли перевернути, це стає`Ṡ g f x = Ṡ f g x = f (g x) x
H.PWiz

1
@JonathanAllan Якщо ви приєднаєтесь до балачки Husk , ми можемо спробувати пояснити це там краще.
Zgarb

5

Japt , 8 7 байт

äj d¹¥Z

Перевірте це в Інтернеті!

Кодові бали:

Char    ä   j       d   ¹   ¥   Z
Hex    e4  6a  20  64  b9  a5  5a
Dec   228 106  32 100 185 165  90

Пояснення

 äj d¹ ¥ Z
Uäj d) ==Z
             Implicit: U = input array, Z = 0
Uä           For each pair of items in the array:
  j            Return whether the two items are coprime.
    d)       Return true if any items are truthy, false otherwise.
       ==Z   Return whether this is equal to 0 (false -> true, true -> false).
             Implicit: output result of last expression

5

Желе , 11 9 байт

,Pnælð2\P

Збережено 2 байти завдяки @ Jonathan Allan .

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

У Jelly є своя сторінка коду, і кодові точки кожного символу є

Chr Hex Dec
,   2c   44
P   50   80
n   6e  110
æ   16   22
l   6c  108
ð   18   24
2   32   50
\   5c   92
P   50   80

Це тест на некоректні номери, перевіривши, чи немає lcm(a, b) != a*b. Можливо, буде коротше рішення, оскільки я тільки фільтрував символи з рівними кодовими точками.

Пояснення

,Pnælð2\P  Input: array A
      2\   For each overlapping sublist of size 2
     ð       Reduce it using this dyad
,              Pair
 P             Product
  n            Not equals, 1 if true else 0
   æl          LCM
        P  Product

Геніальний! Це неймовірно: O
Містер Xcoder

,це навіть ви можете зробити æln,P¥ð2\на два менше. Редагувати: Я відкинув трейлінг P, зробіть це менше: p)
Джонатан Аллан

О так, поміняйте аргументи навіть :)
Джонатан Аллан

5

TI-BASIC, 38 байт

Input L1:ΔList(cumSum(L1:augment(Ans+V,V+{0:2>sum(AnsL1=lcm(Ans+V,V+L1

TI-BASIC є токенізованим в одно- або двобайтові лексеми, як перераховано тут .

Найскладнішими частинами цього рішення були:

  1. Маркер кома є простим числом (43), що змушує мене оточити його кратними 43 (в даному випадку токеном V, який дорівнює 86).

  2. Gcd (маркер - це велике просте число (47881), це означає, що його взагалі не можна було використовувати.

Жетони цієї програми виходять для:

token     hex     dec
Input     0xDC    220
L1        0x5D00  23808
:         0x3E    62
ΔList(    0xBB2C  47916
cumSum(   0xBB29  47913
L1        0x5D00  23808
:         0x3E    62
augment(  0x14    20
Ans       0x72    114
+         0x70    112
V         0x56    86
,         0x2B    43
V         0x56    86
+         0x70    112
{         0x08    8
0         0x30    48
:         0x3E    62
2         0x32    50
>         0x6C    106
sum(      0xB6    182
Ans       0x72    114
L1        0x5D00  23808
=         0x6A    106
lcm(      0xBB08  47880
Ans       0x72    114
+         0x70    112
V         0x56    86
,         0x2B    43
V         0x56    86
+         0x70    112
L1        0x5D00  23808

Пояснення

Input L1:                   Prompt the user to input L1.

ΔList(cumSum(L1:            Take the differences of the prefix sum of L1,
                            which in effect removes the first element (result in Ans).

augment(Ans+V,V+{0:         Append a 0 to the end of Ans.
                            V defaults to 0, so adding it is a no-op.
                            Ans now holds L1 shifted to the left by one element,
                            with a 0 shifted in.

      AnsL1=lcm(Ans+V,V+L1  Take the least common multiple of each corresponding element
                            of Ans and L1, and check if each is equal to their product.
                            This returns a list of booleans, each 1 corresponding to
                            a co-prime pair. The last element (having been paired with 0)
                            will always be 1.

2>sum(                      Returns 1 if there is at most one 1 in the list, else 0.
                            Since the last element is always 1, this means
                            we return 1 only if there are no co-prime pairs.

3

Pyth , 15 байт

&F.bPiFNP.TtBQQ

Спробуйте тут або перевірити тестовий сюїт.

Це спільні зусилля між Еріком Аутгольфером та містером Xcoder . Повертає непослідовне значення (не порожній список) для truthy та порожній список для хибного.


ASCII-значення

[38, 70, 46, 98, 80, 105, 70, 78, 80, 46, 84, 116, 66, 81, 81]

На які поділяють такі фактори:

[2, 2, 2, 2, 5, 35, 2, 2, 2, 2, 4, 2, 3, 81]

Пояснення

&F.bPiFNP.TtBQQ
           tBQ   Return [Q, Q[1:]] (Q = eval first line of input)
         .T      Transpose ^ without cropping absences
        P        Remove last element of ^
  .b          Q  Map in parallel on ^ (N) and Q (Y, ignored)
     iFN           GCD of N
    P              Prime factors of ^ (P(1) = [])
&F               Left fold (reduce) the result of the map with Logical AND (short-circuiting)

Без вимоги з це була б 7 - байтова версія, яка виконала би те саме завдання (-2 завдяки FryAmTheEggman ):

-1iVt

Пояснення

-1iVtQQ  Implicit QQ at the end
    tQ   Return Q[1:]
  iV  Q  Vectorized GCD on ^ and Q
-1       Remove every element of ^ from [1] (implicit singleton)

З цікавості, навіщо вам потрібні Qs в кінці?
ETHproductions

@ETHproductions Оскільки .bмає змінні артуалі, і за допомогою неявного введення означає, що він вибере найнижчий (1) замість призначеного (2).
Ерік Аутгольфер
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.