互いに素な近傍はありません


33

正の整数のリストが与えられた場合、隣接する整数のペアがすべて素因数を共有するかどうかを出力します。言い換えると、リスト内の隣接する2つの整数が互いに素でない場合にのみ、真実を出力します。

さらに他の言葉で:正の整数のリスト[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。

リストには常に少なくとも2つの要素が含まれます(n≥2)。

しかしながら…

この課題はもあります。答えのコードポイント(コードページがどのようなものであっても)は、プログラムがチェックする条件を満たさなければなりません。

たとえばprint 2、有効なプログラムです。Unicodeコードポイントのリストとしては[112 114 105 110 116 32 50]であり、これはこの条件を満たします。1121142の係数を共有します。そして114及び105の共有A因子3、等

しかし、mainすることができません(すみません!)、ユニコードのコードポイントとして有効なプログラムで発生mし、aすなわち、10997、互いに素です。(ありがたいことに、提出は完全なプログラムである必要はありません!)

プログラムにコードポイント0を含めることは許可されていません。

テストケース

真実:

[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 Truthysは一貫している必要がありますか?
H.PWiz

1
@ H.PWizいや!—
リン

実際にこれをいくつかの通常の(ゴルフ以外の)ラングで実行可能にすることを意図し、それprint 2が有効であることに気付いたときに希望を感じていましたが);=ae、プライムであることは本当に難しいです、私はそれを考慮しませんでした...競争する?
リン

この制限は、この質問の逆よりも簡単です。誰も0x02バイトを使用しないと仮定します。その質問は、Mathematica、Logo、Haskell、Python、Perl、TI-BASICでゴルフ以外の有効な回答を得ます。これはすでにHaskellを取得しています。Mathematicaは不可能だと思いますが、Logoは可能性が高いように見えますが、ソリューションの構築はまだ行っていません。
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
答えおめでとう満足制限ソースの要件を!
エリックアウトゴルファー

13

Haskell103100バイト

編集:

  • -3バイト:d<-fzガードを使用して、最後の2行をマージおよび短縮しました。

fは、整数のリストを取り、を返すメイン関数Boolです。

最初の2つԁ(のみ)はキリル文字(コミ)の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 (ԁ)であるcodepoint value 3*7*61=U+0501で命名され、これらすべてとに適合します[
      • コードポイントは偶数ではないため(正当な識別子であり、3バイトも使用する最小のオプション)、これにはスペースの代わりにタブ文字を使用する必要がありました。
      • 7バイト長のプレーンASCIIオプションは、引数の名前を変更することですf fz|bf<-fz=zb[bf]fz
  • zb2つの引数を取ります。要素が再帰される数値の実リストであるシングルトンリストと、関数のsの前fzにaを取得するためだけに必要な仮引数です。 z=
    • 内部リストに少なくとも2つの要素がある場合、関数zは最初の2つ(hpTruezb呼び出され、それが返される場合p:l、リストの末尾で再帰します。
    • 内部リストの要素が2つ未満の場合、をzb返しますTrue=文字が続く必要があるのでz、これをする最も簡単な方法はzそれ自体が返すことが知られている関数の呼び出しを使用することTrueです。
  • z2つの引数を取り、減算を使用して最大公約数を再帰的に計算し(他の関連する整数除算またはgcd関数が使用できない場合)、True1より大きい場合に戻ります。
    • 最初の引数がのときに再帰が終了0し、2番目の引数がgcdになります。この行では、2番目の引数にも名前が付けられていzます。キャラクター1はここで厄介なのでz^0、ナンバーワンを取得するために使用されます。
    • それ以外の場合、最初の引数fが2番目の引数より小さい場合fz、それらは交換され、z再帰されます。
    • それ以外の場合、小さい引数が大きい引数から減算され、z再帰されます(括弧を避けるためだけですが、引数も交換されます)。

2
それを引き出すことができる非ゴルフ言語がなければならないことを知っていました!
リン

2
@Lynn単一文字のトークンだけでかなり表現力豊かな構文サブセットを持っているというこの種の課題で、Haskellを本当に助けます。これはゴルフの言語のほぼ半分だと思います。
Ørjanヨハンセン

キリル文字のため、これは本当に100バイトですか?コードゴルフ卒業userscriptは 102 UTF-8バイトを報告しますが、それはここでバイトをカウントする正しい方法です正確/だ場合、私は知りません。バイト数に関係なく、それは本当に印象的です!
マークS。17年

1
@MarkS。TIOは100バイト(および98文字)を報告します。SEが3つのスペースとして表示するタブ文字に引っ掛かったのではないかと思われます(スペースはコピーされます)。私は誰かがそれを避けるためにプレタグを使用しているのを見たと思う、それを修正してみてください。
Ørjanヨハンセン

@MarkS。できた 私はそれがそのユーザースクリプトをさらに混乱させるかもしれないと思うが。
Ørjanヨハンセン

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ですか?
魔法のタコUr

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)、より主流の言語になります。
-Zgarb


ただし、反転すると、`Ṡ g f x = Ṡ f g x = f (g x) x
H.PWiz

1
@JonathanAllanあなたがHuskチャットルームに参加するなら、私たちはそこでもっとよく説明しようとすることができます。
-Zgarb

5

Japt8 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

@ Jonathan Allanのおかげで2バイト節約されました。

オンラインでお試しください!

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
Mr. Xcoder

,でもæln,P¥ð2\2つ少ないためにできることです。編集:私は末尾を落とし、Pそれを1つ減らします: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バイトまたは2バイトのトークンにトークン化されます

このソリューションの最も難しい部分は次のとおりです。

  1. カンマトークンは素数(43)であり、43の倍数(この場合は86のVトークン)で囲む必要があります。

  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

ここで試してみるか、テストスイートをチェックしてください。

これはErik the OutgolferMr. 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つの5バイトバージョンになります(FryAmTheEggmanのおかげで-2 )。

-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可変アリティがあるため、暗黙的な入力を使用すると、意図した(2)ではなく最低(1)を選択することになります。
エリックアウトゴルファー
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.