Eşbaşkan komşu yok


33

Pozitif tamsayıların bir listesi verildiğinde, içindeki her bir bitişik tamsayı çiftinin bir ana faktörü paylaşıp paylaşmadığını çıktılayın. Başka bir deyişle, çıkış truthy ancak ve ancak hiçbir listede iki komşu tamsayılar eş asal vardır.

Yine başka terimlerle: [a 1 a 2 … a n ] pozitif tamsayıların bir listesi verildiğinde , çıktının çıkıp çıkmadığı

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

Liste her zaman en az iki öğe içerecektir (n ≥ 2).

Ancak…

Bu zorluk aynı zamanda : cevabınızdaki kod noktaları (içinde hangi kod sayfası varsa olabilir) programınızın kontrol ettiği koşulu sağlamalıdır.

Örneğin, print 2geçerli bir programdır. Unicode kod noktalarının bir listesi olarak , bu koşulu sağlayan [112 114 105 110 116 32 50] : 112 ve 114 , 2 faktörünü paylaşır ; ve 114 ve 105 pay bir etken 3 , vs.

Ancak, mainolabilir değil (üzgünüm!), Unicode ait codepoints gibi geçerli programda meydana mve ayani 109 ve 97 , göreceli asal vardır. (Neyse ki, gönderiminizin eksiksiz bir program olmasına gerek yok!)

Programınız kod noktası 0 içeremez.

Test durumları

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

Bu : bayt cinsinden en kısa kod kazanır.


8
Normal bir programlama dilinde bu zorluğu çalışan herhangi birine, bu ASCII asal codepoints sahip karakterlerin listesi aşağıdadır: %)+/5;=CGIOSYaegkmq\DEL.
Cristian Lupascu

@ Lynn Gerçekler tutarlı olmak zorunda mı?
H.PWiz

1
@ H.PWiz Hayır! -
Lynn

Aslında bazı normal (golf oynamayan) maçlar için uygulanabilir olmasını düşündüm ve bunun print 2geçerli olduğunu fark ettiğimde umutlu hissediyordum , ancak );=aeasal olmak gerçekten zor, bunu düşünmedim… Acaba Haskell gibi bir şey yapabilir mi? rekabet?
Lynn

Bu kısıtlama, bu sorunun tersine daha kolaydır , hiç kimsenin 0x02 bayt kullanmadığını varsayalım. Bu soru nongolf'a Mathematica, Logo, Haskell, Python, Perl, TI-BASIC'de geçerli bir cevap veriyor. Bunun bir Haskell'i var, bence Mathematica imkansız, ama Logo henüz çözümü yapmamama rağmen, muhtemelen mümkün görünüyor.
user202729

Yanıtlar:


15

MATL , 14 bayt

!TM1*Zdl2$Xdl-

Bu, truti olarak sıfır olmayan sayıların boş olmayan bir sütun vektörünü veya sahte olarak en az sıfır giriş içeren bir vektör verir.

açıklama

!     % 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
Bir cevap tebrikler yok tatmin kısıtlı kaynak gereksinimi!
Outgolfer Erik

13

Haskell , 103 100 bayt

DÜZENLE:

  • -3 bayt: d<-fzSon iki çizgiyi birleştirmek ve kısaltmak için bir bekçi kullanılır .

ftamsayıların listesini alan ve döndüren ana işlevdir Bool.

İlk iki ԁs'nin (sadece) Kiril (Komi) Unicode karakterleri olduğunu ve birinciden önce bir sekme karakteri olduğunu unutmayın.

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

Çevrimiçi deneyin! veya kendi kendine test edin.

