プライマリストリング


27

プライマリ(binary-prime)文字列とは、バイナリグリッドとして記述されたときに、すべての行と列が総計を持つものです。

それはかなりあいまいな説明ですので、実際の例でそれを分解しましょう...


この例では、文字列を使用しますbunny

まず、各文字のASCIIコードポイントとそのバイナリ表現を見つけます。

Char | ASCII | Binary

b      98      1100010
u      117     1110101
n      110     1101110
n      110     1101110
y      121     1111001

これらのバイナリ値を上から下に取り、グリッドに配置します(必要に応じて先行ゼロを追加します)。

1 1 0 0 0 1 0
1 1 1 0 1 0 1
1 1 0 1 1 1 0
1 1 0 1 1 1 0
1 1 1 1 0 0 1

次に、1各行と列のs の数をカウントします。

1 1 0 0 0 1 0   > 3
1 1 1 0 1 0 1   > 5
1 1 0 1 1 1 0   > 5
1 1 0 1 1 1 0   > 5
1 1 1 1 0 0 1   > 5

v v v v v v v

5 5 2 3 3 3 2

すべての合計が素数(ここなど)である場合にのみ、文字列は有効なバイナリ素数です。


チャレンジ

あなたの仕事は、文字列が与えられたときにtruthy、その文字列が一次であればfalsyそれ以外の場合はそれを返す/出力する関数またはプログラムを作成することです。

ルール/詳細

  • 文字列の文字は常にASCII範囲33-126(両端を含む)であると想定できます。
  • 文字列は空になりません。
  • プライマリ文字列はプライム長である必要はありません。たとえば、W1n*4文字であるにもかかわらず有効です。
  • これはであるため、最短の回答(バイト単位)が勝ちますが、すべての投稿を歓迎します。
  • 標準的な抜け穴は禁止されています。

テストケース

'husband'     -> True
'HOTJava'     -> True
'COmPaTIBILE' -> True
'AuT0HACk'    -> True

'PPCW'        -> False
'code-golf'   -> False
'C++'         -> False
'/kD'         -> False

'HI'          -> False
'A'           -> False

repl.itには、ソリューションをテストできる非常に詳細なPythonの実例もあります。


どのようにそれhusbandが有効であると発見したか尋ねることができますか?またはそれらのいずれか?しかし、大きな問題!
ガブリエルベナミー

3
@GabrielBenamy誰かが尋ねてくれてうれしい!私が通ってループオンライン辞書それから私は、出力リストを見ていたと私は言っていたテストケースのカップルを選んだ時には番号等のために手紙を切り替え、それぞれの文字のいくつかのランダムな総額をしようと、ファイル
FlipTack

1〜2文字入力するたびにFalse、が返されることが保証されていますか?
mbomb007

... 0および1は素数ではないため、指定された範囲内の文字のみを含む1〜2文字の入力文字列ごとに、少なくとも1つ0または1垂直方向の合計として保証されます。テストケースとして1文字と2文字の文字列を追加する必要があります。
mbomb007

@ mbomb007 1文字の入力は列方向に素数を持つことができないため、を返しfalseます。2文字の入力は可能ですが、使用しているASCIIの範囲ではないため、このシナリオでは正しいです。
FlipTack

回答:


8

MATL、10バイト

BtXsw!shZp

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

これは仕事に理想的な言語です。これは、チャレンジ仕様の文字通りの音訳です。

Bt % Converts input to binary matrix, duplicate
Xs  % Sum columns (alternative X version to prevent defaulting to sum along first non-singleton dimension, thanks @Jonathan Allan)
w! % Get the duplicate to the top of the stack, transpose
s  % Sum again
h  % Concatenate horizontally
Zp % Check primality element-wise. Display implicitly.

metaによってゼロがMATL配列を偽造するため、他には何も必要ありません-基本的に、暗黙のA呼び出しが?(if)で行われます。


a偽のはず1 1ですが、戻りますか?(その列は素数に加算されません)
FlipTack

私が思うにBtXsw!shZp、これを修正し、10の勝者だろう
ジョナサン・アラン

@ Flp.Tck行ベクトルを操作するときのMATLABの「寛容な」動作を完全に忘れていました。すみません、今すぐ修正しました。
-Sanchises

今すぐ動作します:)(オンラインリンクを試してみてください)
-FlipTack

