Est-ce un chiffre agréable?

22

Un nombre agréable (selon cette définition) est un nombre qui peut être passé par le processus suivant (utilisons 41802000comme exemple):

  • Séparez les nombres identiques de fin ( 41802000 => [41802, 000])
  • Triez la première moitié des chiffres et prenez le maximum ( [41802, 000] => [8, 000])
  • Prenez la longueur de l'élément final. Appelez les éléments résultants A et B ( [8, 000] => A=8, B=3)
  • N B = A est-il pour tout entier N? ( Truedans cet exemple; 2 3 = 8)

Si l'entrée résulte Truedu processus suivant, elle est considérée comme agréable.

Votre tâche consiste à prendre un entier xet à afficher s'il xs'agit d'un nombre agréable. Vous pouvez afficher deux valeurs distinctes pour true et falsey, mais veuillez indiquer ce que vous utilisez dans votre réponse. xest garanti d'avoir au moins deux chiffres distincts (par exemple, 111est une entrée non valide). Comme pour la plupart des défis, vous pouvez prendre xune chaîne ou une liste de chiffres.

C'est un donc le code le plus court en octets gagne.

Cas de test

          Input          Output
       41802000               1
            100               1
      123456788               0
      451111111               0
234543454545444               0
             12               1
       41902000               0
          92599               1
caird coinheringaahing
la source
le nombre peut-il être passé sous forme de chaîne? (surtout compte tenu du cas de test '234543454545444')
Uriel
@Uriel Vous pouvez prendre une entrée sous forme de chaîne
caird coinheringaahing
3
À titre de suggestion de clarification: j'utiliserais le terme "chiffre" plutôt que "nombre", car vous faites spécifiquement référence aux caractères décimaux, extraits de leurs valeurs numériques.
Jonathan Frech
list of digits- serait-ce une liste des caractères numériques ASCII, ou une liste d'entiers de 0 à 9
Decurous
1
@ Οurous Up to you
caird coinheringaahing

Réponses:

9

APL (Dyalog) , 36 octets

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

Essayez-le en ligne!

Comment?

Presque un poème.

⌽⍵ - inverser une fois l'entrée,

1,2=/ - obtenez la liste des différences.

⌊\ - ne garder que le premier groupe,

- et retournez-le pour terminer.


o←- attribuer à o,

~o - changer un et zéro (s),

⍵/⍨ - filtrer l'entrée avec,

