楽しい数字ですか?


22

満足のいく番号(この定義による)は、次のプロセスで渡すことができる番号です(41802000例として使用しましょう)。

  • 末尾の同一番号を区切ります(41802000 => [41802, 000]
  • 数字の前半をソートし、最大値([41802, 000] => [8, 000]
  • 最後の要素の長さを取得します。結果の要素AおよびB[8, 000] => A=8, B=3)を呼び出します
  • N B = Aは任意の整数Nですか?(Trueこの例では、2 3 = 8)

入力Trueが次のプロセスからの結果である場合、それは楽しいと見なされます。

あなたの仕事は、整数を取り、心地よい数であるxかどうかを出力することxです。truthyとfalseyの2つの異なる値を出力できますが、回答で使用しているものを明記してください。x少なくとも2桁の異なる数字を持つことが保証されています(たとえば111、無効な入力です)。ほとんどの課題と同様に、あなたは取るかもしれませんx同様に、文字列または数字のリストを使用できます。

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

テストケース

          Input          Output
       41802000               1
            100               1
      123456788               0
      451111111               0
234543454545444               0
             12               1
       41902000               0
          92599               1

数値を文字列として渡すことができますか?(特に '234543454545444'テストケースを指定)
Uriel

@Uriel入力を文字列として受け取ることができます
ケアード・コイナーリンガー

3
明確化のための提案として、数字の値から抽象化された小数点文字を具体的に参照しているため、「数字」ではなく「数字」という用語を使用します。
ジョナサンフレッチ

list of digits-これは、ASCII数字の文字のリスト、または0-9からの整数のリストになります
Οurous

回答:


9

APL(Dyalog)、36バイト

{(⊢≡⌊)(⌈/⍎¨⍵/⍨~o)*÷≢⍵/⍨o←⌽⌊\1,2=/⌽⍵}

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

どうやって?

ほぼ詩。

⌽⍵ -入力を1回反転します。

1,2=/ -差分リストを取得します。

⌊\ -最初のグループのみを保持し、

-裏返して完了します。


o←-に割り当てo

~o -1と0を切り替え、

⍵/⍨ -入力をフィルタリングします。

⍎¨ -結果を各桁のリストに変換し、

  • ⌈/-そして最大値を取得します。(それはAです)

⍵/⍨oo-unalt(ered)で入力をフィルタリングし、

-そして、長さを取る、それはBになります

÷ -この結果で1つを割ります。

* -そして、その力にAを取る。


⊢≡⌊ -整数?


8

05AB1E、11バイト

γRćgUZXzm.ï

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

説明

γRćgUZXzm.ï〜完全なプログラム。

γ〜一連の数字に分割します。
 R〜リバース。
  ć〜a [1:]、a [0]をスタックにプッシュします。
   g〜(a [0]の)長さ。
    U〜これを整数変数Xに割り当てます。
     ZX〜ポップせずに最大値を取得し、Xを押します。
       ZM〜A 1 / B。
         .ï〜整数ですか?

Emignaは1バイトを節約しました。

ABの累乗の正の整数Nである場合、N = A 1 / Bであるため、整数でなければなりません。


UZX代わりに動作するはずですs{θs
Emigna

9バイトのプログラムは失敗します41902000(偽であるはずです)。
ズガーブ

@Zgarbうん、私も...私はそれを取り除くように、ほぼ必ずそれは、失敗していました私たちはまったく同じ整数ました
氏Xcoder

失敗418802000
Okx

8

Haskell85 75 72 71バイト

編集:文字列の代わりに数字のリストを取ることにより、-10バイト。これが許可されていることを指摘してくれたWhatToDoに感謝します。CleanのOurousのソリューションのおかげで-3バイト。user28667のおかげで-1バイト。

f s|(b,a)<-span(==last s)$reverse s=or[n^length b==maximum a|n<-[1..9]]

オンラインでお試しください!入力を数字のリストとして受け取ります。使用例:f [4,1,8,0,2,0,0,0]yields True

説明:

入力が与えられるとs=[4,1,8,0,2,0,0,0]、私たちreverseはリストし、先行要素をspan(==last s)以下で分離します:([0,0,0],[2,0,8,1,4])(b,a)yields b=[0,0,0]およびのパターンマッチングa=[2,0,8,1,4]

リスト内包のor[n^length b==maximum a|n<-[1..a]]任意の整数かどうかをチェックするnの範囲内19満たしn^length b==maximum aています、n^3=8


あなたは私が私のものをする前にあなたのものを投稿しました、そして私たちのものは似ているので、オンラインで試してみてください!
WhatToDo

@WhatToDoありがとう、入力として許可されている数字のリストが表示されませんでした。
ライコニ

最大限に活用することはできません。それらをすべて確認する必要はありません。
ティム

@Tim私はあなたが何を意味するか理解していない。入力リスト全体の最大値を取得aするのは、などの場合に失敗し477ます。
ライコニ

@Tim私はget bに最大値を取りますが、すべての整数nをチェック0します9(以前はfrom 0からa)。私が見る限り、それはまさに仕様です。
ライコニ

5

Haskell104 89バイト

@Laikoniはより短い解決策を見つけましたが、これは私ができる最善の方法です。入力として数字のリストも受け入れることができることを教えてくれて、@ Laikoniに感謝します。

import Data.List
(g.length.last<*>maximum.concat.init).group
g b a=any(==a)$(^b)<$>[1..a]

説明:

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


使用できるany(==a)ときに使用するのはなぜelem aですか?
小麦ウィザード

@WheatWizard 2番目のコメントに関する提案に感謝します2888。たとえば、これは失敗しませんか?
flawr

はい、質問を読み違えているようです。末尾の数字がゼロ以外であることを理解していませんでした。
小麦ウィザード

ただし、2バイトhead.maximumよりも短いmaximum.concatため、機能は維持されます。
小麦ウィザード

4

R、80バイト

function(x)any((0:(m=max((d=rle(rev(utf8ToInt(c(x,''))-48)))$v[-1])))^d$l[1]==m)

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

utf8ToInt - 48数字を数字に分割するために使用します。これにより、文字列への変換から警告がスローされます。

rleを使用すると、末尾の桁数と最初の桁の最大値が取得されます。0から最大値のトレーリングカウントの累乗までの範囲のいずれかが最大値と等しい場合、trueを返します。

さらにゴルフの機会があると思いますが、それは明日まで待つことができます。


2
:私は私のポストはちょうどあなたの答えを組み合わせるとNOFPさん@されたことを見ていなかったので、私は私の答えを削除function(x,R=rle(rev(utf8ToInt(x)-48)))!max(R$v[-1])^(1/R$l[‌​1])%%1(66バイトを取るx文字列として)
plannapus

@plannapus個人的には、元に戻します。それは本当にいずれかのコピーではない私たちの両方よりも優れたカウントだと
MickyT

@plannapus私はMickyTに同意します!
NOFP

@NofPとMickyT:OKはその後、ここにある
plannapus

4

ゼリー、11バイト

ŒgµṪL9*€fṀL

入力を数字のリストとして受け取ります。

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

使い方

ŒgµṪL9*€fṀL  Main link. Argument: D (digit array)

Œg           Group runs of digits, yielding a run array R.
  µ          Begin a new chain with argument D.
   Ṫ         Tail; remove and yield the last element of D.
    L        Take the length. Let's call it b.
     9*€     Compute [1**b, ..., 9**b].
         Ṁ   Take the maximum run in R, yileding [a, ..., a].
        f    Filter, yielding either [a] (if a = n**b for some n) or [].
          L  Take the length. 

答えを見る前に、Jellyをまったく知らなくても、Jellyの答えは12バイトになると思いました。;)
DLosc

4

R、66バイト

この答えは、多かれ少なかれMickyTNofPの答えのメドレーであり、彼らの要求に応じて、ここにあります:

function(x,R=rle(rev(utf8ToInt(x)-48)))!max(R$v[-1])^(1/R$l[1])%%1

文字列としてxを取ります。

> f=function(x,R=rle(rev(utf8ToInt(x)-48)))!max(R$v[-1])^(1/R$l[1])%%1
> f("41802000")
[1] TRUE
> f("100")
[1] TRUE
> f("123456788")
[1] FALSE
> f("451111111")
[1] FALSE
> f("234543454545444")
[1] FALSE
> f("12")
[1] TRUE
> f("41902000")
[1] FALSE

3

JavaScript(ES7)、66バイト

入力を文字列または文字の配列として受け取ります。ブール値を返します。

f=([c,...s],m)=>s.some(n=>n-c)?f(s,c<m?m:c):!(m**(1/-~s.length)%1)

テストケース



3

パイソン295の 78バイト

  • Rodのおかげで17バイト節約できました。
def f(s,i=~0):
	while s[i]==s[~0]:i-=1
	return int(max(s[:-~i]))**(1./~i)%1==0

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


あなたは、あなただけの最高を得ることができ、ソートoを必要としない、とあなたがすでに持っているのでi、あなたがドロップすることができますlen 達する78のバイトを
ロッド

@Rodどうもありがとう。
ジョナサンフレッチ

2

R、93バイト

function(x){n=nchar(x)
d=x%/%10^(n:1-1)%%10
i=max(which(d!=d[n]))
max(d[1:i])^(1/(n-i))%%1>0}

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

このコードは整数を入力として受け取り、数値が満足できる場合はFALSEを返し、そうでない場合はTRUEを返します。


2

Pythonの388の 85バイト

def f(n):p=n.rstrip(n[-1]);a=int(max(p));b=len(n)-len(p);return round(a**(1/b))**b==a

ゴルフをしていない:

def is_pleasing_number( n ):
    prefix = n.rstrip(n[-1])
    a = int(max(prefix))
    b = len(n) - len(prefix)
    return round(a ** (1 / b)) ** b == a
  • 入力引数は数字列であることが期待されています
  • 出力は、TrueまたはFalse
  • まだ独立の開発に類似Halvardの答えなくなるまで丸め誤差の影響を受けないようにして浮動小数点演算を使用a ** (1 / b)から少なくとも0.5でオフになったB 2を超える値が必要√A 53(または任意の浮動小数点基数と仮数Pythonが使用する長さですsys.float_info
  • 2から36までの任意の基数で動作するように簡単に変更できます。

@ovs:少し変更を加えて、はい。この関数は、余分な引数としてベースを取るとの呼び出しにそれを渡す必要がありますintrange。(ある時点で、a^(1/b)大量のパワーを計算するよりも、ontに基づいて検索範囲を推定する方が実行可能になります。)
デビッドフォースター


1

Ruby、64バイト

->a{!([a[/(\d)\1*$/].size,$`.chars.max]*?x!~/x1$|^2x[49]|^3x8/)}

文字列として入力し、次の場合にtrueを返します。

  • B == 1(Aをチェックする必要はありません)
  • A == 4およびB == 2
  • A == 9およびB == 2
  • A == 8およびB == 3

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


1

Perl 6、55バイト

{m/(\d+?)((\d)$0*)$/;so any(^10)**$1.comb==$0.comb.max}

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

入力が正の整数である場合にのみ成功する初期正規表現の評価後、数値$0の初期部分が$1含まれ、後続の反復数字が含まれます。

comb引数なしのメソッドは文字列に適用され、文字のリストを返します。これは数値コンテキストではリストの長さに評価されます。そう$0.comb.max接頭語で数字の最も大きく、$1.combあり、サフィックスの長さでもあります。

次にany(^10)、サフィックスの長さの累乗になったとき(0-9の数字の論理和)がプレフィックスの最大桁に等しいかどうかを確認します。so力そううまくtruthy値として独自になりその結果、接合のブール評価が、ちょうど二つの異なる値に対する挑戦呼び出しが返されます。


これは遅いですが、入力は整数であることが保証されているため、正規表現はの.代わりに使用できます\d
DLosc



1

C#(.NET Core)、132バイト

n=>{int A=0,B=1,s=1,i=n.Length-1;for(;i-->0;)if(n[i]==n[i+1]&s>0)B++;else{A=n[i]>A?n[i]:A;s=0;}return System.Math.Pow(A,1d/B)%1==0;}

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

謝辞

@KevinCruijssenのおかげで-12バイト

デゴルフド

n=>{
    int A=0, // maximum digit
        B=1, // count of trailing identical numbers
        s=1, // 1 if dealing with trailing numbers, 0 otherwise
        i=n.Length-1;

    for(; i-- > 0;)
        if(n[i] == n[i+1] & s > 0)
            B++;
        else
        {
            A = n[i] > A? n[i] : A;
            s = 0;
        }

    return Math.Pow(A, 1d/B) % 1 == 0;
}

私はそれがしばらくしているが、知っているi=n.Length-2;for(;i>=0;i--)にgolfedことができるi=n.Length-1;for(;i-->0;)&&するgolfedすることができます&
ケビンクルーッセン

ああ、削除しusing System;System.Math.Pow直接使用することで、さらに6バイトをゴルフできます。
ケビンクルーッセン

最後に一つだけ。現在、文字のリストを取得していますが、数字のリストを取得することもできます。その場合、-48-3バイトでゴルフできます。
ケビンクルーッセン

1

ジャプト 26 18バイト

ó¶
o l
ñ o n qV v1

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


入力を文字列として受け取り、返します 1、心地よい数字を、0そうでない場合に。

簡単な説明:

ó¶

最初の入力を取得し、(x,y) => x===ytrueの値で分割します。たとえば'41802000'['4','1','8','0','2','000']

o l

最初のステップから配列を取得し、最後の要素を削除してその長さを取得し、Bを生成します。

ñ o n qV v1

残りの配列で最大の要素を見つけてAを求め、それをべき乗1/Bして、結果が1で割り切れる場合に戻ります。


初めてJaptを使用して、推奨事項に非常にオープンです。ETHproductionsの
おかげで8バイト削らました


こんにちは、Japtへようこそ!ごめんなさい、最初はあなたの答えを逃しました。いくつかのヒント:1)自動機能を使用して、最初の行をに変えることができますó¶。2)わからないあなたが持っている理由v、それはちょうど、小文字に文字列を変換し、長さ;-) 3には影響しないよう、2行目)あなたは避けることができます!(U変更することで、最後の行にする%1にはv1、そのリターン1の対象であれば1または0それ以外で割り切れます。
-ETHproductions

@ETHproductionsご意見ありがとうございます。本当に感謝しています。以前に自動機能について読みましたが、例に感謝しますが、まだ完全にはこだわっていません。残りの変更も含めて、合計で8バイトが失われました。
NIT


0

、33バイト

≔ESιθ⊞υ⊟θW⁼§υ⁰§θ±¹⊞υ⊟θ¬﹪XI⌈θ∕¹Lυ¹

オンラインでお試しください!リンクは、コードの詳細バージョンです。-心地よい数字を出力します。説明:

≔ESιθ

入力qを文字に分割します。

⊞υ⊟θ

から最後の文字を削除してqプッシュしますu(空のリストに事前定義されています)。

W⁼§υ⁰§θ±¹⊞υ⊟θ

最後のキャラクターが qがの最初の文字であるuます。

¬﹪XI⌈θ∕¹Lυ¹

の最大桁をq取得し、長さの逆数の累乗に上げてからu、結果が整数かどうかを確認します。




0

Java 8、125バイト

a->{int A=0,B=1,f=1,i=a.length-1;for(;i-->0;)if(a[i]==a[i+1]&f>0)B++;else{A=a[i]>A?a[i]:A;f=0;}return Math.pow(A,1d/B)%1==0;}

@ Ayb4btuのC#.NET回答のポート。

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

説明:

a->{                       // Method with digit-array parameter and boolean return-type
  int A=0,                 //  Maximum digit `A` as specified in the challenge description
      B=1,                 //  `B` as specified in the challenge description
      f=1,                 //  Flag-integer, starting at 1
      i=a.length-1;        //  Index integer `i`
  for(;i-->0;)             //  Loop `i` backwards over the digits (excluding the last)
    if(a[i]==a[i+1]        //   If the current and next digits are the same,
       &f>0)               //   and the flag is still 1
      B++;                 //    Increase `B` by 1
    else{                  //   Else:
      A=a[i]>A?            //    If the current digit is larger than `A` 
         a[i]              //     Replace `A` with the current digit
        :                  //    Else:
         A;                //     Leave `A` the same
      f=0;}                //    Set the flag-integer to 0
  return Math.pow(A,1d/B)  //  Return if `A` ^ (1/`B`)
    %1==0;}                //  is an exact integer


0

Pyth, 29 bytes

JezWqezJ=Pz=hZ)K@sh.MsZzZqKsK

Test suite

Python 3 translation:
Z=0
z=input()
J=z[-1]
while z[-1]==J:
    z=z[:-1]
    Z+=1
K=max(map(int,z))**(1/Z)
print(K==int(K))
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.