スーパーパリンドロームを見つけてください!


23

99999999の数字を考えてみましょう。その数字は明らかに回文です。99999999の最大素因数は137です。99999999を137で除算すると、729927になります。この数値も回文です。

729927の最大の素因数は101です。729927/ 101 = 7227は再び回文です。

7227の最大の素因数は73です。7227/ 73 = 99は再び回文です。

さらに最大の素因数で割ると、9、3、最後に1が得られます。これは1桁の数字であり、回文でもあります。1には素因数がないため、手順はここで終了します。

ここでこの観察結果を一般化して、スーパーパリンドロームを1であるパリンドローム、または最大素数因子で割ると別のスーパーパリンドロームを与えるパリンドロームと定義します。

クレジット:https : //math.stackexchange.com/questions/200835/are-there-infinitely-many-super-palindromes

Nが与えられた場合、スーパー回文であるかどうかを判断し、それに応じて真偽値を出力します。

あなたのプログラムはこれらの入力に対して真実の値を出力するはずです:

1
101
121
282
313
353
373
393
474
737
919
959
1331
1441
2882
6446
7887
8668
9559
9779

プログラムは、これらの入力に対して偽の値を出力する必要があります。

323
432
555
583
585
646
642
696
777
969
989
2112
3553
4554
5242
5225
5445
8080
8118
9988

これはであるため、バイト数が最も少ないコードが優先されます。


3
入力はN常にパリンドロームになりますか?
Sherlock9

@ Sherlock9 No.
オリバーNi

2
それから、偽のテストケースに非回文を追加してもらえますか?仕様が明確になります。
Sherlock9

回答:


8

ゼリー13 12 9 8 バイト

Æf×\D⁼U$

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

使い方

Æf×\D⁼U$  Main link. Argument: n

Æf        Yield all prime factors of n, with multiplicities and in ascending order.
  ×\      Take the cumulative product.
    D     Decimal; convert each product into the array of its base 10 digits.
       $  Combine the two links to the left into a monadic chain.
      U     Upend; reverse all arrays of decimal digits.
     ⁼      Test for equality.

6

Mathematica、64バイト

And@@PalindromeQ/@FixedPointList[#/FactorInteger[#][[-1,1]]&,#]&

無名関数は、返しますTrueFalse。入力から始めて、出力が変化しないまで関数を「最大の素因数で割った」関数を繰り返してリストを作成します。(幸いなことに、Mathematicaは1の最大の素因数が1であると考えるようになりました。)次に、リストのエントリが回文であるかどうかをテストします(イェーイビルトイン!ブーイング関数名の長さ!)And


きちんとしたトリック(ab)とFactorInteger[1]の奇妙な使用FixedPoint
LegionMammal978

ええ、一度助けたからです!:)
グレッグマーティン

6

Mathematica、51バイト

#<2||PalindromeQ@#&&#0[#/FactorInteger[#][[-1,1]]]&

再帰的な匿名関数。入力として数値を受け取り、出力TrueまたはFalse出力として使用します。


6

05AB1E9 8バイト

Adnanのおかげで1バイト節約できました。

Ò.pPDíïQ

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

説明

n = 7227 例として使用

Ò           # prime factors with duplicates
            # STACK: [3, 3, 11, 73]
 .p         # prefixes
            # STACK: [[3], [3, 3], [3, 3, 11], [3, 3, 11, 73]]
   P        # product
            # STACK: [3, 9, 99, 7227]
    D       # duplicate
            # STACK: [3, 9, 99, 7227], [3, 9, 99, 7227]
     í      # reverse each
            # STACK: [3, 9, 99, 7227], ['3', '9', '99', '7227']
      ï     # convert to  int
            # STACK: [3, 9, 99, 7227], [3, 9, 99, 7227]
       Q    # check for equality
            # STACK: 1
            # implicit output

Ò.pPDíïQも動作するはずだと思います。
アドナン

5

Pyth- 15 12バイト

ビートゼリー:P:/

残念なことに、最後のマップは自動スプラットなので、これらの暗黙的なマップはすべて、明示的なマップに結合しても短くなりません。