⍎¨ - transformer le résultat en liste de chaque chiffre,

  • ⌈/- et obtenez le maximum. (c'est un)

⍵/⍨o- filtrer l'entrée avec ounalt (ered),

- et prenez la longueur, ce serait B.

÷ - obtenez un divisé par ce résultat,

* - et amène A à ce pouvoir.


⊢≡⌊ - entier?

Uriel
la source
8

05AB1E , 11 octets

γRćgUZXzm.ï

Essayez-le en ligne!

Explication

γRćgUZXzm.ï ~ Programme complet.

γ ~ Divisé en séries de chiffres.
 R ~ Inverse.
  ć ~ Poussez un [1:], un [0] dans la pile.
   g ~ Longueur (d'un [0]).
    U ~ Attribuez-le à la variable entière X.
     ZX ~ Obtenez le maximum, sans éclater, et appuyez sur X.
       zm ~ A 1 / B .
         .ï ~ Est-ce un entier?

Emigna a enregistré 1 octet.

S'appuie sur le fait que si A est un entier positif N élevé à la puissance de B , alors N = A 1 / B , donc il doit être un entier.

M. Xcoder
la source
UZXdevrait fonctionner au lieu des{θs
Emigna
Le programme de 9 octets échoue 41902000(devrait être faux).
Zgarb
@Zgarb Ouais, j'étais presque sûr que cela échouerait, alors je l'ai supprimé ... Aussi lol, nous avons obtenu exactement le même entier
M. Xcoder
Échoue pour418802000
Okx
8

Haskell , 85 75 72 71 octets

Edit : -10 octets en prenant une liste de chiffres au lieu d'une chaîne. Merci à WhatToDo d' avoir signalé que cela est autorisé. -3 octets grâce à la solution d' Ourous dans Clean . -1 octet grâce à user28667 .

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

Essayez-le en ligne! Prend la saisie sous forme de liste de chiffres. Exemple d'utilisation: f [4,1,8,0,2,0,0,0]rendements True.

Explication:

Étant donnée une entrée s=[4,1,8,0,2,0,0,0], nous avons reversela liste et de séparer les éléments principaux avec span(==last s): ([0,0,0],[2,0,8,1,4]). Le modèle correspondant aux (b,a)rendements b=[0,0,0]et a=[2,0,8,1,4].

La compréhension de la liste or[n^length b==maximum a|n<-[1..a]]vérifie si un entier ncompris entre 1et 9satisfait n^length b==maximum a, c'est-à-dire n^3=8.

Laikoni
la source
Vous avez posté le vôtre avant le mien, et le nôtre est similaire, alors: Essayez-le en ligne!
WhatToDo
@WhatToDo Merci, je n'ai pas vu que les listes de chiffres étaient autorisées en entrée.
Laikoni
Ne pouvez-vous pas simplement prendre le maximum. Pas besoin de les vérifier tous.
Tim
@Tim Je ne suis pas sûr de comprendre ce que tu veux dire. Prendre le maximum de la liste d'entrée entière pour obtenir aéchouerait dans des cas comme 477.
Laikoni
@Tim Je prends le maximum pour obtenir b, mais vérifie chaque entier nde 0à 9(anciennement de 0à a). C'est exactement la spécification pour autant que je vois.
Laikoni
5

Haskell , 104 89 octets

@Laikoni a trouvé une solution plus courte , mais c'est le mieux que je puisse faire. Merci @Laikoni de m'avoir fait savoir que nous pouvons également accepter des listes de chiffres en entrée.

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

Explication:

Essayez-le en ligne!

flawr
la source
Pourquoi utiliser any(==a)quand vous pourriez utiliser elem a?
Wheat Wizard
@WheatWizard Merci pour les suggestions concernant votre deuxième commentaire: est-ce que cela échouerait par exemple 2888?
flawr
Oui, il semble que j'ai mal lu la question. Je ne savais pas que les nombres de fin pouvaient être autre chose que zéro.
Wheat Wizard
mais head.maximumest toujours plus court que maximum.concatde 2 octets et conserve la fonctionnalité.
Wheat Wizard
4

R , 80 octets

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

Essayez-le en ligne!

Utilise utf8ToInt - 48pour diviser le nombre en chiffres. Cela lance un avertissement de la conversion en chaîne.

À l'aide de rle, obtenez le nombre de chiffres de fin et la valeur maximale des premiers chiffres. Renvoie vrai si l'une des valeurs comprises entre 0 et max à la puissance du nombre final est égale à la valeur max.

Je pense qu'il y a d'autres opportunités de golf, mais cela peut attendre jusqu'à demain.

MickyT
la source
2
J'ai supprimé ma réponse parce que je ne voyais pas que mon message combinait simplement votre réponse et @ NofP: function(x,R=rle(rev(utf8ToInt(x)-48)))!max(R$v[-1])^(1/R$l[‌​1])%%1(66 octets, en prenant xune chaîne)
plannapus
@plannapus Personnellement, je le restituerais. C'est un meilleur compte que les nôtres et pas vraiment une copie de l'un ou l'autre
MickyT
@plannapus Je suis d'accord avec MickyT!
NofP
@NofP et MickyT: OK alors, le voici
plannapus
4

Gelée , 11 octets

ŒgµṪL9*€fṀL

Prend la saisie sous forme de liste de chiffres.

Essayez-le en ligne!

Comment ça marche

Œ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
la source
Avant de regarder les réponses, et sans connaître Jelly du tout, j'ai deviné que la réponse Jelly serait de 12 octets. ;)
DLosc
4

R, 66 octets

Cette réponse est plus ou moins un mélange de réponses de MickyT et NofP , et sur leur demande, la voici:

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

Il prend x comme chaîne.

> 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
la source
3

JavaScript (ES7), 66 octets

Prend l'entrée sous la forme d'une chaîne ou d'un tableau de caractères. Renvoie un booléen.

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

Cas de test

Arnauld
la source
3

Clean , 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]]

Définit la fonction @en prenant une liste de chiffres entiers.

Essayez-le en ligne!

Οurous
la source
3

Python 2 , 95 78 octets

  • 17 octets enregistrés grâce à Rod .
def f(s,i=~0):
	while s[i]==s[~0]:i-=1
	return int(max(s[:-~i]))**(1./~i)%1==0

Essayez-le en ligne!

Jonathan Frech
la source
Vous n'avez pas besoin de trier, vous pouvez simplement obtenir le maximum, et puisque vous l'avez déjà, ivous pouvez supprimer les len 78 octets
Rod
@Rod Merci beaucoup.
Jonathan Frech
2

R , 93 octets

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}

