Không có hàng xóm đồng


33

Đưa ra một danh sách các số nguyên dương, xuất ra liệu mọi cặp số nguyên liền kề trong nó có chung một thừa số không. Nói cách khác, đầu ra trung thực khi và chỉ khi không có hai số nguyên lân cận nào trong danh sách là đồng nguyên tố.

Về chưa khác: cho một danh sách các số nguyên dương [a 1 một 2 ... một n ] , đầu ra cho dù

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

Danh sách sẽ luôn chứa ít nhất hai phần tử (n 2).

Tuy nhiên…

Thách thức này cũng : các điểm mã trong câu trả lời của bạn (bất kỳ mã hóa nào có thể có) phải đáp ứng điều kiện chương trình của bạn kiểm tra.

Ví dụ, print 2là một chương trình hợp lệ. Như một danh sách các mã điểm Unicode, nó là [112 114 105 110 116 32 50] , đáp ứng điều kiện này: 112114 chia sẻ hệ số 2 ; và 114105 chia sẻ hệ số 3 , v.v.

Tuy nhiên, maincó thể không xảy ra trong một chương trình hợp lệ (xin lỗi!), Như codepoints Unicode của ma, cụ thể là 10997 , là nguyên tố cùng nhau. (Rất may, bài nộp của bạn không cần phải là một chương trình đầy đủ!)

Chương trình của bạn không được phép chứa mã số 0.

Các trường hợp thử nghiệm

Sự thật:

[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

Giả mạo:

[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

Đây là : mã ngắn nhất tính bằng byte thắng.


8
Đối với bất kỳ ai đang thực hiện thử thách này bằng ngôn ngữ lập trình bình thường, đây là danh sách các ký tự có mã số nguyên tố trong ASCII : %)+/5;=CGIOSYaegkmq\DEL.
Cristian Lupascu

@Lynn Do Truthys có nhất quán không?
H.PWiz

1
@ H.PWiz Không! -
Lynn

Tôi thực sự dự định điều này có thể thực hiện được đối với một số người lang bình thường (không chơi gôn) và tôi cảm thấy hy vọng khi nhận thấy điều đó print 2là hợp lệ, nhưng );=aethực sự rất khó khăn, tôi đã không nghĩ rằng một điều gì đó như Haskell có thể tranh đua?
Lynn

Hạn chế này dễ hơn so với câu hỏi ngược lại , giả sử không ai sử dụng byte 0x02. Câu hỏi đó nhận được câu trả lời hợp lệ của nongolf trong Mathematica, Logo, Haskell, Python, Perl, TI-BASIC. Cái này đã có Haskell, tôi nghĩ Mathicala là không thể, nhưng Logo có vẻ rất khả thi, mặc dù tôi chưa hoàn thành việc xây dựng giải pháp.
dùng202729

Câu trả lời:


15

MATL , 14 byte

!TM1*Zdl2$Xdl-

Điều này đưa ra một vectơ cột không trống của các số khác không là trung thực hoặc một vectơ chứa ít nhất một mục nhập 0 là sai.

Giải trình

!     % 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
Chúc mừng một câu trả lời mà không đáp ứng các hạn chế nguồn yêu cầu!
Erik the Outgolfer

13

Haskell , 103 100 byte

CHỈNH SỬA:

  • -3 byte: Được sử dụng một bộ d<-fzbảo vệ để hợp nhất và rút ngắn hai dòng cuối cùng.

flà hàm chính, lấy danh sách các số nguyên và trả về a Bool.

Lưu ý rằng hai ԁ( đầu tiên ) là các ký tự Unicode Cyrillic (Komi) và có một ký tự tab trước ký tự đầu tiê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

Hãy thử trực tuyến! hoặc tự kiểm tra nó.