@ Flp.Tkc完了。素敵なチャレンジをありがとう!
Sanchises

4

ゼリー13 12 11 バイト

OBUZ;$S€ÆPẠ

TryItOnline!またはすべてのテストケース

どうやって?

OBUZ;$S€ÆPẠ - Main link: word                  e.g. ha!
O           - cast to ordinals                 e.g. [104,97,33]
 B          - convert to binary                e.g. [[1,1,0,1,0,0,0],[1,1,0,0,0,0,1],[1,0,0,0,0,1]]
  U         - reverse each entry (say "b")     e.g. [[0,0,0,1,0,1,1],[1,0,0,0,0,1,1],[1,0,0,0,0,1]]
     $      - last two links as a monad
   Z        - transpose                        e.g. [[0,1,1],[0,0,0],[0,0,0],[1,0,0],[0,0,0],[1,1,1],[1,1]]
    ;       - concatenate with "b"             e.g. [[0,1,1],[0,0,0],[0,0,0],[1,0,0],[0,0,0],[1,1,1],[1,1],[0,0,0,1,0,1,1],[1,0,0,0,0,1,1],[1,0,0,0,0,1]]
      S€    - sum €ach                         e.g. [2,0,0,1,0,3,2,3,3,2]
        ÆP  - is prime (1 if prime, 0 if not)  e.g. [1,0,0,0,0,1,1,1,1,1]
          Ạ - all truthy?                      e.g. 0


3

ゼリー、15バイト

O+⁹Bṫ€3µS€;SÆPP

オンラインでお試しください!またはすべてのテストケースを検証します。

説明

O+⁹Bṫ€3µS€;SÆPP  Main link. Input: string z
O                Ordinal, get ASCII value of each char
  ⁹              Nilad representing 256
 +               Add 256 to each ordinal value
   B             Binary digits of each
    ṫ€3          Tail, take each list of digits from the 3rd value to the end
                 These are the last seven digits of each
       µ         Start a new monadic chain
        S€       Sum each list of digits by rows
           S     Sum by column
          ;      Concatenate
            ÆP   Test if each is prime, 1 if true else 0
              P  Product

3

Mathematica、75バイト

And@@Join@@PrimeQ@{+##&@@#,+##&@@@#}&@IntegerDigits[ToCharacterCode@#,2,7]&

入力として文字列を取り、Trueまたはを返す名前のない関数False

ToCharacterCode@#入力をASCII値のリストに変換します。IntegerDigits[...,2,7]各値をビットのリストに変換し、必要に応じて長さ7にパディングします。これで2D配列ができました。すべての行の合計と列の合計が必要です。loと見よ、character-spasm {+##&@@#,+##&@@@#}&@...はそれを正確に行います(+##&を使用して、最初の座標のベクトルのリストに関数を適用し、を使用@@して2番目の座標の整数のリストとして各ベクトルに関数を適用します@@@) 。次に、結果がPrimeQであるかどうかをチェックし、でリストをフラット化し、それらすべての値Join@@を取得しAndます。


2

ルビー -rprime、100バイト

->s{a=s.bytes.map{|b|b.digits 2}
a.all?{|r|r.sum.prime?}&([0]*7).zip(*a).all?{|c|c.count(1).prime?}}

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

説明

->s{
    a=s.bytes                       # Get byte values from string
             .map{|b|b.digits 2}    # For each, map it to its binary digits
                                    #   (least significant digits first)
a.all?{|r|r.sum.prime?}             # Each character has a prime number of 1's?
    &                               # Bit-and (because it saves bytes here)
    ([0]*7).zip(*a)                 # Zip bit array with an all-zero array
                                    #   (If we don't, then uneven array lengths
                                    #   cause some columns to not be returned.)
    .all?{|c|c.count(1).prime?}     # All columns have a prime number of 1's?
                                    #   (We use count instead of sum here because
                                    #   zip pads columns with trailing nils, which
                                    #   can't be added to numbers via sum.)
}

1

Perl、151 121 111 + 3 = 114バイト

で実行し-lFます。プログラムは最初の入力に対してのみ正しく機能します。プログラムを終了し、次の入力のために再実行します。

@Dadaに、//Fは冗長だったことを知らせてくれてありがとう。入力をviaにパイプすることで(112の場合)追加のバイトを削除できますがecho -n、技術的にコードを追加していると感じているので、YMMVです。

for$c(@a=map{sprintf"%07b",ord}@F){$b[$_].=substr$c,$_,1 for 0..6}s/0//g,$d|=/^1?$|^(11+?)\1+$/ for@a,@b;say!$d

読みやすい:

                                     #Implicitly split input into characters in @F array
for$c(@a=map{sprintf"%07b",ord}@F)  #Convert @F to 7-bit binary as @a, then loop through it                        
    $b[$_].=substr$c,$_,1 for 0..6   #Transpose @a's bits into @b
}
s/0//g,$d|=/^1?$|^(11+?)\1+$/ for@a,@b; #Remove any zeros, then run through composite regex
say!$d                          #If all composite regex checks fail, then it's fully prime.

