Ist es eine erfreuliche Zahl?

22

Eine erfreuliche Zahl (gemäß dieser Definition) ist eine Zahl, die durch den folgenden Prozess geleitet werden kann ( 41802000als Beispiel):

  • Trennen Sie die folgenden identischen Zahlen ( 41802000 => [41802, 000])
  • Sortieren Sie die erste Hälfte der Ziffern und nehmen Sie das Maximum ( [41802, 000] => [8, 000])
  • Nimm die Länge des letzten Elements. Nenne die resultierenden Elemente A und B ( [8, 000] => A=8, B=3)
  • Ist N B = A für eine ganze Zahl N? ( Truein diesem Beispiel: 2 3 = 8)

Wenn die Eingabe Trueaus dem folgenden Prozess resultiert , wird sie als angenehm angesehen.

Ihre Aufgabe ist es, eine ganze Zahl zu nehmen xund auszugeben, ob xes sich um eine erfreuliche Zahl handelt. Sie können zwei unterschiedliche Werte für truthy und falsey ausgeben, geben Sie jedoch bitte an, was Sie in Ihrer Antwort verwenden. xmuss garantiert mindestens zwei verschiedene Ziffern haben (z. B. 111ist eine ungültige Eingabe). Wie bei den meisten Herausforderungen können Sie xeine Zeichenfolge oder eine Ziffernliste verwenden.

Dies ist ein so dass der kürzeste Code in Bytes gewinnt.

Testfälle

          Input          Output
       41802000               1
            100               1
      123456788               0
      451111111               0
234543454545444               0
             12               1
       41902000               0
          92599               1
Caird Coinheringaahing
quelle
Kann die Nummer als String übergeben werden? (Vor allem angesichts des Testfalls "234543454545444")
Uriel
@Uriel Sie können Eingaben als String
Caird Coinheringaahing
3
Zur Verdeutlichung: Ich würde den Begriff "Ziffer" anstelle von "Zahl" verwenden, da Sie sich speziell auf die Dezimalstellen beziehen, die von ihren Zahlenwerten abstrahiert sind.
Jonathan Frech
list of digits-
Wäre
1
@ Οurous Bis zu dir
Caird Coinheringaahing

Antworten:

9

APL (Dyalog) , 36 Bytes

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

Probieren Sie es online!

Wie?

Fast ein Gedicht.

⌽⍵ - die Eingabe einmal umkehren,

1,2=/ - Holen Sie sich die Liste der Unterschiede.

⌊\ - nur die erste Gruppe behalten,

- und drehen Sie es um, um abzuschließen.


o←- zuweisen o,

~o - Einsen und Nullen tauschen,

⍵/⍨ - filtere die Eingabe damit,

⍎¨ - das Ergebnis in eine Liste jeder Ziffer umwandeln,

  • ⌈/- und das Maximum bekommen. (das ist ein)

⍵/⍨o- die Eingabe mit ounalt (ered) filtern ,

- und nimm die Länge, das wäre B.

÷ - lassen Sie sich durch dieses Ergebnis dividieren,

* - und nimm A zu dieser Kraft, dich.


⊢≡⌊ - ganze Zahl?

Uriel
quelle
8

05AB1E , 11 Bytes

γRćgUZXzm.ï

Probieren Sie es online!

Erläuterung

γRćgUZXzm.ï ~ Volles Programm.

γ ~ In Ziffernfolgen aufteilen.
 R ~ Rückwärts.
  Drücken Sie a [1:], a [0] auf den Stapel.
   g ~ Länge (von a [0]).
    U ~ Weisen Sie dies der ganzzahligen Variablen X zu.
     ZX ~ Holen Sie das Maximum, ohne zu knallen, und drücken Sie X.
       zm ~ A 1 / B .
         . ~ Ist es eine ganze Zahl?

Emigna hat 1 Byte gespeichert.

Beruht auf der Tatsache, dass wenn A eine positive ganze Zahl N ist , die hoch B ist , dann ist N = A 1 / B , daher muss es eine ganze Zahl sein.

