É um número agradável?


22

Um número agradável (de acordo com esta definição) é um número que pode ser passado pelo processo a seguir (vamos usar 41802000como exemplo):

  • Separe os números idênticos à direita ( 41802000 => [41802, 000])
  • Classifique a primeira metade dos dígitos e leve o máximo ( [41802, 000] => [8, 000])
  • Pegue o comprimento do elemento final. Chame os elementos resultantes A e B ( [8, 000] => A=8, B=3)
  • N B = A para qualquer número inteiro N? ( Trueneste exemplo; 2 3 = 8)

Se a entrada resultar Truedo processo a seguir, ela será considerada agradável.

Sua tarefa é pegar um número inteiro xe produzir se xé um número agradável. Você pode gerar dois valores distintos para truthy e falsey, mas indique o que está usando em sua resposta. xé garantido que tenha pelo menos dois dígitos distintos (por exemplo, 111é uma entrada inválida). Como na maioria dos desafios, você pode usar xuma string ou uma lista de dígitos.

Este é um pelo que o código mais curto em bytes vence.

Casos de teste

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

o número pode ser passado como uma string? (especialmente considerando o caso de teste '234543454545444')
Uriel

@Uriel Você pode receber a entrada como uma string
caird coinheringaahing

3
Como sugestão para esclarecimento: eu usaria o termo "dígito" em vez de "número", como você está se referindo especificamente aos caracteres decimais, abstraídos de seus valores numéricos.
Jonathan Frech

list of digits- seria uma lista dos caracteres numéricos ASCII ou uma lista de números inteiros de 0 a 9
Οurous

1
@ Οurous Até você
caird coinheringaahing

Respostas:


9

APL (Dyalog) , 36 bytes

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

Experimente online!

Quão?

Quase um poema.

⌽⍵ - reverta a entrada uma vez,

1,2=/ - obtenha a lista de diferenças.

⌊\ - mantenha apenas o primeiro grupo de pessoas,

- e vire para completar.


o←- atribuir a o,

~o - trocar uns e zero (s),

⍵/⍨ - filtrar a entrada com ele,

⍎¨ - transforme o resultado na lista de cada dígito,

  • ⌈/- e obtenha o máximo. (aquilo é um)

⍵/⍨o- filtrar a entrada com ounalt (ered),

- e levar o comprimento, isso seria B.

÷ - divida uma por esse resultado,

* - e leve A a esse poder.


⊢≡⌊ - inteiro?


8

05AB1E , 11 bytes

γRćgUZXzm.ï

Experimente online!

Explicação

γRćgUZXzm.ï ~ Programa completo.

γ ~ Divida em séries de dígitos.
 R ~ Reverso.
  Pressione ~ [1:], a [0] para a pilha.
   g ~ Comprimento (de a [0]).
    U ~ Atribua isso à variável inteira X.
     ZX ~ Obtenha o máximo, sem avançar, e pressione X.
       zm ~ A 1 / B .
         .ï ~ É um número inteiro?

Emigna salvou 1 byte.

Baseia-se no fato de que, se A é um número inteiro positivo N elevado à potência de B , então N = A 1 / B , portanto, ele deve ser um número inteiro.


