¿Es un número agradable?

22

Un número agradable (de acuerdo con esta definición) es un número que se puede pasar a través del siguiente proceso (usemos 41802000como ejemplo):

  • Separe los números idénticos finales ( 41802000 => [41802, 000])
  • Ordene la primera mitad de los dígitos y tome el máximo ( [41802, 000] => [8, 000])
  • Toma la longitud del elemento final. Llame a los elementos resultantes A y B ( [8, 000] => A=8, B=3)
  • ¿Es N B = A para cualquier número entero N? ( Trueen este ejemplo; 2 3 = 8)

Si la entrada resulta Truedel siguiente proceso, se considera agradable.

Su tarea es tomar un número entero xy mostrar si xes un número agradable. Puede generar dos valores distintos para verdadero y falso, pero indique lo que está utilizando en su respuesta. xse garantiza que tiene al menos dos dígitos distintos (por ejemplo, 111es una entrada no válida). Como con la mayoría de los desafíos, puede tomar xcomo una cadena o una lista de dígitos.

Este es un por lo que el código más corto en bytes gana.

Casos de prueba

          Input          Output
       41802000               1
            100               1
      123456788               0
      451111111               0
234543454545444               0
             12               1
       41902000               0
          92599               1
caird coinheringaahing
fuente
¿Se puede pasar el número como una cadena? (especialmente dado el caso de prueba '234543454545444')
Uriel
@Uriel Puede tomar la entrada como una cadena
caird coinheringaahing
3
Como sugerencia de aclaración: utilizaría el término "dígito" en lugar de "número", ya que se refiere específicamente a los caracteres decimales, abstraídos de sus valores numéricos.
Jonathan Frech
list of digits- ¿sería esta una lista de los caracteres numéricos ASCII, o una lista de enteros del 0 al 9
Οurous
1
@ Οurous Up to you
caird coinheringaahing

Respuestas:

9

APL (Dyalog) , 36 bytes

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

Pruébalo en línea!

¿Cómo?

Casi un poema

⌽⍵ - invierta la entrada una vez,

1,2=/ - Obtenga la lista de diferencias.

⌊\ - mantener solo el primer grupo de unos,

- y voltéalo para completar.


o←- asignar a o,

~o - cambiar unos y cero (s),

⍵/⍨ - filtrar la entrada con ella,

⍎¨ - convertir el resultado en una lista de cada dígito,

  • ⌈/- Y obtener el máximo. (eso es un)

⍵/⍨o- filtrar la entrada con ounalt (ered),

- y toma la longitud, eso sería B.

÷ - obtener uno dividido por este resultado,

* - y lleva A a ese poder para ti.


⊢≡⌊ - entero?

Uriel
fuente
8

05AB1E , 11 bytes

γRćgUZXzm.ï

Pruébalo en línea!

Explicación

γRćgUZXzm.ï ~ Programa completo.

γ ~ Dividir en series de dígitos.
 R ~ Reverso.
  ć ~ Empuje un [1:], un [0] a la pila.
   g ~ Longitud (de a [0]).
    U ~ Asigne esto a la variable entera X.
     ZX ~ Obtenga el máximo, sin reventar, y presione X.
       zm ~ A 1 / B .
         .ï ~ ¿Es un número entero?

Emigna guardó 1 byte.

Se basa en el hecho de que si A es un número entero positivo N elevado a la potencia de B , entonces N = A 1 / B , por lo tanto, debe ser un número entero.

Sr. Xcoder
fuente
UZXdebería funcionar en lugar des{θs
Emigna
El programa de 9 bytes falla 41902000(debería ser falso).
Zgarb
@ Zgarb Sí, estaba casi seguro de que iba a fallar, así que lo
eliminé
Falla para418802000
Okx
8

Haskell , 85 75 72 71 bytes

Editar : -10 bytes tomando una lista de dígitos en lugar de una cadena. Gracias a WhatToDo por señalar que esto está permitido. -3 bytes gracias a la solución de Ourous en Clean . -1 byte gracias al usuario 28667 .

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

Pruébalo en línea! Toma la entrada como una lista de dígitos. Ejemplo de uso: f [4,1,8,0,2,0,0,0]rendimientos True.

Explicación:

Dada una entrada s=[4,1,8,0,2,0,0,0], que reversela lista y separar los elementos principales con span(==last s): ([0,0,0],[2,0,8,1,4]). La coincidencia de patrones en (b,a)rendimientos b=[0,0,0]y a=[2,0,8,1,4].

La comprensión de la lista or[n^length b==maximum a|n<-[1..a]]verifica si cualquier número entero nen el rango de 1a 9satisface n^length b==maximum a, es decir n^3=8.

Laikoni
fuente
Usted publicó el suyo antes que el mío, y los nuestros son similares, así que: ¡ Pruébelo en línea!
WhatToDo
@WhatToDo Gracias, no vi que las listas de dígitos se permitieran como entrada.
Laikoni
¿No puedes tomar el máximo? No es necesario revisarlos todos.
Tim
@Tim No estoy seguro de entender lo que quieres decir. Tomar el máximo de toda la lista de entrada para obtener afallaría en casos como 477.
Laikoni
@Tim Tomo el máximo para obtener b, pero verifico cada número entero ndesde 0hasta 9(anteriormente desde 0hasta a). Esa es exactamente la especificación por lo que veo.
Laikoni
5

Haskell , 104 89 bytes

@Laikoni encontró una solución más corta , pero esto es lo mejor que pude hacer. Gracias @Laikoni por informarme que también podemos aceptar listas de dígitos como entrada.

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

Explicación:

Pruébalo en línea!

falla
fuente
¿Por qué usar any(==a)cuando podrías usar elem a?
Wheat Wizard
@WheatWizard Gracias por las sugerencias, con respecto a su segundo comentario: ¿No fallaría esto, por ejemplo 2888?
defecto
Sí, parece que leí mal la pregunta. No me di cuenta de que los números finales podrían ser diferentes a cero.
Wheat Wizard
pero head.maximumaún es más corto que maximum.concat2 bytes y mantiene la funcionalidad.
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)

