Brak sąsiadujących ze sobą głównych


33

Biorąc pod uwagę listę dodatnich liczb całkowitych, określ, czy każda sąsiednia para liczb całkowitych ma wspólny czynnik pierwszy. Innymi słowy, wypisz prawdę wtedy i tylko wtedy, gdy nie ma dwóch sąsiadujących liczb całkowitych na liście współrzędnych .

Innymi słowy: biorąc pod uwagę listę liczb całkowitych dodatnich [a 1 a 2 … a n ] , wypisz czy

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

Lista zawsze będzie zawierać co najmniej dwa elementy (n ≥ 2).

Jednak…

Wyzwanie to ma również : punkty kodowe w odpowiedzi (niezależnie od tego, w jakiej stronie kodowej może się znajdować) muszą spełniać warunek sprawdzany przez program.

Na przykład print 2jest poprawnym programem. Jako lista punktów kodowych Unicode jest to [112 114 105 110 116 32 50] , który spełnia ten warunek: 112 i 114 mają współczynnik 2 ; a 114 i 105 mają współczynnik 3 itd.

Nie mainmoże jednak wystąpić w prawidłowym programie (przepraszam!), Ponieważ punkty kodowe Unicode mi a, a mianowicie 109 i 97 , są chronione prawem autorskim. (Na szczęście zgłoszenie nie musi być pełnym programem!)

Twój program nie może zawierać punktu kodowego 0.

Przypadki testowe

Prawda:

[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

To jest : wygrywa najkrótszy kod w bajtach.


8
Dla każdego, kto próbuje to wyzwanie w normalnym języku programowania, jest to lista znaków, które mają prime codepoints ASCII: %)+/5;=CGIOSYaegkmq\DEL.
Cristian Lupascu,

@ Lynn Czy Truthys muszą być konsekwentni?
H.PWiz

1
@ H.PWiz Nie! -
Lynn,

Właściwie chciałem, aby było to wykonalne w przypadku niektórych normalnych (nie golfowych) języków i czułem nadzieję, kiedy zauważyłem, że print 2to jest ważne, ale );=aebycie najlepszym jest naprawdę trudne, nie pomyślałem o tym ... Zastanawiam się, czy coś takiego jak Haskell może rywalizować?
Lynn,

To ograniczenie jest łatwiejsze niż na odwrót tego pytania , zakładając, że nikt nie używa bajtu 0x02. Na to pytanie nie ma poprawnej odpowiedzi w Mathematica, Logo, Haskell, Python, Perl, TI-BASIC. Ten już dostał Haskella, myślę, że Mathematica jest niemożliwa, ale Logo wygląda na bardzo prawdopodobne, chociaż nie stworzyłem jeszcze rozwiązania.
user202729,

Odpowiedzi:


15

MATL , 14 bajtów

!TM1*Zdl2$Xdl-

W wyniku tego powstaje niepusty wektor kolumny niezerowych liczb jako prawda lub wektor zawierający co najmniej zero pozycji jako fałsz.

Wyjaśnienie

!     % 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
Gratulujemy odpowiedzi, która ma spełniać ten ograniczony source wymagania!
Erik the Outgolfer,

13

Haskell , 103 100 bajtów

EDYTOWAĆ:

  • -3 bajty: Użyto d<-fzosłony do scalenia i skrócenia dwóch ostatnich linii.

fjest główną funkcją, która pobiera listę liczb całkowitych i zwraca a Bool.

Zauważ, że pierwsze dwa ԁs (tylko) to znaki Unicode cyrylicy (Komi), a przed pierwszym jest znak tabulacji.

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

Wypróbuj online! lub przetestuj to na sobie.