UZXdeve funcionar em vez des{θs
Emigna

O programa de 9 bytes falha 41902000(deve ser falso).
Zgarb

@Zgarb Sim, eu estava quase certo de que iria falhar, então eu o retirei ... Também lol temos exatamente o mesmo número inteiro
Mr. Xcoder

Falha para418802000
Okx

8

Haskell , 85 75 72 71 bytes

Edite : -10 bytes, tomando uma lista de dígitos em vez de uma string. Obrigado ao WhatToDo por apontar que isso é permitido. -3 bytes graças à solução Ourous no Clean . -1 byte graças a user28667 .

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

Experimente online! Recebe a entrada como uma lista de dígitos. Exemplo de uso: f [4,1,8,0,2,0,0,0]rendimentos True.

Explicação:

Dada uma entrada s=[4,1,8,0,2,0,0,0], nós reverseda lista e separar os elementos que conduzem com span(==last s): ([0,0,0],[2,0,8,1,4]). O padrão correspondente nos (b,a)rendimentos b=[0,0,0]e a=[2,0,8,1,4].

As lista de compreensão or[n^length b==maximum a|n<-[1..a]]verifica se qualquer inteiro nno intervalo entre 1a 9satisfaz n^length b==maximum a, isto é n^3=8.


Você postou o seu antes do meu, e o nosso é semelhante, então: Experimente online!
WhatToDo

@WhatToDo Obrigado, não vi as listas de dígitos permitidas como entrada.
Laikoni

Você não pode simplesmente tirar o máximo. Não há necessidade de verificar todos eles.
Tim

@ Tim Não sei ao certo o que você quer dizer. Tomar o máximo de toda a lista de entradas para obter afalharia em casos como esse 477.
Laikoni

@ Tim Tomo o máximo para obter b, mas verifique todos os números inteiros nde 0até 9(anteriormente de 0até a). Essa é exatamente a especificação, tanto quanto eu vejo.
Laikoni

5

Haskell , 104 89 bytes

A @Laikoni encontrou uma solução mais curta , mas é o melhor que posso fazer. Obrigado @Laikoni por me informar que também podemos aceitar listas de dígitos como entrada.

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

Explicação:

Experimente online!


Por que usar any(==a)quando você poderia usar elem a?
Assistente de trigo

@WheatWizard Obrigado pelas sugestões, em relação ao seu segundo comentário: isso não iria falhar, por exemplo 2888?
flawr

Sim, parece que eu interpretei errado a pergunta. Não percebi que os números finais poderiam ser outra coisa que zero.
Wheat Wizard

mas head.maximumainda é menor que maximum.concat2 bytes e mantém a funcionalidade.
Wheat Wizard

4

R , 80 bytes

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

Experimente online!

Usa utf8ToInt - 48para dividir o número em dígitos. Isso lança um aviso da conversão em uma string.

Usando rle, obtenha a contagem dos dígitos finais e o valor máximo dos primeiros dígitos. Retorne true se qualquer um dos valores de 0 a max no poder da contagem à direita for igual a max value.

Penso que existem mais oportunidades de golfe, mas isso pode esperar até amanhã.


2
Eu apaguei a minha resposta, porque eu não vi que meu post foi apenas combinando sua resposta e @ NofP de: function(x,R=rle(rev(utf8ToInt(x)-48)))!max(R$v[-1])^(1/R$l[‌​1])%%1(66 bytes, tendo xcomo uma string)
plannapus

@ plannapus Pessoalmente, eu o anularia. É uma contagem melhor do que a nossa e não é realmente uma cópia de qualquer um deles.
MickyT 18/12/19

@ plannapus Concordo com MickyT!
NofP

@NofP e MickyT: OK, em seguida, aqui está
plannapus

4

Gelatina , 11 bytes

ŒgµṪL9*€fṀL

Recebe a entrada como uma lista de dígitos.

Experimente online!

Como funciona

Œ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. 

Antes de olhar para as respostas, e sem conhecer Jelly, imaginei que a resposta fosse de 12 bytes. ;)
DLosc 3/04

4

R, 66 bytes

Esta resposta é mais ou menos uma mistura das respostas de MickyT e NofP e, a pedido delas, aqui está:

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

Leva x como uma string.

> 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 bytes

Recebe a entrada como uma sequência ou uma matriz de caracteres. Retorna um booleano.

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

Casos de teste


3

Limpo , 130 128 118 93 bytes

import StdEnv
@l#(b,a)=span((==)(last l))(reverse l)
=or[n^length b==last(sort a)\\n<-[0..9]]

Define a função @, obtendo uma lista de dígitos inteiros.

Experimente online!



2

R , 93 bytes

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}

Experimente online!

O código usa um número inteiro como entrada e retorna FALSE se o número for agradável e TRUE caso contrário.


2

Python 3 , 88 85 bytes

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

Ungolfed:

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
  • O argumento de entrada deve ser uma sequência de dígitos
  • A saída é Trueou False.
  • Semelhante ao ainda desenvolvido independentemente da resposta de Halvard, mas usa aritmética de ponto flutuante de uma maneira que não sofra erros de arredondamento até que a ** (1 / b)seja desligado em pelo menos 0,5 de b √a, que requer um valor acima de 2 53 (ou qualquer radix e mantissa de ponto flutuante passa a usar Python, veja sys.float_info).
  • Pode ser modificado trivialmente para continuar trabalhando com bases de números arbitrárias entre 2 e 36.

@ovs: Com uma pequena modificação, sim. A função teria que pegar a base como um argumento extra e passá-la para as invocações de inte range. (Em algum momento ele se tornaria mais viável para estimar o ont baseada intervalo de pesquisa a^(1/b)do que para calcular grandes quantidades de poderes.)
David Foerster


1

Ruby , 64 bytes

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

Entrada como uma string, retorna true se:

  • B == 1 (não é necessário marcar A)
  • A == 4 e B == 2
  • A == 9 e B == 2
  • A == 8 e B == 3