1
最初の入力でのみ動作するバージョンはまったく問題ないので、141バイトバージョンをメインバージョンとして、他のバージョンを複数の入力で使用することを提案できます。
ダダ

また、//after を省略する-Fことができ、最後の改行なしで(を使用してecho -n)入力を取得して-lフラグを取り除くことができることに注意してください。
ダダ

1

Python 3、 228 227 225バイト

いい答えではありません。好きなだけゴルフをすることはできませんでしたが、あまりにも長く費やしたので投稿する必要があると思います。バイトの切断に関する提案をいただければ幸いです。

r=range
n=[format(ord(c),"08b")for c in input()]
n=map(lambda s:s.count("1"),n+["".join([f[1]for f in filter(lambda e:e[0]%8<1,enumerate("X"*-~i+"".join(n)))][1:])for i in r(8)])
print(all(all(s%d for d in r(2,s))for s in n))

編集1:に置き換えe[0]%8==01e[0]%8<1バイトを失います。ありがとうFlp.Tkc!

編集2:(i + 1)を-〜iに置き換え、さらに2バイトを失います。私のビットレベルの知識がどれほど悪いかを公開してくれたErikに感謝します:)このリビジョンをテストしているときに、それkappaが有効であることがわかりました。


1
に変更e[0]%8==0してもらえますe[0]%8<1か?
FlipTack

@ Flp.Tkc良いスポット!それができない理由はありません。
-FourOhFour

1
@ Flp.Tkc関数にすることでバイトを節約できるとは思いません。404 rep btwを取得する方法が気に入っています:)
FourOhFour

ことになっている<1、ではありませんか<0
破壊可能なレモン

@Destructible Watermelonうん、それを修正させてくれ。
FourOhFour

1

Groovy、151 137バイト

{p={x->x<3||(2..(x**0.5)).every{x%it}};y={it.every{p(it.count("1"))}};x=it.collect{0.toString((int)it,2) as List};y(x)&&y(x.transpose())}

グルーヴィーで素数チェックなし...

p={x->x<3||(2..(x**0.5)).every{x%it}}; -素数テストのための閉鎖。

y={it.every{p(it.count("1"))}}; -渡されたバイナリ2D配列の「1」のすべてのカウントが素数であることを保証するクロージャ。

x=it.collect{0.toString((int)it,2) as List}; -文字列からバイナリ配列への変換。

y(x)&&y(x.transpose()) -メイン行列と転置行列のすべての素数検証済み合計について、それらがtrueを返すことを確認します。


1

Pyth、37バイト