Jak to działa

  • fjest główną funkcją. Wszystko, co robi, to zawija swój argument ԁna listę singletonów (ponieważ główna wartość ASCII )powoduje, że stosowanie nawiasów jest znacznie bardziej niewygodne niż nawiasy kwadratowe) i wywołuje się go zbwraz z argumentem zastępczym (funkcja Haskell idma odpowiednie znaki do dopasowania tutaj).
    • Dopasowanie tego samego znaku oprócz obu =]jest niemożliwe w zwykłym ASCII, więc argument nazywa się 2-bajtowym znakiem Unicode CYRILLIC SMALL LETTER KOMI DE (ԁ), wartością punktu kodowego 3*7*61=U+0501, która pasuje do wszystkich i [.
      • Ponieważ punkt kodowy nie jest nawet (najmniejsza opcja, która jest legalnym identyfikatorem, a także wykorzystuje nawet trzy bajty), wymagało to użycia znaku tabulacji zamiast spacji przed nim.
      • Siedmiu bajtów już zwykły opcja ASCII jest, aby zmienić nazwę argumentu f fz|bf<-fz=zb[bf]fz.
  • zbpobiera dwa argumenty, listę singletonów, której elementem jest prawdziwa lista liczb, które są rekurencyjne, oraz argument zastępczy fzpotrzebny tylko do uzyskania znaku zprzed funkcją =.
    • Gdy wewnętrzna lista zawiera co najmniej dwa elementy, funkcja zjest wywoływana z pierwszymi dwoma (nazwanymi hi p), a jeśli to się zwraca True, zbpowtarza się na końcu p:llisty.
    • Jeśli wewnętrzna lista zawiera mniej niż dwa elementy, zbzwraca True. Ponieważ =po znaku musi następować znak z, najprostszym sposobem na to jest użycie wywołania zfunkcji, o której wiadomo, że zwraca True.
  • zpobiera dwa argumenty i rekurencyjnie oblicza swój największy wspólny dzielnik za pomocą odejmowania (każdy inny odpowiedni podział na liczbę całkowitą lub funkcja gcd jest niedostępny), zwracając, Truejeśli jest większy niż jeden.
    • Rekurencja kończy się, gdy pierwszy argument jest 0, a drugim argumentem jest gcd. W tym wierszu jest także wymieniony drugi argument z. Postać 1jest tutaj niezręczna, więc z^0jest używana do uzyskania numeru jeden.
    • W przeciwnym razie, jeśli pierwszy argument fjest mniejszy niż drugi fz, są one zamieniane i zpowtarzane.
    • W przeciwnym razie mniejszy argument jest odejmowany od większego, a następnie zpowtarza się (również zamienia argumenty, chociaż po to, aby uniknąć nawiasów).

2
I wiedział , że musi być jakiś język non-golf, który mógłby pociągnąć ją!
Lynn,

2
@ Lynn To naprawdę pomaga Haskellowi w tego rodzaju wyzwaniu, że ma dość ekspresyjny podzbiór składniowy z tylko tokenami jednoznakowymi. Chyba w połowie drogi do języka golfowego.
Ørjan Johansen

Czy z powodu cyrylicy to naprawdę 100 bajtów? Kod Golf Graduation userscript donosi 102 bajtów UTF-8, ale nie wiem, czy to dokładna / to jest właściwy sposób zliczyć bajty tutaj. Nie ważne ile bajtów, to naprawdę imponujące!
Mark S.

1
@Znaki. TIO zgłasza 100 bajtów (i 98 znaków). Podejrzewam, że przyłapał cię znak tabulacji, który SE wyświetla jako 3 spacje (które następnie są kopiowane jako takie). Myślę, że widziałem, jak ktoś używa tagów wstępnych, aby tego uniknąć, pozwól mi to naprawić.
Ørjan Johansen

@Znaki. Gotowy. Chociaż podejrzewam, że może to jeszcze bardziej pomieszać ten skrypt użytkownika.
Ørjan Johansen

10

05AB1E , 8 bajtów

Kod

ü‚ÒüÃP≠P

Wykorzystuje kodowanie 05AB1E , które daje nam następującą listę punktów kodowych:

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

Wypróbuj online! lub Sprawdź kod źródłowy!

Wyjaśnienie

Ponieważ operator gcd ( ¿) ma punkt kodowy, musiałem poszukać innych sposobów sprawdzenia współodpowiedzialności:

ü‚          # 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

Jakie punkty kodowe ma to na stronie kodowej 05AB1E? Czy możesz dodać je do odpowiedzi?
Pan Xcoder,

@ Mr.Xcoder dodaje
Adnan

Masz powód do Òkońca f?
Magic Octopus Urn

10

Łuska , 8 bajtów

Dla danych Truthy zwraca dodatnią liczbę całkowitą, dla Falsy zwraca 0

←▼`Ṡt(ż⌋

Wypróbuj online! i przetestowane na własnych współrzędnych kodowych

Używa strony kodowej Husk

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

Wyjaśnienie

          -- 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

Jakiego zapisu używasz w wyjaśnieniu ? Widzę to również w dokumentacji w kolumnie „typ” na stronie poleceń i nie mogę się z tym pogodzić, więc chcę to sprawdzić, aby móc się tego nauczyć.
Jonathan Allan,

@JonathanAllan To jest definicja funkcji w składni Haskella. Przekłada się mniej więcej na Ṡ(f,g,x) = f(g(x),x)bardziej popularne języki.
Zgarb,


Chociaż po odwróceniu staje się`Ṡ g f x = Ṡ f g x = f (g x) x
H.PWiz

1
@JonathanAllan Jeśli dołączysz do czatu Husk , możemy spróbować wyjaśnić to lepiej.
Zgarb,

5

Japt , 8 7 bajtów

äj d¹¥Z

Przetestuj online!

Punkty kodowe:

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

Wyjaśnienie

 ä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

Galaretka , 11 9 bajtów

,Pnælð2\P

Zaoszczędź 2 bajty dzięki @ Jonathan Allan .

Wypróbuj online!

Galaretka ma własną stronę kodową, a współrzędne każdego znaku są

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

Sprawdza to, czy numery nie są chronione prawem autorskim poprzez sprawdzenie, czy lcm(a, b) != a*b. Może być krótsze rozwiązanie, ponieważ właśnie filtrowałem znaki z nawet punktami kodowymi.

Wyjaśnienie

,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

Geniusz! To niesamowite: O
Mr. Xcoder,

,jest nawet tak, że możesz zrobić æln,P¥ð2\za dwa mniej. Edycja: Porzuciłem końcowy P, sprawię, że mniej: p)
Jonathan Allan

