Czy to przyjemny numer?


22

Przyjemna liczba (zgodnie z tą definicją) to liczba, którą można przekazać w następującym procesie (wykorzystajmy 41802000jako przykład):

  • Oddziel końcowe liczby identyczne ( 41802000 => [41802, 000])
  • Sortuj pierwszą połowę cyfr i weź maksimum ( [41802, 000] => [8, 000])
  • Weź długość ostatniego elementu. Wywołaj wynikowe elementy A i B ( [8, 000] => A=8, B=3)
  • Czy N B = A dla dowolnej liczby całkowitej N? ( Truew tym przykładzie; 2 3 = 8)

Jeśli dane wejściowe wynikają Truez następującego procesu, uznaje się je za przyjemne.

Twoim zadaniem jest pobranie liczby całkowitej xi wyprowadzenie, czy xjest to przyjemna liczba. Możesz podać dowolne dwie odrębne wartości dla „prawda” i „falsey”, ale w odpowiedzi podaj proszę, czego używasz. xgwarantuje, że będzie mieć co najmniej dwie wyraźne cyfry (np. 111jest nieprawidłowym wprowadzeniem). Podobnie jak w przypadku większości wyzwań, możesz wziąć xjako ciąg znaków lub listę cyfr.

To jest więc wygrywa najkrótszy kod w bajtach .

Przypadki testowe

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

czy liczba może być przekazana jako ciąg? (zwłaszcza biorąc pod uwagę przypadek testowy „234543454545444”)
Uriel,

@Uriel Możesz wziąć dane wejściowe jako ciąg
caird coinheringaahing

3
Jako sugestię wyjaśnienia: użyłbym terminu „cyfra” zamiast „liczba”, ponieważ odnosi się to w szczególności do znaków dziesiętnych, oderwanych od ich wartości liczbowych.
Jonathan Frech,

list of digits- czy byłaby to lista znaków numerycznych ASCII, czy lista liczb całkowitych od 0 do 9
Οurous

1
@ Οurous Up to you
caird coinheringaahing

Odpowiedzi:


9

APL (Dyalog) , 36 bajtów

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

Wypróbuj online!

W jaki sposób?

Prawie wiersz.

⌽⍵ - raz odwróć wejście,

1,2=/ - pobierz listę różnic.

⌊\ - zachowaj tylko pierwszą grupę,

- i odwróć, aby zakończyć.


o←- przypisać do o,

~o - przełączaj jedynki i zero (y),

⍵/⍨ - filtruj za pomocą niego dane wejściowe,

⍎¨ - zamień wynik na listę każdej cyfry,

  • ⌈/- i zdobądź maksimum. (to jest)

⍵/⍨o- filtruj wejście za pomocą ounalt (ered),

- i weźmy długość, to będzie B.

÷ - podziel się przez ten wynik,

* - i weź A do tej mocy ciebie.


⊢≡⌊ - liczba całkowita?


8

05AB1E , 11 bajtów

γRćgUZXzm.ï

Wypróbuj online!

Wyjaśnienie

γRćgUZXzm.ï ~ Pełny program.

γ ~ Podziel na ciągi cyfr.
 R ~ Odwróć.
  ć ~ Wciśnij [1:], a [0] na stos.
   g ~ Długość (z [0]).
    U ~ Przypisz to do zmiennej całkowitej X.
     ZX ~ Uzyskaj maksimum, bez wyskakiwania, i wciśnij X.
       zm ~ A 1 / B .
         .ï ~ Czy to liczba całkowita?

Emigna zapisała 1 bajt.

Opiera się na fakcie, że jeśli A jest dodatnią liczbą całkowitą N podniesioną do potęgi B , to N = A 1 / B , stąd musi być liczbą całkowitą.