Nasıl çalışır

  • fana işlevidir. Tek yaptığı ԁlisteyi argümanını tekil bir listeye sarmaktır (aslın ASCII değeri )parantezleri köşeli parantezlerden daha kullanışsız hale getirir) ve zbbununla çağırarak kukla bir argüman (Haskell işlevi iduygun olan doğru karakterlere sahip olur) İşte).
    • Her ikisine de aynı karakteri sığdırmak =], düz ASCII ile mümkün değildir, bu nedenle argüman , bunlara uyan 2 baytlık Unicode karakteri CYRILLIC SMALL LETTER KOMI DE (ԁ)ve kod noktası değeri 3*7*61=U+0501ile adlandırılır [.
      • Kod noktası bile (yasal bir tanımlayıcı olan ve aynı zamanda üç bayt kullanan en küçük seçenek) olmadığından, bunun için boşluktan önce sekme karakteri kullanmak gerekir.
      • Yedi bayt uzun ASCII seçeneği argüman adlandırmak etmektir: f fz|bf<-fz=zb[bf]fz.
  • zbiki argüman alır, elemanı üzerinde yinelenen sayıların gerçek listesi olan tekil bir liste ve fzsadece zfonksiyonun önüne geçmek için gerekli olan bir argüman alır =.
    • İç listesi, en az iki elemana sahiptir, fonksiyon z(adı verilen ilk iki çağrılır hve p) ve bu geri dönüş durumunda True, zbkuyruk recurses p:llistenin.
    • İç listede ikiden az eleman varsa, zbdöner True. Yana =ihtiyaçlar karakteri tarafından takip edilecek z, bunu yapmanın en basit yolu bir çağrı kullanmaktır zkendisi dönüş bilinmektedir, bu işleve True.
  • ziki argüman alır ve en büyük ortak bölenini çıkarma işlemini ( Truebirden fazla ilgili tamsayılı bölme veya gcd işlevi kullanılamaz) kullanıp , birden büyükse geri döndürerek hesaplar .
    • Özyineleme birinci argüman olduğunda 0, ikinci argüman ise gcd olur. Bu satırda ikinci argüman da adlandırılır z. Karakter 1burada garip z^0olduğu için bir numarayı almak için kullanılır.
    • Aksi takdirde, ilk argüman fikinciden daha küçükse fz, bunlar değiştirilir ve ztekrarlar.
    • Aksi takdirde, daha küçük olan argüman daha büyük zolandan çıkarılır, daha sonra tekrarlanır (yalnızca parantezlerden kaçınmak için de olsa argümanları değiştirir).

2
Ben biliyordum bunu başarabildiği olmayan bazı golf dili olmalıydı!
Lynn

2
@Lynn Haskell'in bu tür bir mücadelede, sadece tek karakterli simgeleri olan oldukça etkileyici bir sözdizimsel alt kümesine sahip olması gerçekten yardımcı olur. Sanırım bir golf diline giden yolun yarısı kadar.
Ørjan Johansen

Kiril yüzünden, bu gerçekten 100 bayt mı? Kod Golf Mezuniyet userscript 102 UTF-8 bayt bildirir, ancak saymak için doğru yolu var 's doğru / burada bayt ise bilmiyorum. Kaç bayt olursa olsun, gerçekten etkileyici!
Mark S.,

1
@MarkS. TIO 100 bayt (ve 98 karakter) bildirir. SE'nin 3 boşluk olarak gösterdiği (sonradan kopyalandığı gibi) sekme karakteri tarafından yakalandığınızdan şüpheleniyorum. Sanırım bunu önlemek için ön etiketler kullanan birini gördüm, düzeltmeye çalışmama izin verin.
Ørjan Johansen

@MarkS. Bitti. Her ne kadar bunun sadece bu kullanıcı klibini daha fazla karıştırdığından şüpheleniyorum.
Ørjan Johansen

10

05AB1E , 8 bayt

kod

ü‚ÒüÃP≠P

Bize aşağıdaki kod noktalarının listesini veren 05AB1E kodlamasını kullanır :

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

Çevrimiçi deneyin! veya Kaynak kodunu doğrulayın!

açıklama

Gcd operatöründen beri (¿ ) bir ana kod noktasına sahip olduğundan, eşitliği kontrol etmek için başka yollar aramalıydım:

ü‚          # 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'nin kod sayfasında bunun kod noktaları nelerdir? Onları cevaba ekleyebilir misin?
Bay Xcoder

@ Mr.Xcoder eklendi
Adnan

Bunun için herhangi bir sebep Òvar fmı?
Magic Octopus Urn,

10

Kabuğu , 8 bayt

Truthy girdileri için pozitif bir tamsayı döndürür, Falsy için 0 döndürür

←▼`Ṡt(ż⌋

Çevrimiçi deneyin! ve kendi kod noktaları üzerinde test edilmiştir.

Husk'in kod sayfasını kullanır

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

açıklama

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

Bu açıklamada kullandığınız notasyon ne için ? Dokümanlar sayfasındaki komutlar sayfasındaki "type" sütununda da görüyorum ve kafamı bulamıyorum bu yüzden bakmak istiyorum, böylece öğrenebilirim.
Jonathan Allan,

@ JonathanathanAllan Haskell'in sözdizimindeki fonksiyonun tanımı . Kabaca Ṡ(f,g,x) = f(g(x),x)daha genel dillere çevirir .
Zgarb


Her ne kadar, saygısız olduğunda, olur`Ṡ g f x = Ṡ f g x = f (g x) x
H.PWiz

1
@JonathanAllan Eğer Husk sohbet odasına katılırsan, orada daha iyi açıklamaya çalışabiliriz.
Zgarb

5

Japt , 8 7 bayt

äj d¹¥Z

Çevrimiçi test edin!

Kod noktaları:

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

açıklama

 ä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

Jöle , 11 9 bayt

,Pnælð2\P

@ Jonathan Allan sayesinde 2 bayt kaydedildi .

Çevrimiçi deneyin!

Jelly kendi kod sayfasına sahiptir ve her karakterin kod noktalarıdır.

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

Bu, koprime sayıları olup olmadığını kontrol ederek test eder lcm(a, b) != a*b. Kod noktaları bile olan karakterleri filtreledim, çünkü daha kısa bir çözüm olabilir.

açıklama

,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! Bu inanılmaz: O
Bay Xcoder

,Öyle olsa bile æln,P¥ð2\, iki daha az için yapabilirsiniz . Düzenleme: İzini düşürdüm, Pbirini daha da azına düşürdüm : p)
Jonathan Allan,

