기분 좋은 숫자입니까?


22

유쾌한 숫자 (이 정의에 따름)는 다음 프로세스를 통과 할 수있는 숫자입니다 ( 41802000예를 들어 보자).

  • 후행 동일한 숫자를 분리하십시오 ( 41802000 => [41802, 000])
  • 숫자의 전반부를 정렬하고 최대 값을 가져옵니다 ( [41802, 000] => [8, 000])
  • 최종 요소의 길이를 가져옵니다. 결과 요소 AB를 호출합니다 ( [8, 000] => A=8, B=3)
  • 정수에 대해 N B = A N입니까? ( True이 예에서는 2 3 = 8)

입력 결과가 True다음과 같은 과정에서 발생하면 유쾌한 것으로 간주됩니다.

당신의 작업은 integer를 취하고 유쾌한 숫자 x인지 여부를 출력하는 것 x입니다. 진실과 거짓에 대한 두 가지 고유 한 값을 출력 할 수 있지만 답에 사용중인 것을 명시하십시오. x적어도 두 개의 고유 숫자가 있어야합니다 (예 : 111유효하지 않은 입력). 대부분의 문제와 마찬가지로 x문자열 또는 숫자 목록으로 사용할 수 있습니다.

이것은 이므로 바이트 단위의 가장 짧은 코드가 승리합니다.

테스트 사례

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

숫자를 문자열로 전달할 수 있습니까? (특히 '234543454545444'테스트 사례가 주어짐)
Uriel

당신은 문자열로 입력을 할 수 @Uriel
coinheringaahing 케어 드

3
설명을위한 제안으로 : 숫자 값에서 추상화 된 10 진수 문자를 구체적으로 언급 할 때 "숫자"대신 "숫자"라는 용어를 사용합니다.
Jonathan Frech

list of digits- 이것은 ASCII 숫자 문자의 목록 또는 0-9의 정수의 목록이 될 것입니다
Οurous

1
@ Οurous Up to you
caird coinheringaahing

답변:


9

APL (Dyalog) , 36 바이트

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

온라인으로 사용해보십시오!

방법?

거의시.

⌽⍵ -입력을 한 번 뒤집고

1,2=/ -차이점 목록을 얻으십시오.

⌊\ -첫 번째 그룹 만 유지하십시오.

-뒤집어 완성합니다.


o←- 할당 o,

~o -1과 0을 바꾸고

⍵/⍨ -입력을 필터링하고

⍎¨ -결과를 각 숫자의 목록으로 바꾸십시오.

  • ⌈/-최대 값을 얻습니다. (그건)

⍵/⍨oo-unalt (ered)로 입력을 필터링하고

-길이는 B입니다.

÷ -하나를이 결과로 나눕니다.

* 그 힘을 A에게 가져 가라


⊢≡⌊ - 정수?


8

05AB1E , 11 바이트

γRćgUZXzm.ï

온라인으로 사용해보십시오!

설명

γRćgUZXzm.ï ~ 전체 프로그램.

γ ~ 자릿수로 나눕니다.
 R ~ 역전.
  ć ~ a [1 :], a [0]을 스택으로 밉니다.
   g ~ 길이 (a [0]).
    U ~ 이것을 정수 변수 X에 할당합니다.
     ZX ~ 터지지 않고 최대 값을 얻고 X를 누릅니다.
       ZM ~ 1 / B .
         .ï ~ 정수입니까?

Emigna는 1 바이트를 절약했습니다.

AB 의 거듭 제곱으로 양의 정수 N 이면 N = A 1 / B 이므로 정수 여야 한다는 사실에 의존 합니다.


UZX대신에 작동해야 함s{θs
Emigna

9 바이트 프로그램이 실패합니다 41902000(가짜 여야 함).
Zgarb

나는 그것을 제거 할 수 있도록 네 @Zgarb 나는 또한 ... 거의 확인이 실패했습니다 우리는 동일한 정수있어
씨 Xcoder

실패418802000
Okx

8

하스켈 , 85 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)수율에 패턴 일치 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 감사합니다, 입력으로 허용되는 자리 목록을 보지 못했습니다.
Laikoni

당신은 최대를 취할 수 없습니다. 모두 확인할 필요가 없습니다.
Tim

@Tim 나는 당신이 무슨 뜻인지 이해하지 못합니다. 다음 a과 같은 경우 전체 입력 목록을 최대한 활용 하면 실패 477합니다.
Laikoni

@Tim 나는 최대 값을 얻지 b만 모든 정수 n0~에서 9(이전부터 0~까지 a) 확인합니다. 그것이 내가 아는 한 정확하게 사양입니다.
Laikoni

5

하스켈 , 104 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 두 번째 의견에 대한 제안에 감사드립니다. 예를 들어 실패 2888합니까?
flawr

예, 질문을 잘못 읽은 것 같습니다. 후행 숫자가 0이 아닌 다른 것을 알 수 없었습니다.
Wheat Wizard

그러나 head.maximum여전히 maximum.concat2 바이트 보다 짧으며 기능을 유지합니다.
Wheat Wizard

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 : 좋아요, 여기 있습니다
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. 

대답을보고 젤리를 전혀 알지 못하기 전에 젤리 대답이 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

자바 스크립트 (ES7), 66 바이트

문자열 또는 문자 배열로 입력을받습니다. 부울을 반환합니다.

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

테스트 사례




2

아르 자형 , 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

파이썬 3 , 88 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 점 기수 가수 부동 (또는 어떤 파이썬이 사용하는 길이, 참조 sys.float_info).
  • 2에서 36 사이의 임의의 숫자로 작동하도록 간단하게 수정할 수 있습니다.

@ovs : 약간만 수정하면됩니다. 이 기능은 별도의 인수로 기본을 가지고의 호출에 전달해야 int하고 range. (어떤 시점에서 검색 범위를 기반으로 ONT 예측하기가 실현 될 것입니다 a^(1/b)힘의 많은 양을 계산하는 것보다 있습니다.)
데이비드 푀르 스터에게


1

루비 , 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

펄 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 코어) 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--)이 지났지 만 골프를 타 i=n.Length-1;for(;i-->0;)거나 골프를 타는 것을 알고 &&있습니다 &.
Kevin Cruijssen

아,를 using System;사용하여 System.Math.Pow직접 6 바이트를 더 사용할 수 있습니다.
Kevin Cruijssen

마지막 한가지. 현재 문자 목록을 사용하지만 숫자 목록도 사용할 수 있습니다. 이 경우 -48-3 바이트로 골프를 칠 수 있습니다.
Kevin Cruijssen

1

apt , 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 바이트가 줄었습니다 .


야, 자프에 온 걸 환영 해! 처음에 답을 그리워서 미안합니다. 몇 가지 팁 : 1) 자동 기능 을 사용 하여 첫 번째 줄을로 바꿀 수 있습니다 ó¶. 2) 확인 당신은 왜이하지 v그냥 문자열을 소문자로 변환하여 길이 ;-) 3) 당신은 피할 수에 영향이 없기 때문에, 두 번째 줄에 !(U변경하여 마지막 줄에를 %1v1하는 반환 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

자바 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 바이트

JezWqezJ=Pz=hZ)K@sh.MsZzZqKsK

테스트 스위트

파이썬 3 번역 :
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.