Mr. Xcoder
quelle
UZXsollte funktionieren anstatts{θs
Emigna
Das 9-Byte-Programm schlägt fehl 41902000(sollte falsch sein).
Zgarb
@Zgarb Ja , ich war fast sicher , es wäre nicht, so dass ich es entfernt ... Auch lol haben wir genau die gleiche ganze Zahl
Herr Xcoder
Scheitert an418802000
Okx
8

Haskell , 85 75 72 71 Bytes

Bearbeiten : -10 Bytes, indem eine Liste von Ziffern anstelle einer Zeichenfolge verwendet wird. Vielen Dank an WhatToDo für den Hinweis, dass dies zulässig ist. -3 Bytes dank Ourous 'Lösung in Clean . -1 Byte dank user28667 .

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

Probieren Sie es online! Übernimmt die Eingabe als Ziffernliste. Anwendungsbeispiel: f [4,1,8,0,2,0,0,0]Erträge True.

Erläuterung:

Gegeben einen Eingang s=[4,1,8,0,2,0,0,0]wir reversedie Liste und trennen die führenden Elemente mit span(==last s): ([0,0,0],[2,0,8,1,4]). Die Musterübereinstimmung auf (b,a)Erträge b=[0,0,0]und a=[2,0,8,1,4].

Das Listenverständnis or[n^length b==maximum a|n<-[1..a]]prüft, ob eine ganze Zahl nim Bereich von 1bis 9erfüllt n^length b==maximum aist n^3=8.

Laikoni
quelle
Du hast deine gepostet, bevor ich meine gepostet habe, und unsere sind ähnlich, also: Probiere es online aus!
WhatToDo
@WhatToDo Danke, ich habe nicht gesehen, dass Ziffernlisten als Eingabe zulässig waren.
Laikoni
Kannst du nicht einfach das Maximum nehmen? Sie müssen nicht alle überprüfen.
Tim
@ Tim Ich bin nicht sicher, ob ich verstehe, was du meinst. Das Maximum der gesamten Eingabeliste zu nehmen, um zu erhalten, awürde in Fällen wie fehlschlagen 477.
Laikoni
@Tim Ich nehme das Maximum, um zu bekommen b, aber überprüfe jede ganze Zahl nvon 0bis 9(früher von 0bis a). Soweit ich sehe, ist das genau die Spezifikation.
Laikoni
5

Haskell , 104 89 Bytes

@Laikoni hat eine kürzere Lösung gefunden , aber das ist das Beste, was ich tun kann. Vielen Dank an @Laikoni für die Mitteilung, dass wir auch Ziffernlisten als Eingabe akzeptieren können.

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

Erläuterung:

Probieren Sie es online!

fehlerhaft
quelle
Warum verwenden, any(==a)wenn Sie verwenden könnten elem a?
Wheat Wizard
@WheatWizard Danke für die Anregungen, bezüglich deines zweiten Kommentars: Wäre das nicht zB fehlgeschlagen 2888?
Fehler
Ja, anscheinend habe ich die Frage falsch verstanden. Mir war nicht klar, dass die nachfolgenden Zahlen alles andere als Null sein könnten.
Wheat Wizard
ist aber head.maximumimmer noch kürzer als maximum.concat2 Bytes und behält die Funktionalität bei.
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)

Probieren Sie es online!

Dient utf8ToInt - 48zum Teilen der Nummer in Ziffern. Dadurch wird eine Warnung von der Konvertierung in eine Zeichenfolge ausgegeben.

Mit rle erhalten Sie die Anzahl der nachfolgenden Ziffern und den Maximalwert der ersten Ziffern. Geben Sie true zurück, wenn einer der Werte zwischen 0 und max der Potenz des nachgestellten Zählers dem Maximalwert entspricht.

Ich denke, es gibt weitere Möglichkeiten zum Golfen, aber das kann bis morgen warten.

MickyT
quelle
2
Ich habe meine Antwort gelöscht, weil ich nicht gesehen habe, dass mein Beitrag nur Ihre Antwort und @NofPs kombiniert: function(x,R=rle(rev(utf8ToInt(x)-48)))!max(R$v[-1])^(1/R$l[‌​1])%%1(66 Bytes, xals Zeichenfolge)
Plannapus
Persönlich würde ich es wiederherstellen. Es ist eine bessere Zählung als beide von uns und nicht wirklich eine Kopie entweder
MickyT
@plannapus Ich stimme MickyT zu!
NofP
@NofP und MickyT: Okay, hier ist es
Plannapus
4