Evet, tartışmaları bile değiştirebilirim :)
Jonathan Allan,

5

TI-BASIC, 38 bayt

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

TI-BASIC, burada listelendiği gibi, bir veya iki baytlık tokenlere belirtilmiştir .

Bu çözümün en zor kısımları şunlardı:

  1. Virgül belirteci (43), beni 43 katları ile çevrelemeye zorluyor (bu durumda 86 olan V belirteci).

  2. Gcd (belirteç, büyük bir asal sayıdır (47881), bu da hiç kullanılamayacağı anlamına gelir.

Bu programın belirteçleri şöyle:

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

açıklama

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 bayt

&F.bPiFNP.TtBQQ

Burada dene ya da Test Suite'i inceleyin.

Bu, Outgolfer Erik arasında ortak bir çabadır. ve Bay . Hakikat için tutarsız bir değer (boş olmayan liste) ve sahte için boş liste döndürür.


ASCII değerleri

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

Aşağıdaki faktörleri paylaşan:

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

açıklama

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

Olmadan gereksinimi, bu bir olurdu 7 aynı görevi (-2 sayesinde gerçekleştirerek 5 bayt sürümü FryAmTheEggman ):

-1iVt

açıklama

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

Meraktan, neden Qsonunda ihtiyaç duyuyorsun ?
ETHProductions

@ETHproductions Çünkü .bdeğişken aritelere sahiptir ve örtük girdi kullanmak, amaçlandığı yerine (2) en düşük değeri (1) seçer.
Outgolfer Erik,
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.