¿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

¿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?


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.


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.


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!


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


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. 

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

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


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!



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.


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.

@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


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!


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.


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

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

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 .


¡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!


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.




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


0

Pyth, 29 bytes

JezWqezJ=Pz=hZ)K@sh.MsZzZqKsK

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))
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.