O tak, zamień nawet argumenty :)
Jonathan Allan

5

TI-BASIC, 38 bajtów

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

TI-BASIC jest tokenizowany na jedno- lub dwubajtowe tokeny, jak tutaj wymienione .

Najtrudniejsze części tego rozwiązania to:

  1. Token przecinka jest liczbą pierwszą (43), co zmusza mnie do otoczenia go wielokrotnością 43 (w tym przypadku token V, czyli 86).

  2. Gcd (token jest dużą liczbą pierwszą (47881), co oznacza, że ​​nie można go w ogóle użyć.

Tokeny tego programu wychodzą na:

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

Wyjaśnienie

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 bajtów

&F.bPiFNP.TtBQQ

Wypróbuj tutaj lub sprawdź pakiet testowy.

Jest to wspólny wysiłek Erika the Outgolfer i pana Xcodera . Zwraca niespójną wartość (niepustą listę) dla prawdy i pustą listę dla fałszu.


Wartości ASCII

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

Które dzielą następujące czynniki:

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

Wyjaśnienie

&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)

Bez wymogu byłaby to 7 5-bajtowa wersja realizująca to samo zadanie (-2 dzięki FryAmTheEggman ):

-1iVt

Wyjaśnienie

-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)

Z ciekawości, dlaczego potrzebujesz Qs na końcu?
ETHproductions

@ETHproductions Ponieważ .bma zmienne aromaty, a użycie niejawnego wejścia oznacza, że ​​wybierze najniższą (1) zamiast zamierzonej (2).
Erik the Outgolfer
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.