Jelly , 11 Bytes

ŒgµṪL9*€fṀL

Übernimmt die Eingabe als Ziffernliste.

Probieren Sie es online!

Wie es funktioniert

Œ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
quelle
Bevor ich mir die Antworten ansah und Jelly überhaupt nicht kannte, vermutete ich, dass die Jelly-Antwort 12 Bytes umfassen würde. ;)
DLosc
4

R, 66 Bytes

Diese Antwort ist mehr oder weniger eine Mischung aus den Antworten von MickyT und NofP , und auf ihre Anfrage hin ist es hier:

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

Es dauert X als Zeichenfolge.

> 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
quelle
3

JavaScript (ES7), 66 Byte

Nimmt Eingaben entweder als Zeichenfolge oder als Array von Zeichen entgegen. Gibt einen Booleschen Wert zurück.

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

Testfälle

Arnauld
quelle
3

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

Definiert die Funktion @, wobei eine Liste mit ganzzahligen Ziffern erstellt wird.

Probieren Sie es online!

Οurous
quelle
3

Python 2 , 95 bis 78 Bytes

  • Dank Rod siebzehn Bytes gespart .
def f(s,i=~0):
	while s[i]==s[~0]:i-=1
	return int(max(s[:-~i]))**(1./~i)%1==0

Probieren Sie es online!

Jonathan Frech
quelle
Sie brauchen nicht zu sortieren, Sie können nur das Maximum erreichen, und da Sie es bereits haben i, können Sie die len 78 Bytes fallen lassen
Rod
@ Rod Vielen Dank.
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}

Probieren Sie es online!

Der Code nimmt eine Ganzzahl als Eingabe und gibt FALSE zurück, wenn die Zahl gefällt, und ansonsten TRUE.

NofP
quelle
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
  • Es wird erwartet, dass das Eingabeargument eine Ziffernfolge ist
  • Die Ausgabe ist entweder Trueoder False.
  • Ähnlich wie bisher unabhängig von Halvards Antwort entwickelt , verwendet jedoch Gleitkomma-Arithmetik auf eine Weise, die erst durch Rundungsfehler beeinträchtigt wirda ** (1 / b) sie um mindestens 0,5 von b √a abweicht, was einen Wert über 2 53 erfordert (oder was auch immer Gleitkomma-Radix und Mantisse sein mögen) Länge, die Python gerade benutzt, siehe sys.float_info).
  • Kann einfach modifiziert werden, um immer noch mit beliebigen Zahlenbasen zwischen 2 und 36 zu arbeiten.
David Foerster
quelle
@ovs: Mit einer geringfügigen Änderung, ja. Die Funktion müsste die Basis als zusätzliches Argument verwenden und an die Aufrufe von intund übergeben range. (Irgendwann wäre es praktikabler, den Suchbereich anhand von zu schätzen, a^(1/b)als große Potenzen zu berechnen.)
David Foerster,
1

Ruby , 64 Bytes

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

Eingabe als Zeichenfolge, gibt true zurück, wenn:

  • B == 1 (A muss nicht angekreuzt werden)
  • A == 4 und B == 2
  • A == 9 und B == 2
  • A = 8 und B = 3

Probieren Sie es online!

GB
quelle
1

Perl 6 , 55 Bytes

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

Probieren Sie es online!

Nach der Auswertung der ersten Regex - was nur gelingen kann, wenn die Eingabe eine positive Ganzzahl ist - $0enthält der erste Teil der Zahl und$1 die nachfolgenden wiederholten Ziffern.

Die combauf eine Zeichenfolge angewendete Methode ohne Argumente gibt eine Liste der Zeichen zurück, die im numerischen Kontext auf die Länge der Liste ausgewertet wird. Ist $0.comb.maxalso die größte der Ziffern im Präfix und$1.comb die Länge des Suffix.

Wir prüfen dann, ob any(^10)(dh die Oder-Verknüpfung der Zahlen von 0 bis 9), wenn sie zur Potenz der Länge des Suffixes angehoben wird, gleich der größten Ziffer im Präfix ist. Die soForces-Boolesche Bewertung der resultierenden Junction, die ansonsten für sich genommen als wahrer Wert in Ordnung wäre, erfordert jedoch, dass nur zwei unterschiedliche Werte zurückgegeben werden.

