それは蝶の数字ですか?


29

Sphenic Numberは、正確に3つの異なる素数の積である数値です。最初のいくつかのSphenic番号は30, 42, 66, 70, 78, 102, 105, 110, 114です。これは、OEISのシーケンスA007304です。

あなたのタスク:

入力された整数がSphenic数であるかどうかを判断するプログラムまたは関数を作成します。

入力:

0から10 ^ 9までの整数。これは、スフェニック番号である場合とそうでない場合があります。

出力:

入力がSphenic Numberかどうかを示す真実/偽の値。

例:

30  -> true
121 -> false
231 -> true
154 -> true
4   -> false
402 -> true
79  -> false
0   -> false
60  -> false
64  -> false
8   -> false
210 -> false

得点:

これは、バイト単位の最短コードが優先されます。


ある60楔数?2 × 2 × 3 × 5
エリックアウトゴルファー

1
@EriktheOutgolferは、3つの異なる素数の積ではなく、3つの異なる素数と1つの重複素数の積です。
Rɪᴋᴇʀ

1
@Riker「3つの異なる素数」が「すべて異なる3つの素数」を意味するのか、それとも「一意化されたときに3つの素数が残る」を意味するのか本当にわかりません。編集:ああ、なるほど、60蝶のような数字ではありません。(OPの説明を待っています)
エリックアウトゴルファー

@EriktheOutgolfer sphenic numberの定義によれば、60はそのうちの1つではありません。ただし、このチャレンジで60が有効かどうかはわかりません。
小麦ウィザード

@ WheatWizard、60は非正規数ではありません(たとえば、出力/戻り値の偽)。
グリフォン-モニカの復活

回答:


7

Brachylog6 3バイト

ḋ≠Ṫ

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

説明

ḋ        The prime factorization of the Input…
 ≠       …is a list of distinct elements…
  Ṫ      …and there are 3 elements

2
そして、のような組み込みの言語が1つあります
エリックアウトゴルファー

そして組み込みも。
ザカリー

1
@Zacharý は実際には組み込みの述語ではありません。これは組み込み変数です:3つの変数要素のリスト。これは、多くのさまざまな課題でかなり有用な事前制約変数です。
17

最短回答おめでとうございます。
グリフォン-モニカの復活

11

bash、43バイト

factor $1|awk '{print $2-$3&&$3-$4&&NF==4}'

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

コマンドライン引数を介した入力、出力、0または1標準出力へ。

かなり自明です。の出力を解析しfactorて、1番目と2番目の因子が異なり、2番目と3番目が異なり(ソート順になっているのでこれで十分です)、4つのフィールド(入力番号と3つの因子)があることを確認します。


11

MATL、7バイト

_YF7BX=

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

説明

_YF   % Implicit input. Nonzero exponents of prime-factor decomposition
7     % Push 7
B     % Convert to binary: gives [1 1 1] 
X=    % Is equal? Implicit display

@Suever私はそれについて考えていましたが、その後、偽の出力はくなります(エラーのある空またはいくつかのゼロのある配列)。私がすべきかどうかわからない
ルイスメンドー

4
X=私が今まで見た中で最も悲しいビルトインです。
エリックアウトゴルファー

9

C、88 78 126 58 77 73 + 4(lm)= 77バイト

l,j;a(i){for(l=1,j=0;l++<i;fmod(1.*i/l,l)?i%l?:(i/=l,j++):(j=9));l=i==1&&j==3;}

Ungolfedがコメントした説明:

look, div; //K&R style variable declaration. Useful. Mmm.

a ( num ) { // K&R style function and argument definitions.

  for (
    look = 1, div = 0; // initiate the loop variables.
    look++ < num;) // do this for every number less than the argument:

      if (fmod(1.0 * num / look, look))
      // if num/look can't be divided by look:

        if( !(num % look) ) // if num can divide look
          num /= look, div++; // divide num by look, increment dividers
      else div = 9;
      // if num/look can still divide look
      // then the number's dividers aren't unique.
      // increment dividers number by a lot to return false.

  // l=j==3;
  // if the function has no return statement, most CPUs return the value
  // in the register that holds the last assignment. This is equivalent to this:
  return (div == 3);
  // this function return true if the unique divider count is 3
}

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