Làm thế nào nó hoạt động

  • flà chức năng chính. Tất cả những gì nó làm là bao bọc đối số của nó ԁtrong một danh sách đơn (vì giá trị ASCII chính )làm cho dấu ngoặc đơn khó sử dụng hơn dấu ngoặc vuông) và gọi zbvới đối số đó và một đối số giả (hàm Haskell idxảy ra chỉ có các ký tự phù hợp đây).
    • Không thể có cùng một ký tự để phù hợp với cả hai =]ký tự đơn giản với ASCII đơn giản, do đó, đối số được đặt tên bằng ký tự Unicode 2 byte CYRILLIC SMALL LETTER KOMI DE (ԁ), giá trị mã hóa 3*7*61=U+0501, phù hợp với tất cả các ký tự và [.
      • Vì codepoint không phải là chẵn (tùy chọn nhỏ nhất là định danh hợp pháp và thậm chí sử dụng ba byte), nên điều này bắt buộc phải sử dụng ký tự tab thay vì khoảng trắng trước nó.
      • Tùy chọn ASCII đơn giản dài hơn bảy byte là đổi tên đối số : f fz|bf<-fz=zb[bf]fz.
  • zbcó hai đối số, một danh sách đơn có phần tử là danh sách thực của các số được đệ quy và một đối số giả fzchỉ cần để có được ztrước một hàm của hàm =.
    • Khi danh sách bên trong có ít nhất hai phần tử, hàm zđược gọi với hai phần tử đầu tiên (được đặt tên hp) và nếu trả về True, sẽ zbđệ quy ở phần đuôi p:lcủa danh sách.
    • Nếu danh sách bên trong có ít hơn hai yếu tố, zbtrả về True. Vì =cần phải được theo sau bởi ký tự z, cách đơn giản nhất để làm điều này là sử dụng một cuộc gọi của zhàm mà chính nó được biết là trả về True.
  • zlấy hai đối số và tính toán đệ quy ước số chung lớn nhất của chúng bằng phép trừ (mọi phép chia số nguyên hoặc hàm gcd có liên quan khác đều không khả dụng), trả về Truenếu nó lớn hơn một.
    • Đệ quy kết thúc khi đối số thứ nhất là 0, với đối số thứ hai là gcd. Trên dòng này, đối số thứ hai cũng được đặt tên z. Nhân vật 1này vụng về ở đây nên z^0được sử dụng để có được số một.
    • Mặt khác, nếu đối số thứ nhất fnhỏ hơn đối số thứ hai fz, chúng được hoán đổi và zđệ quy.
    • Mặt khác, đối số nhỏ hơn được trừ từ lớn hơn, sau đó zđệ quy (cũng hoán đổi các đối số, mặc dù đó chỉ là để tránh dấu ngoặc đơn.)

2
Tôi biết rằng phải có một số ngôn ngữ phi golf có thể kéo nó ra!
Lynn

2
@Lynn Nó thực sự giúp Haskell trong loại thử thách này rằng nó có một tập hợp cú pháp khá biểu cảm chỉ với các mã thông báo một ký tự. Đó là khoảng một nửa cho một ngôn ngữ golf, tôi đoán.
Ørjan Johansen

Vì Cyrillic, đây có thực sự là 100 byte không? Bản mô tả người dùng tốt nghiệp Code Golf báo cáo 102 byte UTF-8, nhưng tôi không biết liệu nó có chính xác không / đó là cách đúng để đếm các byte ở đây. Cho dù có bao nhiêu byte, nó thực sự ấn tượng!
Đánh dấu S.

1
@Điểm. TIO báo cáo 100 byte (và 98 ký tự). Tôi nghi ngờ bạn đã bị bắt bởi ký tự tab, SE hiển thị dưới dạng 3 khoảng trắng (sau đó được sao chép như vậy). Tôi nghĩ rằng tôi đã thấy ai đó sử dụng các thẻ trước để tránh điều đó, hãy để tôi thử sửa nó.
Ørjan Johansen

@Điểm. Làm xong. Mặc dù tôi nghi ngờ rằng có thể chỉ nhầm lẫn rằng usercript thậm chí nhiều hơn.
Ørjan Johansen

10

05AB1E , 8 byte

ü‚ÒüÃP≠P

Sử dụng mã hóa 05AB1E , cung cấp cho chúng tôi danh sách các điểm mã sau:

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

Hãy thử trực tuyến! hoặc Xác minh mã nguồn!

Giải trình

Vì toán tử gcd ( ¿) có điểm mã nguyên tố, tôi phải tìm các cách khác để kiểm tra tính đồng nhất:

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

Điểm mã này có gì trong trang mã của 05AB1E? Bạn có thể thêm chúng vào câu trả lời?
Ông Xcoder

@ Mr.Xcoder đã thêm
Adnan

Bất kỳ lý do cho Òhơn f?
Bạch tuộc ma thuật Urn

10

Husk , 8 byte

Đối với các đầu vào Truthy, nó trả về một số nguyên dương, đối với Falsy, nó trả về 0

←▼`Ṡt(ż⌋

Hãy thử trực tuyến! và được thử nghiệm trên các điểm riêng của mình

Sử dụng bảng mã của Husk

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

Giải trình

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

Ký hiệu được gọi là bạn sử dụng trong giải thích là gì? Tôi cũng thấy nó trên các tài liệu trong cột "loại" trên trang lệnh và không thể quay đầu lại vì vậy tôi muốn tìm kiếm nó để tôi có thể tìm hiểu nó.
Jonathan Allan

@Jonathan ALLan Đó là định nghĩa của hàm theo cú pháp của Haskell. Nó dịch đại khái sang Ṡ(f,g,x) = f(g(x),x)các ngôn ngữ chính hơn.
Zgarb


Mặc dù, khi lật, nó trở thành`Ṡ g f x = Ṡ f g x = f (g x) x
H.PWiz

1
@Jonathan ALLan Nếu bạn tham gia phòng chat Husk , chúng tôi có thể cố gắng giải thích điều đó tốt hơn ở đó.
Zgarb

5

Japt , 8 7 byte

äj d¹¥Z

Kiểm tra nó trực tuyến!

Mã điểm:

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

Giải trình

 ä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

Thạch , 11 9 byte

,Pnælð2\P

Đã lưu 2 byte nhờ @ Jonathan Allan .

Hãy thử trực tuyến!

Jelly có trang mã riêng và các điểm mã của mỗi ký tự là

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

Điều này kiểm tra các số không trùng lặp bằng cách kiểm tra nếu lcm(a, b) != a*b. Có thể có một giải pháp ngắn hơn khi tôi vừa lọc các ký tự có cả điểm mã.

Giải trình

,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

Thiên tài! Điều này thật phi thường: O
Ông Xcoder

,thậm chí là để bạn có thể làm æln,P¥ð2\cho hai ít hơn. Chỉnh sửa: Tôi bỏ dấu vết P, làm cho nó bớt đi: p)
Jonathan Allan