UZXpowinien działać zamiasts{θs
Emigna,

9-bajtowy program kończy się niepowodzeniem 41902000(powinien to być fałsz).
Zgarb,

@Zgarb Tak, byłem prawie pewien, że to się nie powiedzie, więc usunąłem go ... Również lol mamy dokładnie taką samą liczbę całkowitą
Pan Xcoder,

Nie 418802000
działa

8

Haskell , 85 75 72 71 bajtów

Edytuj : -10 bajtów, biorąc listę cyfr zamiast ciągu. Dzięki WhatToDo za wskazanie, że jest to dozwolone. -3 bajty dzięki rozwiązaniu Ourous w Clean . -1 bajt dzięki użytkownikowi 28667 .

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

Wypróbuj online! Pobiera dane wejściowe jako listę cyfr. Przykładowe użycie: f [4,1,8,0,2,0,0,0]daje True.

Wyjaśnienie:

Biorąc pod uwagę wejście s=[4,1,8,0,2,0,0,0], to reverselista i oddzielić elementy prowadzące z span(==last s): ([0,0,0],[2,0,8,1,4]). Dopasowywanie wzorca dla (b,a)zbiorów b=[0,0,0]i a=[2,0,8,1,4].

Zrozumienie listy or[n^length b==maximum a|n<-[1..a]]sprawdza, czy jakakolwiek liczba całkowita nz zakresu od 1do 9spełnia n^length b==maximum a, to znaczy n^3=8.


Opublikowałeś swój zanim zrobiłem mój, a nasze są podobne, więc: Wypróbuj online!
WhatToDo,

@WhatToDo Dzięki, nie widziałem, aby listy cyfr były dozwolone jako dane wejściowe.
Laikoni,

Nie możesz po prostu wziąć maksimum. Nie musisz ich wszystkich sprawdzać.
Tim

@ Tim Nie jestem pewien, czy rozumiem, co masz na myśli. Pobranie maksimum całej listy danych wejściowych anie powiodło się w takich przypadkach 477.
Laikoni,

@Tim Biorę maksimum, aby uzyskać b, ale sprawdź każdą liczbę całkowitą nod 0do 9(poprzednio od 0do a). To dokładnie taka specyfikacja, o ile mi wiadomo.
Laikoni,

5

Haskell , 104 89 bajtów

@Laikoni znalazł krótsze rozwiązanie , ale to najlepsze, co mogłem zrobić. Dzięki @Laikoni za poinformowanie mnie, że możemy również akceptować listy cyfr jako dane wejściowe.

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

Wyjaśnienie:

Wypróbuj online!


any(==a)Po co korzystać, kiedy można korzystać elem a?
Kreator pszenicy,

@WheatWizard Dziękuję za sugestie dotyczące twojego drugiego komentarza: Czy to nie zawiódłoby np. 2888?
flawr

Tak, wydaje się, że źle odczytałem pytanie. Nie zdawałem sobie sprawy, że końcowe liczby mogą być inne niż zero.
Kreator pszenicy,

ale head.maximumnadal jest krótszy niż maximum.concato 2 bajty i zachowuje funkcjonalność.
Kreator pszenicy,

4

R , 80 bajtów

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

Wypróbuj online!

Używa utf8ToInt - 48do dzielenia liczby na cyfry. To powoduje ostrzeżenie z konwersji na ciąg.

Używając rle, uzyskaj liczbę końcowych cyfr i maksymalną wartość pierwszych cyfr. Zwraca wartość true, jeśli dowolny z zakresu od 0 do wartości maksymalnej do potęgi liczenia jest równy wartości maksymalnej.

Myślę, że są dalsze możliwości gry w golfa, ale to może poczekać do jutra.


2
Usunąłem swoją odpowiedź, ponieważ nie widziałem, że mój post po prostu łączy twoją odpowiedź i @ NofP: function(x,R=rle(rev(utf8ToInt(x)-48)))!max(R$v[-1])^(1/R$l[‌​1])%%1(66 bajtów, xjako ciąg znaków)
plannapus

@plannapus Osobiście cofnęłbym to. Jest to lepszy wynik niż nasz i nie jest tak naprawdę kopią jednego z nich
MickyT,

@plannapus Zgadzam się z MickyT!
NofP

@NofP i MickyT: OK, więc
proszę

4

Galaretka , 11 bajtów

ŒgµṪL9*€fṀL

Pobiera dane wejściowe jako listę cyfr.

Wypróbuj online!

Jak to działa

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

Zanim spojrzałem na odpowiedzi i zupełnie nie znając Galaretki, domyśliłem się, że odpowiedź Galaretki będzie miała 12 bajtów. ;)
DLosc

4

R, 66 bajtów

Ta odpowiedź jest mniej więcej mieszanką odpowiedzi MickyT i NofP , a na ich prośbę oto:

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

Trwa x jako ciąg.

> 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 bajtów

Pobiera dane wejściowe jako ciąg znaków lub tablicę znaków. Zwraca wartość logiczną.

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

Przypadki testowe


3

Czysty , 130 128 118 93 bajtów

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

Definiuje funkcję @, biorąc listę liczb całkowitych.

Wypróbuj online!



2

R , 93 bajty

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}

Wypróbuj online!

Kod przyjmuje na wejściu liczbę całkowitą i zwraca FALSE, jeśli liczba jest przyjemna, a PRAWDA w przeciwnym razie.


2

Python 3 , 88 85 bajtów

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

Nie golfowany:

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
  • Argument wejściowy powinien być łańcuchem cyfrowym
  • Wyjście jest albo Truealbo False.
  • Podobne do opracowanego dotychczas niezależnie od odpowiedzi Halvarda, ale wykorzystuje arytmetykę zmiennoprzecinkową w sposób, który nie cierpi z powodu błędów zaokrąglania, dopóki nie a ** (1 / b)zostanie wyłączony o co najmniej 0,5 z b √a, co wymaga wartości powyżej 2 53 (lub jakiejkolwiek zmiennoprzecinkowej zmiennoprzecinkowej i mantysy długość Python używa, zobacz sys.float_info).
  • Może być modyfikowany w sposób trywialny, aby nadal działał z dowolnymi bazami liczbowymi od 2 do 36.

@ovs: Z niewielką modyfikacją, tak. Funkcja musiałaby wziąć bazę jako dodatkowy argument i przekazać ją do wywołań inti range. (W pewnym momencie bardziej prawdopodobne byłoby oszacowanie zasięgu wyszukiwania na podstawie ont a^(1/b)niż obliczenie dużych ilości mocy.)
David Foerster,