1
i*1.0/lキャストをフロートする代わりに検討してください。(のでlj彼らは自由のために0にグローバル初期化されている、あなたは関数が一度だけ呼び出される場合があることを行う必要はありませんわからないルールがその何のためにあるのか。。)
マット


5

CJam、11バイト

rimFz1=7Yb=

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

説明

私のMATLの回答に基づいています。

ri    e# Read integer
mF    e# Factorization with exponents. Gives a list of [factor exponent] lists
z     e# Zip into a list of factors and a list of exponents
1=    e# Get second element: list of exponents
7     e# Push 7
Yb    e# Convert to binary: gives list [1 1 1]
=     e# Are the two lists equal? Implicitly display


4

、6バイト

≡ḋ3Ẋ≠p

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

sphenic数の場合は1を、それ以外の場合は0を返します。

説明

≡ḋ3Ẋ≠p    Example input: 30
     p    Prime factors: [2,3,5]
   Ẋ≠     List of absolute differences: [1,2]
≡         Is it congruent to...       ?
 ḋ3           the binary digits of 3: [1,1]

最後の節では、2つのリストの一致は、同じ長さおよび同じ真実/偽の値の分布を持つことを意味します。この場合、結果が2つの真の(つまり、非ゼロ)値で構成されていることを確認しています。


4

Mathematica、31バイト

SquareFreeQ@#&&PrimeOmega@#==3&

すでに平方自由度をテストしPrimeNuているためPrimeOmega、と同様に機能し、より短くなります。
マークS。17年





2

J、15バイト