Pruébalo en línea!

Utiliza utf8ToInt - 48para dividir el número en dígitos. Esto arroja una advertencia de la conversión a una cadena.

Usando rle obtenga el recuento de los dígitos finales y el valor máximo de los primeros dígitos. Devuelve verdadero si cualquiera del rango 0 al valor máximo de la potencia del recuento final es igual al valor máximo.

Creo que hay más oportunidades de golf, pero eso puede esperar hasta mañana.

MickyT
fuente
2
Eliminé mi respuesta porque no vi que mi publicación solo combinaba tu respuesta y la de @NofP: function(x,R=rle(rev(utf8ToInt(x)-48)))!max(R$v[-1])^(1/R$l[‌​1])%%1(66 bytes, tomando xcomo una cadena)
plannapus
@plannapus Personalmente lo recuperaría. Es un recuento mejor que ambos nuestro y no es realmente una copia de cualquiera
MickyT
@plannapus ¡Estoy de acuerdo con MickyT!
NofP
@NofP y MickyT: OK, aquí está
plannapus
4

Jalea , 11 bytes

ŒgµṪL9*€fṀL

Toma la entrada como una lista de dígitos.

Pruébalo en línea!

Cómo 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. 
Dennis
fuente
Antes de mirar las respuestas, y sin conocer a Jelly en absoluto, supuse que la respuesta de Jelly sería de 12 bytes. ;)
DLosc
4

R, 66 bytes

Esta respuesta es más o menos una mezcla de las respuestas de MickyT y NofP , y a pedido, aquí está:

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

Toma x como una cadena.

> 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
plannapus
fuente
3

JavaScript (ES7), 66 bytes

Toma la entrada como una cadena o una matriz de caracteres. Devuelve un booleano.

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

Casos de prueba

Arnauld
fuente
3

Limpias , 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 la función @ , tomando una lista de dígitos enteros.

Pruébalo en línea!

Οurous
fuente
3

Python 2 , 95 78 bytes

  • Salvó diecisiete bytes gracias a Rod .
def f(s,i=~0):
	while s[i]==s[~0]:i-=1
	return int(max(s[:-~i]))**(1./~i)%1==0

Pruébalo en línea!

Jonathan Frech
fuente
No necesita ordenar, solo puede obtener el máximo, y como ya lo tiene i, puede soltar el len alcance de 78 bytes
Rod
@ Rod Muchas gracias.
Jonathan Frech
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}

Pruébalo en línea!

El código toma un entero como entrada y devuelve FALSO si el número es agradable, y VERDADERO de lo contrario.

NofP
fuente
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

Sin golf:

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
  • Se espera que el argumento de entrada sea una cadena de dígitos
  • La salida es Trueo False.
  • Es similar a la desarrollada independientemente de la respuesta de Halvard, pero utiliza la aritmética de coma flotante de una manera que no sufra errores de redondeo hasta que a ** (1 / b)esté desactivada en al menos 0.5 de b √a, lo que requiere un valor por encima de 2 53 (o cualquier otra raíz flotante y mantisa longitud que Python utiliza, ver sys.float_info).
  • Se puede modificar trivialmente para seguir trabajando con bases de números arbitrarias entre 2 y 36.
David Foerster
fuente
@ovs: con una modificación menor, sí. La función tendría que tomar la base como argumento adicional y pasarla a las invocaciones de inty range. (En algún momento sería más factible estimar el rango de búsqueda en base a eso a^(1/b)que calcular grandes cantidades de poderes.)
David Foerster
2

C (gcc) , 144 126 117 bytes

  • Ahorró dieciocho bytes gracias a Dennis .
  • Guardado nueve bytes gracias a ceilingcat .
j,k,m;f(char*N){N+=j=strlen(N);k=~j;for(j=-1;m=N[j--]==N[j];);for(;k++<j;)m=fmax(N[k],m);j=!fmod(pow(m-48,1./~j),1);}