Essayez-le en ligne!

Le code prend un entier en entrée et renvoie FAUX si le nombre est agréable, et VRAI sinon.

NofP
la source
2

Python 3 , 88 85 octets

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

Non 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
  • L'argument d'entrée devrait être une chaîne de chiffres
  • La sortie est soit Trueou False.
  • Similaire à encore développé indépendamment de la réponse de Halvard, mais utilise l'arithmétique à virgule flottante d'une manière qui ne souffre pas d'erreurs d'arrondi jusqu'à ce qu'elle a ** (1 / b)soit désactivée d'au moins 0,5 de b √a, ce qui nécessite une valeur supérieure à 2 53 (ou tout autre radix à virgule flottante et mantisse longueur que Python utilise, voir sys.float_info).
  • Peut être modifié trivialement pour fonctionner avec des bases de nombres arbitraires entre 2 et 36.
David Foerster
la source
@ovs: Avec une modification mineure, oui. La fonction devrait prendre la base comme argument supplémentaire et la passer aux invocations de intet range. (À un certain point, il deviendrait plus possible d'estimer la plage de recherche basée sur ont a^(1/b)que de calculer de grandes quantités de pouvoirs.)
David Foerster
2

C (gcc) , 144 126 117 octets

  • 18 octets enregistrés grâce à Dennis .
  • Enregistré neuf octets grâce au plafond .
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);}

Essayez-le en ligne!

Jonathan Frech
la source
1

Ruby , 64 octets

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

Entrée sous forme de chaîne, renvoie vrai si:

  • B == 1 (pas besoin de cocher A)
  • A == 4 et B == 2
  • A == 9 et B == 2
  • A == 8 et B == 3

Essayez-le en ligne!

GB
la source
1

Perl 6 , 55 octets

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

Essayez-le en ligne!

Après l'évaluation de l'expression rationnelle initiale - qui ne peut réussir que si l'entrée est un entier positif -$0 contient la partie initiale du nombre et $1contient les chiffres répétés de fin.

La combméthode sans arguments, appliquée à une chaîne, renvoie une liste des caractères qui, dans un contexte numérique, correspond à la longueur de la liste. $0.comb.maxEst donc le plus grand des chiffres du préfixe, et$1.comb la longueur du suffixe.