L.AmP_sdb=sMM.[L\0lh.MlZQ=.BMQ&yZy.TZ

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


                                 Code | Explanation
--------------------------------------+----------------------------------------------------------------
L.AmP_sdb=sMM.[L\0lh.MlZQ=.BMQ&yZy.TZ | Full code
L                                     | Define function y(b):
   m    b                             |   For each d in b:
    P_sd                              |     Is the sum of the elements of the list prime?
 .A                                   |   Return whether all elements of the resulting list are truthy
                         =   Q        | Assign the following to Q:
                          .BMQ        |   The list of binary strings for each character in the input
         =             Z              | Assign the following to Z:
               L             Q        |   For every element in Q:
             .[ \0                    |     Pad with 0 on the left
                  lh.MlZQ             |     To the length of the longest element in Q
            M                         |   For each element in the resulting list:
          sM                          |     Convert each character to an integer
                              &yZ     | Print y(Z) AND
                                 y.TZ |   y( <Transpose of Z> )

1

Brachylog、14バイト

ạḃᵐB↔ᵐz₁,B+ᵐṗᵐ

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

成功または失敗による出力。(成功の場合、すべての列と行の合計のリストが出力変数を介して利用可能です。

   B              The variable B is
ạ                 the codepoints of the input
 ḃᵐ               converted to lists of binary digits,
    ↔ᵐ            which with each list reversed
      z₁          then zipped without cycling
        ,B        and concatenated with B
          +ᵐ      has elements which all sum to
            ṗᵐ    prime numbers.

1

O5AB1E、12バイト

Çžy+bø€SOp¦W

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

これは私の最初のコードゴルフですので簡単に行きます:)

Ç              % Converts the implicit input into ascii values
 žy+           % Adds 128 to each value, inspired by Emigna as a way to pad zeros
    b          % Convert all values into bits
     ø         % Transpose
      €SO      % Sum each string of binary digits created
         p¦    % Check if each element is prime and cut the first element out (adding 128 makes it equal to the number of characters)
           W   % Take the minimum value to effectively "and" all the elements

これにより、1文字の入力に対して空の結果が生成されます。私はO5AB1Eに精通していませんが、それが偽の値であれば大丈夫です。
Sanchises

1

Pythonの3209 189 180 171 160バイト

-9バイトのイカをありがとう:)

def p(s):n=s.count('1');return(n>1)*all(n%i for i in range(2,n))
def f(s):t=[f'{ord(c):07b}'for c in s];return all(map(p,t+[[u[j]for u in t]for j in range(7)]))

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


テストケースの印刷ステートメントを書き直した方法が気に入っています:)
movatica

ええ、私はf-stringsに強迫観念を抱いています...また、t+mapステートメントで削除しても同等ではありませんか?
モニカを

いいえ、プライムチェックはビットマトリックスの行と列の両方をカバーする必要があるためです。tはすべての行を持ちます[[t[i][j]..i..]..j..]が、は転置されたt、つまり列です。マトリックスを転置するより短い方法があれば、より多くのバイトを節約できます:)
movatica

私が試してみるとうまくいきますが、それを壊す文字列を知っていますか?
モニカを

はい。beezzfalseを返す必要がありますが、返しません。プライムチェックが壊れているTrueため、4ビットで返されます。試してみてくださいprint(p('1111'))。今それを修正しました。すべてのテストケースはそれをカバーしていませんでした。なぜなら、使用されているすべての文字が基本的なものだからです。
movatica

1

K(oK)40 33バイト

溶液:

&/{2=+/d=_d:x%!x}'+/'m,+m:(7#2)\'

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

説明:

半分はマトリックスを作成し、残りの半分は素数チェックです。

&/{2=+/d=_d:x%!x}'+/'m,+m:(7#2)\' / the solution
                                ' / apply to each (')
                               \  / decode
                          (   )   / do this together
                           7#2    / 7#2 => 2 2 2 2 2 2 2
                        m:        / save as m
                       +          / transpose
                     m,           / append to m
                  +/'             / sum (+/) each (')
                 '                / apply to each
  {             }                 / lambda taking implicit x
              !x                  / range 0..x
            x%                    / x divided by ...
          d:                      / save as d
         _                        / floor
       d=                         / equal to d?
     +/                           / sum (+/)
   2=                             / equal to 2?
&/                                / minimum

0

PHP、173バイト

for($r=1;$b=substr_count($t[$i]=sprintf('%07b',ord($argv[1][$i++])),1);)$r&=$b==2|$b%2&$b>2;for(;$k++<7;){for($b=$j=0;$t[++$j];$b+=$t[$j][$k-1]);$r&=$b==2|$b%2&$b>2;}echo$r;

オンラインでテストする


0

JavaScript、234バイト

f=z=>(z=[...z].map(v=>v.charCodeAt(0))).map(v=>v.toString(2).replace(/0/g,"").length).every((p=v=>{for(i=2;i<v;i++){if(v%i===0){return 0}};return v>1}))&&[...""+1e6].map((v,i)=>z.reduce((a,e)=>!!(e&Math.pow(2,i))+a,0)).every(v=>p(v))

数値をバイナリに変換し、文字列置換を使用してゼロを削除してから1をカウントすることにより、水平方向の値を取得します。垂直方向の合計は、1から7をループし、2のn乗でビット単位のANDを使用して取得されます。