Pruébalo en línea!

Jonathan Frech
fuente
1

Ruby , 64 bytes

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

Entrada como una cadena, devuelve verdadero si:

  • B == 1 (no es necesario marcar A)
  • A == 4 y B == 2
  • A == 9 y B == 2
  • A == 8 y B == 3

Pruébalo en línea!

GB
fuente
1

Perl 6 , 55 bytes

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

Pruébalo en línea!

Después de la evaluación de la expresión regular inicial, que solo puede tener éxito si la entrada es un número entero positivo, $0contiene la parte inicial del número y $1los dígitos repetidos finales.

El combmétodo sin argumentos, aplicado a una cadena, devuelve una lista de los caracteres, que en contexto numérico se evalúa según la longitud de la lista. Entonces $0.comb.maxes el mayor de los dígitos en el prefijo, y$1.comb es la longitud del sufijo.

Luego verificamos si any(^10)(es decir, la unión o de los números del 0-9), cuando se eleva a la potencia de la longitud del sufijo, es igual al dígito más grande en el prefijo. La soevaluación booleana de las fuerzas de la unión resultante, que de otro modo estaría bien por sí sola como un valor verdadero, pero el desafío requiere que solo se devuelvan dos valores distintos.

Sean
fuente
Esto es tarde, pero dado que se garantiza que la entrada sea un número entero, la expresión regular puede usarse en .lugar de \d.
DLosc
1

Kotlin , 106 bytes

fun String.p()=split(Regex("(?=(.)\\1*$)")).let{Math.pow((it[0].max()?:'0')-'0'+.0,1.0/(it.size-1))}%1==.0

Salida: verdadero / falso

Pruébalo en línea!

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

Pruébalo en línea!

Expresiones de gratitud

-12 bytes gracias 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;
}
Ayb4btu
fuente
Sé que ha pasado un tiempo, pero i=n.Length-2;for(;i>=0;i--)se puede jugar golf i=n.Length-1;for(;i-->0;)y &&golf &.
Kevin Cruijssen
Ah, y puedes jugar al golf 6 bytes más eliminando using System;y usando System.Math.Powdirectamente.
Kevin Cruijssen
Una última cosa. Actualmente toma una lista de caracteres, pero también puede tomar una lista de dígitos. En cuyo caso -48se puede jugar golf por -3 bytes.
Kevin Cruijssen
1

Japt , 26 18 bytes

ó¶
o l
ñ o n qV v1

Pruébalo en línea!


Toma la entrada como una cadena, devuelve 1números agradables, de lo 0contrario.

Breve explicación:

ó¶

Tome la primera entrada y divídala por valores donde (x,y) => x===ysea ​​verdadero. Por ejemplo '41802000'a ['4','1','8','0','2','000'].

o l

Tome la matriz desde el primer paso, eliminar el último elemento y obtener su longitud, produciendo B .

ñ o n qV v1

Encuentre el elemento más grande en la matriz restante, produciendo A , llévelo a la potencia 1/By luego regrese si el resultado es divisible por uno.


Primera vez que trabaja con Japt, muy abierto a cualquier recomendación.
Afeitado de 8 bytes gracias a ETHproductions .

Liendre
fuente
¡Hola, bienvenido a Japt! Lo siento, perdí tus respuestas al principio. Algunos consejos: 1) Puede usar una función automática para convertir la primera línea en justa ó¶. 2) No estoy seguro de por qué tiene el ven la segunda línea, ya que solo convierte la cadena a minúsculas y no tiene ningún efecto en la longitud ;-) 3) Puede evitar el !(Uen la última línea cambiando %1a v1, que devuelve 1si el asunto es divisible por 1 o de lo 0contrario.
ETHproductions
@ETHproductions Muchas gracias por sus comentarios, realmente lo aprecio. Leí sobre las funciones automáticas antes, pero todavía no he entendido bien, gracias por el ejemplo. También he incorporado el resto de sus cambios, sumando un total de 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)))

Pruébalo en línea!

Attilio
fuente
0

Carbón , 33 bytes

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

Pruébalo en línea! El enlace es a la versión detallada del código. Salidas a -para números agradables. Explicación:

≔ESιθ

Divide la entrada qen caracteres.

⊞υ⊟θ

Elimine el último carácter qy empújelo a u(predefinido en una lista vacía).

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

Haga estallar y empujar repetidamente mientras que el último carácter de qes el primer carácter de u.

¬﹪XI⌈θ∕¹Lυ¹

Toma el dígito máximo de qy elevalo a la potencia del recíproco de la longitud deu , luego verifique si el resultado es un número entero.

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

Puerto de la respuesta de C # .NET de @ Ayb4btu .

Pruébalo en línea.

Explicación:

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
Kevin Cruijssen
fuente
0

Pyth, 29 bytes

JezWqezJ=Pz=hZ)[email protected]

Banco de pruebas

Traducción de 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))
hakr14
fuente