Sean
quelle
Dies ist spät, aber da die Eingabe garantiert eine Ganzzahl ist, kann der Regex .anstelle von verwenden \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

Ausgabe: wahr / falsch

Probieren Sie es online!

Damiano
quelle
1

C # (.NET Core) , 132 Byte

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

Probieren Sie es online!

Danksagung

-12 Bytes dank @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
quelle
Ich weiß, dass es eine Weile her ist, aber man i=n.Length-2;for(;i>=0;i--)kann Golf spielen i=n.Length-1;for(;i-->0;)und man &&kann Golf spielen &.
Kevin Cruijssen
Oh, und Sie können 6 weitere Bytes Golf spielen, indem Sie das entfernen using System;und System.Math.Powdirekt verwenden.
Kevin Cruijssen
Eine letzte Sache. Sie können derzeit eine Liste mit Zeichen erstellen, es ist jedoch auch zulässig, eine Liste mit Ziffern zu erstellen. In diesem Fall -48kann für -3 Bytes Golf gespielt werden.
Kevin Cruijssen
1

Japt , 26 18 Bytes

ó¶
o l
ñ o n qV v1

Probieren Sie es online!


Nimmt die Eingabe als String, gibt ansonsten 1für ansprechende Zahlen zurück 0.

Kurze Erklärung:

ó¶

Nehmen Sie die erste Eingabe und teilen Sie sie nach Werten auf, wo (x,y) => x===ywahr ist. Zum Beispiel '41802000'zu ['4','1','8','0','2','000'].

o l

Nehmen Sie das Array aus dem ersten Schritt, entfernen Sie das letzte Element und erhalten Sie seine Länge, was B ergibt .

ñ o n qV v1

Suchen Sie das größte Element im verbleibenden Array und geben Sie A an , stellen Sie es auf die Potenz 1/Bund geben Sie dann zurück, wenn das Ergebnis durch eins teilbar ist.


Das erste Mal mit Japt arbeiten, sehr offen für alle Empfehlungen.
8 Bytes gespart dank ETHproductions .

Nit
quelle
Hey, willkommen bei Japt! Entschuldigung, ich habe zuerst deine Antworten verpasst. Ein paar Tipps: 1) Sie können eine Auto-Funktion verwenden , um die erste Zeile in nur zu verwandeln ó¶. 2) Nicht sicher , warum haben Sie die vin der zweiten Zeile, wie es nur die Zeichenfolge konvertiert in Kleinbuchstaben und hat keine Auswirkung auf die Länge ;-) 3) Sie können das vermeiden , !(Uin der letzten Zeile durch Änderung %1zu v1, die zurückkehrt , 1wenn das Thema ist teilbar durch 1 oder 0anders
ETHproductions
@ETHproductions Vielen Dank für Ihr Feedback, schätzen Sie es wirklich. Ich habe bereits über Auto-Funktionen gelesen, aber ich habe immer noch nicht verstanden, danke für das Beispiel. Ich habe auch den Rest Ihrer Änderungen übernommen und insgesamt 8 Bytes verloren.
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)))

Probieren Sie es online!

Attilio
quelle
0

Holzkohle , 33 Bytes

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

Probieren Sie es online! Link ist eine ausführliche Version des Codes. Gibt ein -für angenehme Zahlen aus. Erläuterung:

≔ESιθ

Teilen Sie die Eingabe qin Zeichen auf.

⊞υ⊟θ

Entfernen Sie das letzte Zeichen aus qund verschieben Sie es auf u(vordefiniert in eine leere Liste).

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

Pop und Push wiederholt, während das letzte Zeichen qdas erste Zeichen von istu .

¬﹪XI⌈θ∕¹Lυ¹

Nehmen Sie die maximale Ziffer von qund erhöhen Sie sie auf den Kehrwert der Länge von u. Prüfen Sie dann, ob das Ergebnis eine ganze Zahl ist.

Neil
quelle
0

Python 2 , 91 85 Bytes

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

Probieren Sie es online!

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

Port von @ Ayb4btus C # .NET-Antwort .

Probieren Sie es online aus.

Erläuterung:

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
quelle
0

Pyth, 29 Bytes

JezWqezJ=Pz=hZ)[email protected]

Testsuite

Python 3 Übersetzung:
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
quelle