Math.pow(2,i)(1<<i)仮定i<32に短縮できますが、おそらく7バイトを節約できますが、そうではありません。
鳴代

0

Clojure、180バイト

#(let[S(for[i %](for[j[1 2 4 8 16 32 64]](min(bit-and(int i)j)1)))A apply](not-any?(fn[i](or(= i 1)(seq(for[d(range 2 i):when(=(mod i d)0)]d))))(into(for[s S](A + s))(A map + S))))

ビットリストを生成するより短い方法があり、また素数テストもあります。



0

Python 3、164バイト

import numpy;a=numpy.array([list(f'{ord(_):07b}')for _ in input()]).astype(int);print(all([(v>1)*all(v%i for i in range(2,v))for v in set(a.sum(0))|set(a.sum(1))]))

0

Ruby 2.7、95 -rprimeバイト

->s{a=s.bytes.map{[*@1.digits(2),0][..6]}
(a.map(&:sum)+a.transpose.map(&:sum)).all?(&:prime?)}

TiOはまだRuby 2.5.5を実行しているため、TiOリンクはありません。😭

説明

ものすごく単純。最初の行は、各文字の2進数を、7桁にパディングされた配列として取得します。これは本当に簡単なはずです。

a = s.bytes.map { [*@1.digits(2), 0][..6] }

その番号がブロックパラメータをチェックアウト(@1)とbeginless範囲(..6

2行目は行と列を合計し、それらがすべて素数であるかどうかをテストします。

(a.map(&:sum) + a.transpose.map(&:sum)).all?(&:prime?)

0

JavaScriptの(Node.jsの)149 146 ... 134の 130 129バイト

x=>[...x].map(y=>a=[...a.map(n=>y.charCodeAt()&2**i++?++z&&-~n:n,z=i=0),z],a=[...Array(7)])&&!a.some(n=>(P=r=>n%--r?P(r):~-r)(n))

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

説明

x=>                        // Main function:
 [...x].map(               //  For each y in x:
  y=>
   a=[...a.map(            //   For each i in range(0, len(a)):
    n=>                   
     y.charCodeAt()&2**i++ //    If y AND 2**i is not zero:
     ?++z&&-~n:n,          //     z = z + 1; a[i] = a[i] + 1 (1 if a[i] is undefined)
    z=i=0                  //   Initially z = 0
   ),z],                   //   Then push z at the end of a
  a=[...Array(7)]          //  Initially a = [undefined] * 7
 )&&!a.some(               //  Then for each n in a:
  n=>(
   P=r=>                   //   Composite function:
    n%--r?                 //    If n % (r - 1) == 0 or r == 1:
     P(r)                  //     Return P(r - 1)
    :~-r                   //    Else: Return r - 2
  )(n)                     //   Starting from r = n
 )                         //  Return whether the composite function returns 0 for all n.

どのように機能しますか!?

  • y.charCodeAt()&2**i
    • y.charCodeAt()ifの対応するビットを返すには、このコードが必要です0 <= i < 7で、そうでないは0が必要です。
    • いつ i < 7、コードは明らかに通常どおり動作します。
    • の場合7 <= i <= 32、対応するビットのy.charCodeAt()はとにかく0なので、結果は期待どおり0になります。
    • とき32 < i < 1024、以来int32(2**i) == 0期待どおり結果は0です。
    • の場合1024 <= i2**i == Infinityおよびがあるためint32(Infinity) == 0、期待どおり結果は0になります。
  • (P=r=>n%--r?P(r):~-r)(n)
    • 簡単にするために R = --r = r - 1
    • このヘルパー関数は、n % R == 0またはのときに終了しn % R is NaNます。
      • n % R == 0Rはの要因ですn
        • の場合R == 1nすべて1 < R < nが分割できないため、が素数になりますn。0(偽)を返します。
        • の場合R == -1、その後n == 0。-2(真)を返します。
        • そうでなければ、R - 1where R - 1 > 0(truthy)を返します。
      • n % R is NaN:モジュラー計算が無効です。
        • 場合R == 0n == 1。-1(真)を返します。
        • 次の場合n is NaNR is NaN。-1(真)を返します。
    • その結果、R == 1この関数が偽の値を返すことができるのはいつだけで、n素数であることを示します。
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.