Nous vérifions ensuite si any(^10)(c'est-à-dire la jonction or des nombres de 0 à 9), lorsqu'il est élevé à la puissance de la longueur du suffixe, est égal au plus grand chiffre du préfixe. L' soévaluation booléenne des forces de la jonction résultante, qui, autrement, serait très bien en soi comme valeur véridique, mais le défi exige que seulement deux valeurs distinctes soient retournées.

Sean
la source
C'est en retard, mais comme l'entrée est garantie d'être un entier, l'expression régulière peut utiliser à la .place de \d.
DLosc
1

Kotlin , 106 octets

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

Sortie: vrai / faux

Essayez-le en ligne!

Damiano
la source
1

C # (.NET Core) , 132 octets

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

Essayez-le en ligne!

Remerciements

-12 octets grâce à @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
la source
Je sais que cela fait un moment, mais i=n.Length-2;for(;i>=0;i--)peut être joué au golf i=n.Length-1;for(;i-->0;)et &&peut être joué au golf &.
Kevin Cruijssen
Oh, et vous pouvez jouer au golf 6 octets de plus en supprimant using System;et en utilisant System.Math.Powdirectement.
Kevin Cruijssen
Une dernière chose. Vous prenez actuellement une liste de caractères, mais il est également autorisé de prendre une liste de chiffres. Dans ce cas, le -48peut être joué sur -3 octets.
Kevin Cruijssen
1

Japt , 26 18 octets

ó¶
o l
ñ o n qV v1

Essayez-le en ligne!


Prend l'entrée sous forme de chaîne, renvoie 1pour les nombres agréables, 0sinon.

Brève explication:

ó¶

Prenez la première entrée et divisez-la par des valeurs où (x,y) => x===yc'est vrai. Par exemple '41802000'pour ['4','1','8','0','2','000'].

o l

Prenez le tableau de la première étape, retirez le dernier élément et obtenir sa longueur, ce qui donne B .

ñ o n qV v1

Trouvez le plus grand élément du tableau restant, ce qui donne A , portez-le à la puissance 1/B, puis revenez si le résultat est divisible par un.


Première collaboration avec Japt, très ouvert à toutes recommandations.
Rasé de 8 octets grâce à ETHproductions .

Lente
la source
Hé, bienvenue à Japt! Désolé d'avoir raté vos réponses au début. Quelques conseils: 1) Vous pouvez utiliser une fonction automatique pour transformer la première ligne en juste ó¶. 2) Je ne sais pas pourquoi vous avez le vdans la deuxième ligne, car il convertit simplement la chaîne en minuscules et n'a aucun effet sur la longueur ;-) 3) Vous pouvez éviter le !(Usur la dernière ligne en changeant %1en v1, qui retourne 1si le sujet est divisible par 1 ou 0autrement.
ETHproductions
@ETHproductions Merci beaucoup pour vos commentaires, appréciez-le vraiment. J'ai lu sur les fonctions automatiques avant, mais je n'ai pas encore tout à fait compris, merci pour l'exemple. J'ai également intégré le reste de vos modifications, ce qui représente un total de 8 octets perdus.
Nit
0

Clojure, 168 octets

(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)))

Essayez-le en ligne!

Attilio
la source
0

Fusain , 33 octets

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

Essayez-le en ligne! Le lien est vers la version détaillée du code. Sorties a -pour des nombres agréables. Explication:

≔ESιθ

Divisez l'entrée qen caractères.

⊞υ⊟θ

Supprimez le dernier caractère de qet poussez-le vers u(prédéfini dans une liste vide).

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

Pop et push à plusieurs reprises tandis que le dernier caractère de qest le premier caractère de u.

¬﹪XI⌈θ∕¹Lυ¹

Prenez le chiffre maximum de qet augmentez-le à la puissance de l'inverse de la longueur de u, puis vérifiez si le résultat est un entier.

Neil
la source
0

Python 2 , 91 85 octets

s=`input()`;d=0
p=s.rstrip(s[-1])
exec"`d**(len(s)-len(p))`==max(p)>exit(1);d+=1;"*10

Essayez-le en ligne!

ovs
la source
0

Java 8, 125 octets

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

Port de la réponse C # .NET de @ Ayb4btu .

Essayez-le en ligne.

Explication:

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
la source