Нет соседних соседей


33

Учитывая список натуральных чисел, выведите, имеет ли каждая соседняя пара целых чисел в нем общий множитель. Другими словами, выведите truey тогда и только тогда, когда в списке нет двух соседних целых чисел.

В других терминах: учитывая список натуральных чисел [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 mи a, а именно 109 и 97 , взаимно просты. (К счастью, ваше представление не обязательно должно быть полной программой!)

Ваша программа не может содержать кодовую точку 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

Falsy:

[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.
Кристиан Лупаску

@ Линн Должны ли Истины быть последовательными?
H.PWiz

1
@ H.PWiz Нету! -
Lynn

Я на самом деле хотел, чтобы это было выполнимо для некоторых нормальных (не гольф-лангов), и я почувствовал надежду, когда заметил, что print 2это действительно так, но );=aeбыть премьер-министром действительно сложно, я не подумал об этом… Интересно, может ли что-то вроде Haskell конкурировать?
Линн

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

Ответы:


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
Поздравляет с ответом , который действительно удовлетворяет ограниченные исходные требования!
Эрик Outgolfer

13

Haskell , 103 100 байт

РЕДАКТИРОВАТЬ:

  • -3 байта: использовал d<-fzохрану для объединения и сокращения последних двух строк.

fявляется основной функцией, которая принимает список целых чисел и возвращает a Bool.

Обратите внимание, что первые два ԁs (только) - это символы кириллицы (коми) 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 невозможно получить один и тот же символ, кроме обоих, невозможно, поэтому аргумент именуется 2-байтовым символом Unicode CYRILLIC SMALL LETTER KOMI DE (ԁ), значением кодовой точки 3*7*61=U+0501, которое соответствует всем этим и [.
      • Поскольку кодовая точка не является четной (наименьшая опция, которая является допустимым идентификатором и даже использует три байта), для этого необходимо использовать символ табуляции вместо пробела перед ним.
      • Семь байт больше обычный вариант ASCII является переименовать аргумент: f fz|bf<-fz=zb[bf]fz.
  • zbпринимает два аргумента: одноэлементный список, элемент которого является реальным списком рекурсивных чисел, и фиктивный аргумент, fzнеобходимый только для получения zперед аргументами функции =.
    • Когда внутренний список имеет по крайней мере два элемента, функция 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 в решении такого рода задач, поскольку у него достаточно выразительное синтаксическое подмножество с односимвольными токенами. Наверное, это примерно на полпути к языку игры в гольф.
Орджан Йохансен,

Из-за кириллицы это действительно 100 байт? Пользовательский скрипт Code Golf Graduation сообщает 102 байта UTF-8, но я не знаю, является ли он точным / это правильный способ подсчета байтов здесь. Независимо от того, сколько байтов, это действительно впечатляет!
Марк С.

1
@Метки. TIO сообщает 100 байтов (и 98 символов). Я подозреваю, что вас поймал символ табуляции, который SE отображает как 3 пробела (который затем копируется как таковой). Я думаю, что я видел, как кто-то использовал предварительные теги, чтобы избежать этого, позвольте мне попытаться это исправить.
Эрджан Йохансен

@Метки. Выполнено. Хотя я подозреваю, что это может запутать пользователя еще больше.
Орджан Йохансен,

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 байт

Для входных данных True возвращает положительное целое число, для 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

Какую нотацию вы называете в объяснении ? Я также вижу это в документации в столбце "type" на странице команд и не могу разобраться с этим, поэтому хочу посмотреть его, чтобы я мог его изучить.
Джонатан Аллан

@JonathanAllan Это определение функции в синтаксисе Haskell. Это переводит примерно на Ṡ(f,g,x) = f(g(x),x)более распространенные языки.
Згарб


Хотя, когда перевернуто, это становится`Ṡ g f x = Ṡ f g x = f (g x) x
H.PWiz

1
@JonathanAllan Если вы присоединитесь к чату Husk , мы можем попытаться объяснить это лучше.
Згарб

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 байта благодаря @ Джонатану Аллану .

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

У желе есть своя собственная кодовая страница, а кодовые точки каждого символа

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

Genius! Это невероятно: O
Mr. 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

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

Это совместная работа Эрика Аутгольфера и мистера Xcoder . Возвращает противоречивое значение (непустой список) для правдивых и пустой список для ложных.


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)

Из любопытства, зачем вам Qв конце s?
ETHproductions

@ETHproductions Потому что .bимеет переменные арности, и использование неявного ввода означает, что он выберет самое низкое (1) вместо запланированного (2).
Эрик Outgolfer
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.