Experimente online!


1

Perl 6 , 55 bytes

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

Experimente online!

Após a avaliação do regex inicial - que só pode ser bem-sucedido se a entrada for um número inteiro positivo - $0contém a parte inicial do número e $1os dígitos repetidos à direita.

O combmétodo sem argumentos, aplicado a uma seqüência de caracteres, retorna uma lista de caracteres que, em contexto numérico, é avaliada pelo comprimento da lista. Então, $0.comb.maxé o maior dos dígitos do prefixo e $1.combo comprimento do sufixo.

Depois, verificamos se any(^10)(ou seja, a junção ou dos números de 0 a 9), quando aumentada para a potência do comprimento do sufixo, é igual ao maior dígito do prefixo. A soavaliação booleana da força da junção resultante, que de outra forma seria adequada por si só como um valor verdadeiro, mas o desafio exige que apenas dois valores distintos sejam retornados.


Isso é tarde, mas como a entrada é garantida como um número inteiro, o regex pode usar em .vez de \d.
DLosc



1

C # (.NET Core) , 132 bytes

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;}

Experimente online!

Agradecimentos

-12 bytes graças a @KevinCruijssen

DeGolfed

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;
}

Eu sei que já faz um tempo, mas i=n.Length-2;for(;i>=0;i--)pode ser jogado i=n.Length-1;for(;i-->0;)e &&jogado &.
Kevin Cruijssen 03/04/19

Ah, e você pode jogar com mais 6 bytes removendo using System;e usando System.Math.Powdiretamente.
Kevin Cruijssen 03/04/19

Uma última coisa. No momento, você pega uma lista de caracteres, mas também é permitido fazer uma lista de dígitos. Nesse caso, o -48golfe pode ser alterado para -3 bytes.
Kevin Cruijssen

1

Japonês , 26 18 bytes

ó¶
o l
ñ o n qV v1

Experimente online!


Pega a entrada como uma string e retorna 1para números agradáveis, 0caso contrário.

Breve explicação:

ó¶

Pegue a primeira entrada e divida-a por valores onde (x,y) => x===yfor verdadeira. Por exemplo '41802000'para ['4','1','8','0','2','000'].

o l

Tome a matriz da primeira etapa, remover o último elemento e obter seu comprimento, produzindo B .

ñ o n qV v1

Encontre o maior elemento da matriz restante, produzindo A , leve-o à potência 1/Be retorne se o resultado for divisível por um.


Primeira vez que trabalhei com o Japt, muito aberto a quaisquer recomendações. Raspou
8 bytes graças a ETHproductions .


Ei, seja bem-vindo ao Japt! Desculpe, perdi suas respostas primeiro. Algumas dicas: 1) Você pode usar uma função automática para transformar a primeira linha em justa ó¶. 2) Não sei por que você tem a vsegunda linha, pois apenas converte a string para minúscula e não afeta o comprimento ;-) 3) Você pode evitar !(Ua última linha alterando %1para v1, que retorna 1se o assunto é divisível por 1 ou 0não.
ETHproductions

@ETHproductions Muito obrigado pelo seu feedback, realmente aprecio isso. Eu li sobre funções automáticas antes, mas ainda não entendi muito bem, obrigado pelo exemplo. Também incorporei o restante das alterações, totalizando 8 bytes perdidos.
Nit

0

Clojure, 168 bytes

(fn[x](let[y(reverse(vec x))z(count(take-while #(= %(first y))y))a(apply max(map #(-(int %)48)(drop z y)))b(Math/pow a(/ 1 z))](<(Math/abs(- b(Math/round b)))0.00001)))

Experimente online!


0

Carvão , 33 bytes

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

Experimente online! Link é a versão detalhada do código. Emite a -para números agradáveis. Explicação:

≔ESιθ

Divida a entrada qem caracteres.

⊞υ⊟θ

Remova o último caractere de qe empurre-o para u(predefinido para uma lista vazia).

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

Estale e empurre repetidamente enquanto o último caractere de qé o primeiro caractere de u.

¬﹪XI⌈θ∕¹Lυ¹

Pegue o dígito máximo de qe aumente à potência do inverso do comprimento de u, depois verifique se o resultado é um número inteiro.




0

Java 8, 125 bytes

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;}

Porta da resposta C # .NET de @ Ayb4btu .

Experimente online.

Explicação:

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

Pitão, 29 bytes

JezWqezJ=Pz=hZ)K@sh.MsZzZqKsK

Suíte de teste

Tradução Python 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))
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.