.A_IM`M*M._P

テストスイート

積が中間スーパーパリンドロームとなる素因数分解のすべてのプレフィックスを取得し、それらすべてがパリンドロームかどうかをチェックします。


4

Mathematica、71 63バイト

And@@PalindromeQ/@FoldList[1##&,Join@@Table@@@FactorInteger@#]&

説明

FactorInteger@#

入力を因数分解します。(たとえば8668 -> {{2, 2}, {11, 1}, {197, 1}}、出力の各リストについて、最初の要素は素因数であり、2番目の要素はべき乗です。

Join@@Table@@ ...

因子と力のペアごとに、最初の要素を2番目の要素で複製し、全体を平坦化します。({{2, 2}, {11, 1}, {197, 1}} -> {{2, 2}, {11}, {197}} -> {2, 2, 11, 197}

FoldList[1##&, ... ]

リストを反復して、要素を乗算します。({2, 2, 11, 197} -> {2, 2 * 2, 2 * 2 * 11, 2 * 2 * 11 * 197} -> {2, 4, 44, 8668}

And@@PalindromeQ/@ ...

結果の数値がすべて回文であるかどうかを確認し、And演算子を適用します。({2, 4, 44, 8668} -> {True, True, True, True}-> True


うーん、うまくできました!今、私はどこかでバイト2を救うことができるかどうか....見に行くお奨め
グレッグ・マーティン

3

Brachylog、14バイト

1|r?$ph:?r/:0&

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

説明

これにより、チャレンジの説明で説明されている式が実装されます。

素因数分解の接尾辞のすべての積を計算し、それらがすべて回文であることを確認すると、1バイト長くなります(1|$p:@]f:{*.r}a)。

1                  Input = 1
 |                 OR
  r?               Reversing the Input results in the Input
    $p             Get the prime factors of the Input
      h            Take the first one (the biggest)
       :?r/        Divide the Input by that prime factor
           :0&     Call this predicate recursively with that new number as input

2

ラケット238バイト

(define(p n)(=(string->number(list->string(reverse(string->list(number->string n)))))n))
(if(= n 1)#t(begin(let o((n n))(define pd(prime-divisors n))(if(null? pd)#f(begin(let((m(/ n(last pd))))
(cond[(= m 1)#t][(p m)(o m)][else #f])))))))

ゴルフをしていない:

(define (f n)
  (define (palin? n)                      ; define palindrome of number
    (=(string->number
       (list->string
        (reverse
         (string->list
          (number->string n)))))
      n))
  (if(= n 1)#t
     (begin
       (let loop ((n n))
         (define pd (prime-divisors n))   ; find prime divisors
         (if (null? pd) #f                ; end if none- not superpalindrome
             (begin
               (let ((m (/ n (last pd)))) ; divide by largest prime divisor
                 (cond                    ; test quotient
                   [(= m 1) #t]           ; end if 1: super-palindrome found
                   [(palin? m) (loop m)]  ; loop with quotient if palindrome
                   [else #f]              ; end if not palindrome
                   ))))))))

テスト:

(f 1)
(f 101)
(f 121)
(f 282)
(f 313)
(f 353)
(f 373)
(f 393)
(f 474)
(f 737)
(f 919)
(f 959)
(f 1331)
(f 1441)
(f 2882)
(f 6446)
(f 7887)
(f 8668)
(f 9559)
(f 9779)
(f 99999999)

出力:

#t
#t
#t
#t
#t
#t
#t
#t
#t
#t
#t
#t
#t
#t
#t
#t
#t
#t
#t
#t
#t

私はラケットに精通していませんが、ヘルパー関数palinが5バイトの長い名前である必要はありますか?
ローマングラフ

以前に修正しましたが、ここに正しく貼り付けられませんでした。238バイトの名前は「p」だけです。指摘してくれてありがとう。
rnso

2

J、30バイト

0:`(%1>.{:@q:)@.((-:|.)@":)^:_

偽の場合はエラー、真実の場合は1。

最初の試行、falsey、40バイトのエラーなし:

0:`(([:$:]%{:@q:)`[@.(1&=))@.((-:|.)@":)

説明

0:`(%1>.{:@q:)@.((-:|.)@":)^:_
                           ^:_  repeat until convergent
              @.((-:|.)@":)     if the number is palindromic:
   (         )                   do the stuff inside, which is a 4-train
        {:@q:                    largest prime factor
     1>.                         (or 1, if smaller than 1)
    %                            divide the original number by this value
0:`                             otherwise, return 0
                                (because of ^:_, this will be passed into q:, which will
                                error because 0 cannot be factored.)

テストケース

   NB. collect errors; 0 if errored, otherwise the result of the function
   NB. left arg: values; right arg: boxed name of function
   errors =: 4 : 0
    f =. y`:6
    l =: ''
    for_e. x do.
        try.
            l =. l , f e
        catch.
            l =. l , 0
        end.
    end.
    l
)
   s =: 0:`(%1>.{:@q:)@.((-:|.)@":)^:_
   t =: 1 101 121 282 313 353 373 393 474 737 919 959 1331 1441 2882 6446 7887 8668 9559 9779
   f =: 323 432 555 583 585 646 642 696 777 969 989 2112 3553 4554 5242 5225 5445 8080 8118 9988
   t ,. f
   1  323
 101  432
 121  555
 282  583
 313  585
 353  646
 373  642
 393  696
 474  777
 737  969
 919  989
 959 2112
1331 3553
1441 4554
2882 5242
6446 5225
7887 5445
8668 8080
9559 8118
9779 9988
   (t ,. f) errors"1 0 <'s'
1 0
1 0
1 0
1 0
1 0
1 0
1 0
1 0
1 0
1 0
1 0
1 0
1 0
1 0
1 0
1 0
1 0
1 0
1 0
1 0

2

A(Aheui)、309バイト(100文字* 3バイト+ 9改行)

방빩반룸있쁏멐솔쌀잌
앟놂숙참뿔썁썸뻙솝셜
본서번분번뮴딸냥별쀼
슉눇번낢퉅쑫썬쌀본묳
뽇서본석첫삭뽑롷떵춤
분촐럶사눙읽숟뗘분뻨
듐삭빶쏘윙잉썩손뵬괆
쌰뭉쇼텰궮변번첳웅텩
뽇흶아희쾯볻훼윺엄솝
코드골프욉쁍숙쌉삼쏩

私は実際にそれを終えてとてもうれしいです!

私はこの言語を初めて使用するので、バイトカウントの改善に関するヒントを歓迎します。

ここで試してみてください!(コードをコピーして貼り付けます)

よりクリーンなバージョン

방빠반루ㅇ쀼머솔쌀이
아노숙차뿌썁썸뻐솝셜
본서번분번뮤따냐별쀼
슉누번나투쑫썬쌀본묘
뽀서본석처삭뽀로떠추
분초러사누이숟뗘분뻐
듀삭빠쏘ㅇ이썩손뵬ㅇ
쌰뭉쇼텨이변번처우텨
뽀희ㅇㅇㅇ볻ㅇ유어솝
ㅇㅇㅇㅇㅇㅇ숙쌉삼쏩

通常バージョンとクリアバージョンの違いは何ですか?
オリバーNi

@Oliver最初のバージョンにはNOP(ㅇ)がなく、より複雑な文字があります(これらは同一のコードです。最初のものはより難解に見えるようにしました)。2番目のバージョンは、すべての意味のない、プログラムを実際に読みたい人向けです。
ジョンファンミン

0

Scala、138バイト

def?(n:Int):Int={val p=Stream.from(2).filter(n%_==0)(0)
if(p==n)n else?(n/p)}
def s(i:Int):Boolean=i<2||(i+"")==(i+"").reverse&&s(i/ ?(i))

ゴルフをしていない:

def largestFactor(n:Int):Int={
  val p=Stream.from(2).filter(n%_==0).head
  if(p==n)n else largestFactor(n/p)}
def superPalindrome(i:Int):Boolean=i<2||(i+"")==(i+"").reverse&&superPalindrome(i/ largestFactor(i))

説明:

def?(n:Int):Int={                       //define a method for the largest prime factor
  val p=Stream.from(2).filter(n%_==0)(0)  //find the first factor of n
  if(p==n)n else?(n/p)                    //if it's n, return n else the next factor
}
def s(i:Int):Boolean=                     //method for the superprime
  i<2                                     //if s<2 return true
  ||                                      //else return:
    (i+"")==(i+"").reverse                  //is i a palindrome
    &&                                      //and
    s(i/ ?(i))                              //is i divided by it's largestPrimeFactor a superpalindrome

0

JavaScript(ES6)、78バイト

(n,d=2,p=1)=>n%d?n<2||f(n,d+1,p):[...p=p*d+''].reverse().join``==p&&f(n/d,d,p)

素因数分解接頭辞を再帰的に構築し、回文性をチェックします。


0

Java 7、133バイト

int c(int a){int x=a,y=0,z=a,i=2;for(;x>0;y=y*10+x%10,x/=10);for(;z>1;i++)for(;z%i<1;z/=i);if(a<2)return 1;return y!=a?0:c(a/(i-1));}

非ゴルフ

    static int c( int a ){
    int x = a , y = 0 , z = a , i = 2 ;

    for ( ; x > 0 ; y = y * 10 + x % 10 , x /= 10 ) ;

    for ( ; z > 1 ; i++ )
    for ( ; z % i < 1 ; z /= i ) ; 

    if ( a < 2 )
      return 1 ;

    return y != a ? 0 : c( a / ( i - 1 ) ) ;       
 }

0

実際には、29バイト

このコードには、おそらくゴルフできるいくつかのセクションがありますが、まだどこにあるかわかりません。ゴルフの提案を歓迎します。オンラインでお試しください!

╗1`X╜$;R=;╝╜yN╜\;╗1<&`╬X╜DY╛&

アンゴルフ

          Implicit input n.
╗         Save n to register 0.
1`...`╬   Run the following function on the stack while TOS is truthy.
  X         Discard the previous truthy.
  ╜         Push n from register 0.
  $         Push str(n).
  ;R=       Check if str(n) == str(n)[::-1], i.e. if n is a palindrome.
  ;╝        Save a copy of (is n a palindrome?) to register 1.
  ╜yN       Get the largest prime factor of n.
  ╜\        Divide n by its largest prime factor.
  ;╗        Save a copy of n // l_p_f to register 0.
  1<        Check if 1 < n // l_p_f. This returns 0 only if n // l_p_f is 1.
  &         Logical AND (is n a palindrome?) and (is n // l_p_f > 1?).
            This quits if we have reached a non-palindrome or we have reached 1.
X         Discard the falsey that ended the previous function.
╜         Get the last value saved to register 0 (could be 1 or a non-palindrome // l_p_f)
DY        This returns 1 if register 0 was a 1, else 0.
╛&        Logical AND with register 1 (was the last n a palindrome?) to get our result.
          Implicit return.
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.