1

Rubinowy , 64 bajty

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

Wprowadź jako ciąg, zwraca wartość true, jeśli:

  • B == 1 (nie trzeba sprawdzać A)
  • A == 4 i B == 2
  • A == 9 i B == 2
  • A == 8 i B == 3

Wypróbuj online!


1

Perl 6 , 55 bajtów

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

Wypróbuj online!

Po ocenie początkowego wyrażenia regularnego - które może się powieść tylko wtedy, gdy wartość wejściowa jest dodatnią liczbą całkowitą - $0zawiera początkową część liczby i $1końcowe powtarzające się cyfry.

combMetoda bez argumentów, stosowane do łańcucha, zwraca listę postaci, które w numerycznych analizuje schemat kontekście do długości listy. Tak więc $0.comb.maxjest największą cyfrą w prefiksie i $1.combjest długością sufiksu.

Następnie sprawdzamy, czy any(^10)(tj. Połączenie liczb od 0-9), gdy podniesione do potęgi długości sufiksu, jest równe największej cyfrze w prefiksie. Te sosiły logiczna oceny uzyskanej skrzyżowania, które w przeciwnym razie byłoby dobrze na własną rękę jako wartość truthy, ale rozmowy wyzwaniem dla zaledwie dwóch odmiennych wartości zostać zwrócone.


Jest późno, ale ponieważ wejście jest gwarantowane jako liczba całkowita, regex może użyć .zamiast \d.
DLosc



1

C # (.NET Core) , 132 bajty

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

Wypróbuj online!

Podziękowanie

-12 bajtów dzięki @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;
}

Wiem, że minęło trochę czasu, ale i=n.Length-2;for(;i>=0;i--)można grać w golfa i=n.Length-1;for(;i-->0;)i &&grać w golfa &.
Kevin Cruijssen

Aha, i możesz zagrać w golfa o 6 bajtów więcej, usuwając using System;i używając System.Math.Powbezpośrednio.
Kevin Cruijssen

Ostatnia rzecz. Obecnie bierzesz listę znaków, ale możesz także wziąć listę cyfr. W takim przypadku -48można zagrać w golfa na -3 bajty.
Kevin Cruijssen

1

Japt , 26 18 bajtów

ó¶
o l
ñ o n qV v1

Wypróbuj online!


Pobiera dane wejściowe jako ciąg znaków, 1w 0przeciwnym razie zwraca miłe liczby .

Krótkie wyjaśnienie:

ó¶

Weź pierwsze dane wejściowe i podziel je na wartości, gdzie (x,y) => x===yjest to prawda. Na przykład '41802000'do ['4','1','8','0','2','000'].

o l

Wziąć tablicę z pierwszego etapu, usunąć ostatni element i uzyskać jego długość, otrzymując B .

ñ o n qV v1

Znajdź największy element w pozostałej tablicy, uzyskując A , weź go do potęgi, 1/Ba następnie wróć, jeśli wynik jest podzielny przez jeden.


Pierwsza praca z Japt, bardzo otwarta na wszelkie rekomendacje. Ogolono
8 bajtów dzięki produktom ETH .


Cześć, witaj w Japt! Przepraszam, że na początku brakowało mi odpowiedzi. Kilka wskazówek: 1) Możesz użyć funkcji automatycznej, aby zmienić pierwszą linię w just ó¶. 2) Nie wiem, dlaczego masz vw drugim wierszu, ponieważ po prostu konwertuje ciąg na małe litery i nie ma wpływu na długość ;-) 3) Możesz uniknąć znaku !(Uw ostatnim wierszu, zmieniając %1na v1, który zwraca, 1jeśli temat jest podzielny przez 1 lub w 0inny sposób.
ETHprodukcje

@ETHproductions Bardzo dziękuję za opinie, naprawdę to doceniam. Czytałem wcześniej o funkcjach automatycznych, ale wciąż nie rozumiem tego, dzięki za przykład. Uwzględniłem resztę twoich zmian, dodając w sumie 8 utraconych bajtów.
Nit

0

Clojure, 168 bajtów

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

Wypróbuj online!


0

Węgiel drzewny , 33 bajty

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

Wypróbuj online! Link jest do pełnej wersji kodu. Wykazuje a -dla przyjemnych liczb. Wyjaśnienie:

≔ESιθ

Podziel dane wejściowe qna znaki.

⊞υ⊟θ

Usuń ostatni znak z qi popchnij go do u(predefiniowany do pustej listy).

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

Kilkakrotnie pop i push, podczas gdy ostatnia postać qjest pierwszą postacią z u.

¬﹪XI⌈θ∕¹Lυ¹

Weź maksymalną cyfrę q i podnieś ją do potęgi odwrotności długości u, a następnie sprawdź, czy wynikiem jest liczba całkowita.




0

Java 8, 125 bajtów

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 odpowiedzi C # .NET na @ Ayb4btu .

Wypróbuj online.

Wyjaśnienie:

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 bajtów

JezWqezJ=Pz=hZ)K@sh.MsZzZqKsK

Zestaw testowy

Tłumaczenie 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))
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.