Ồ vâng, trao đổi các đối số thậm chí :)
Jonathan Allan

5

TI-BASIC, 38 byte

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

TI-BASIC được mã hóa thành mã thông báo một hoặc hai byte, như được liệt kê ở đây .

Phần khó nhất của giải pháp này là:

  1. Mã thông báo dấu phẩy là số nguyên tố (43), buộc tôi phải bao quanh nó với bội số của 43 (trong trường hợp này là mã thông báo V, là 86).

  2. Gcd (mã thông báo là một số nguyên tố lớn (47881), có nghĩa là nó không thể được sử dụng.

Các mã thông báo cho chương trình này được đưa ra:

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

Giải trình

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

Bình thường , 15 byte

&F.bPiFNP.TtBQQ

Dùng thử tại đây hoặc Kiểm tra Test Suite.

Đây là một nỗ lực hợp tác giữa Erik the OutgolferMr. Xcoder . Trả về một giá trị không nhất quán (danh sách không trống) cho tính trung thực và danh sách trống cho giả.


Giá trị ASCII

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

Chia sẻ các yếu tố sau:

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

Giải trình

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

Nếu không có yêu cầu , đây sẽ là phiên bản 7 5 byte hoàn thành cùng một nhiệm vụ (-2 nhờ FryAmTheEggman ):

-1iVt

Giải trình

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

Vì tò mò, tại sao bạn cần Qs ở cuối?
Sản phẩm ETH

@ETHproductions Vì .bcó các mức độ khác nhau và sử dụng đầu vào ẩn có nghĩa là nó sẽ chọn mức thấp nhất (1) thay vì sau đó dự định (2).
Erik the Outgolfer
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.