7&(=2#.~:@q:)~*

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

説明

7&(=2#.~:@q:)~*  Input: integer n
              *  Sign(n)
7&(         )~   Execute this Sign(n) times on n
                 If Sign(n) = 0, this returns 0
          q:       Prime factors of n
       ~:@         Nub sieve of prime factors
    2#.            Convert from base 2
   =               Test if equal to 7

〜:および#の非常に良い使用。代替案は(7&(=#。@〜:@q:)〜*)かもしれませんが、これは少し読みやすいですが、短くはありません。
ボブ




2

C、91 102バイト、修正(再度)、ゴルフ、そして今回のテスト:

<strike>s(c){p,f,d;for(p=2,f=d=0;p<c&&!d;){if(c%p==0){c/=p;++f;if(c%p==0)d=1;}++p;}c==p&&f==2&&!d;}</strike>
s(c){int p,f,d;for(p=2,f=d=0;p<c&&!d;){if(c%p==0){c/=p;++f;if(c%p==0)d=1;}++p;}return c==p&&f==2&&!d;}

/ *これも93バイトで機能しますが、ダイナミック変数のデフォルトのint型を禁止する標準的なルールと、割り当てなしで暗黙的な戻り値を許可しないことを忘れてしまったので、取りません。

p,f,d;s(c){for(p=2,f=d=0;p<c&&!d;){if(c%p==0){c/=p;++f;if(c%p==0)d=1;}++p;}p=c==p&&f==2&&!d;}

(Cについて何か知っていると言ったのは誰ですか?

コメントにシェルスクリプトを含むテストフレームを次に示します。

/* betseg's program for sphenic numbers from 
*/
#include <stdio.h>
#include <stdlib.h>
#include <limits.h>
#include <math.h> /* compile with -lm */

/* l,j;a(i){for(l=1,j=0;l<i;i%++l?:(i/=l,j++));l=i==1&&j==3;} */
#if defined GOLFED
l,j;a(i){for(l=1,j=0;l++<i;fmod((float)i/l,l)?i%l?:(i/=l,j++):(j=9));l=i==1&&j==3;}
#else 
int looker, jcount;
int a( intval ) {
  for( looker = 1, jcount = 0; 
    looker++ < intval; 
    /* Watch odd intvals and even lookers, as well. */
    fmod( (float)intval/looker, looker )  
      ? intval % looker /* remainder? */
        ? 0 /* dummy value */
        : ( inval /= looker, jcount++ /* reduce the parameter, count factors */ ) 
      : ( jcount = 9 /* kill the count */ ) 
  )
    /* empty loop */;
  looker = intval == 1 && jcount == 3; /* reusue looker for implicit return value */
}
#endif

/* for (( i=0; $i < 100; i = $i + 1 )) ; do echo -n at $i; ./sphenic $i ; done */

私は自分のバージョンを取得するために、betsegの以前の回答を借りました。

これは私のバージョンのbetsegのアルゴリズムで、解決策を見つけるためにゴルフをしました:

/* betseg's repaired program for sphenic numbers
*/
#include <stdio.h>
#include <stdlib.h>
#include <limits.h>

int sphenic( int candidate )
{
  int probe, found, dups;
  for( probe = 2, found = dups = 0; probe < candidate && !dups; /* empty update */ ) 
  { 
    int remainder = candidate % probe;
    if ( remainder == 0 ) 
    {
      candidate /= probe;
      ++found;
      if ( ( candidate % probe ) == 0 )
        dups = 1;
    }
    ++probe;
  } 
  return ( candidate == probe ) && ( found == 2 ) && !dups;
}

int main( int argc, char * argv[] ) { /* Make it command-line callable: */
  int parameter;
  if ( ( argc > 1 ) 
       && ( ( parameter = (int) strtoul( argv[ 1 ], NULL, 0 ) ) < ULONG_MAX ) ) {
    puts( sphenic( parameter ) ? "true" : "false" );
  }
  return EXIT_SUCCESS; 
}

/* for (( i=0; $i < 100; i = $i + 1 )) ; do echo -n at $i; ./sphenic $i ; done */

今、質問に答えていますか?
ジョエルリース

はい、そうです。これを挿入して、betsegの回答にリンクします:[betseg's answer](https://codegolf.stackexchange.com/a/135203/65836)。また、必要に応じて、彼の回答の[編集]をクリックして、説明を含む編集を提案することもできます。承認されるかどうかの約束はありません。
スティーブン

私は今ここにいます。プログラムを修正しました。87バイトです。あなたのプログラムも良さそうです。
-betseg

@betseg今回は浮動小数点を使用したことに興味があります。ああ、あなたのアルゴリズムを借りさせてくれてありがとう。;-)
ジョエルリース

@JoelRees私は答えに説明を追加しましたが、あなたの答えには問題があると思いますか?正しく動作していないようです:オンラインで試してください
-betseg


1

Javascript(ES6)、87バイト

n=>(a=(p=i=>i>n?[]:n%i?p(i+1):[i,...p(i,n/=i)])(2)).length==3&&a.every((n,i)=>n^a[i+1])

コードスニペットの例:

f=
n=>(a=(p=i=>i>n?[]:n%i?p(i+1):[i,...p(i,n/=i)])(2)).length==3&&a.every((n,i)=>n^a[i+1])

for(k=0;k<10;k++){
  v=[30,121,231,154,4,402,79,0,60,64][k]
  console.log(`f(${v}) = ${f(v)}`)
}


1

Python 2 135の 121バイト

  • これにはすべての手順が含まれているため、かなり長い:プライムチェック、プライムファクターの取得、球数条件のチェック。
lambda x:(lambda t:len(t)>2and t[0]*t[1]*t[2]==x)([i for i in range(2,x)if x%i<1and i>1and all(i%j for j in range(2,i))])

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



1

J、23バイト

0:`((~.-:]*.3=#)@q:)@.*

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

8と0の処理は基本的にこれを台無しにしました...

q: すべての素因数を提供しますが、0は処理しません。残りの部分は、「一意の因子は因子と等しくなければなりません」および「それらの数は3でなければなりません」とだけ述べています。


入力に失敗しました60
コナーオブライエン

@ ConorO'Brienありがとう。私の編集を参照してください-60 修正するのに役立ちましたが、0を正しく処理しておらず、バイトを2倍以上も処理していないことに気付きました
ジョナ

最後の1つは私の最初のアイデアであり、それは失敗し8ます。
コナーオブライエン

私は(6=]#@,~.)@q:可能な解決策として
コナーオブライエン

@ ConorO'Brienは8についての良い点です。しかし、0は失敗します。
ジョナ

1

Japt、14バイト

k
k@è¥X ÉÃl ¥3

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


@Oliverこれにより、関数がに渡されますNumber.k()。これは効果がなく、入力に3つの異なる素因数ではなく、3つの素因数があるかどうかを確認するだけです。つまり、A007304にいないにも関わらず8(3つの主要な要因2, 2, 2:)
Justin Mariner

ああ、あなたは正しい。私はちょうどテストケースで行っていました。
オリバー

@Oliverええ、このソリューションに取り組んでいるとき、それは本当に私にループを投げました。8そのため、テストケースに追加しました。
ジャスティンマリナー


1

VB.NET(.NET 4.5)、104バイト

Function A(n)
For i=2To n
If n Mod i=0Then
A+=1
n\=i
End If
If n Mod i=0Then A=4
Next
A=A=3
End Function

関数名も変数であるVBの機能を使用しています。実行の終了時には、returnステートメントがないため、代わりに「関数」の値を渡します。

最後のA=A=3ことを考えることができますreturn (A == 3)、Cベースの言語で。

2から始まり、繰り返し素数を取り出します。私は最小の素数から始めているので、合成数で割ることはできません。

同じ素数で除算するために2回目を試みます。そうである場合(60を2で2分割する方法など)、素数のカウントを4に設定します(sphenic数の最大値を超える)。

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


1

Dyalog APL、51 49 48 46 45 43バイト

1∊((w=×/)∧⊢≡∪)¨(⊢∘.,∘.,⍨){⍵/⍨2=≢∪⍵∨⍳⍵}¨⍳w←⎕

オンラインでお試しください!(TryAPLで実行できるように変更)

私はdfns名前空間にまったく依存しないものを、たとえそれが長くても送信したかったのです。


1

J、15 14 19バイト

以前の試み: 3&(=#@~.@q:)~*

現行版: (*/*3=#)@~:@q: ::0:

使い方:

(*/*3=#)@~:@q: ::0:  Input: integer n
               ::0:  n=0 creates domain error in q:, error catch returns 0
            q:       Prime factors of n
         ~:@         Nub sieve of prime factors 1 for first occurrence 0 for second
(*/*3=#)@            Number of prime factors is equal to 3, times the product across the nub sieve (product is 0 if there is a repeated factor or number of factors is not 3)

これは、前のバージョンではなかったケース0、8、および60に合格します。


1
なぜ3 =#〜.qではないのですか?Jセッションから3 =#〜.q:30 ==> 1 and 3 =#〜.q:20 ==> 0
Richard Donovan

リチャード、あなたの提案はn = 60に対して偽陽性を与え、n = 0に対してドメインエラーを作成しますが、私の以前のバージョンもn = 60に対して失敗しました。あなたのコメントは正しい解決策を模索するように私を促しました!
ボブ

0

Mathematica、66 57バイト

Length@#1==3&&And@@EqualTo[1]/@#2&@@(FactorInteger@#)&

無名関数を定義します。

あるトランスポーズ

説明

FactorInteger因子とその指数のペアのリストを提供します。例FactorInteger[2250]=={{2,1},{3,2},{5,3}}。これは使いやすさのために転置されて、機能に供給されますLength@#1==3&&And@@EqualTo[1]/@#2&。最初の部分、Length@#1==3では3つの固有の要因があることを確認し、2番目の部分でAnd@@EqualTo[1]/@#2はすべての指数が1であることを確認します。


0

PHP、66バイト:

for($p=($n=$a=$argn)**3;--$n;)$a%$n?:$p/=$n+!++$c;echo$c==7&$p==1;

パイプとして実行する-nR、オンラインで試してください.

forの無限ループ0$n&&前に挿入--$n to fix.

壊す

for($p=($n=$a=$argn)**3;    # $p = argument**3
    --$n;)                  # loop $n from argument-1
    $a%$n?:                     # if $n divides argument
        $p/=$n                      # then divide $p by $n
        +!++$c;                     # and increment divisor count
echo$c==7&$p==1;            # if divisor count is 7 and $p is 1, argument is sphenic


引数の = 30
素因数は23あり、5
他の除数は1、2 * 3 = 6、2 * 5 = 10および3 * 5 = 15
の積です:1*2*3*5*6*10*15is 27000==30**3


0

Python 99バイト

def s(n):a,k=2,0;exec('k+=1-bool(n%a)\nwhile not n%a:n/=a;k+=10**9\na+=1\n'*n);return k==3*10**9+3

最初の提出。何か間違ったことをしても許してください。ちょっとばかげて、の因子の数を数え、nそれから回数を数えますn is divisible by each (by adding 10**9).

10〜20文字を切り取る簡単な方法がいくつかあると確信していますが、そうではありません。

また、これは10 ** 9で非常に遅いです。に変更することで大丈夫になる可能性があります。'...a+=1\n'*n'...a+=1\n'*n**.5n

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.