Hoş bir numara mı?


22

Hoş bir sayı (bu tanıma göre), aşağıdaki işlemden geçirilebilecek bir sayıdır ( 41802000örnek olarak kullanalım ):

  • Sondaki aynı numaraları ( 41802000 => [41802, 000]) ayır
  • Rakamların ilk yarısını sıralayın ve maksimuma ( [41802, 000] => [8, 000]) gidin
  • Son elemanın uzunluğunu alın. Sonuçta ortaya çıkan öğeleri A ve B ( [8, 000] => A=8, B=3) olarak adlandır
  • N B = herhangi bir tamsayı için A Nmı? ( Truebu örnekte; 2 3 = 8)

Girdi Trueaşağıdaki işlemden kaynaklanırsa, hoş kabul edilir.

Senin görevin bir tamsayı almak xve xhoş bir sayı olup olmadığını çıktısını almaktır . Hakikat ve falsey için iki farklı değer verebilirsiniz, ancak lütfen cevabınızda ne kullandığınızı belirtin. xen az iki farklı haneye sahip olması garanti edilir (örn 111. geçersiz bir giriş). Çoğu zorlukta xolduğu gibi, bir string veya rakamların bir listesi olarak kabul edebilirsiniz.

Bu bir golfüdür ve bayt cinsinden en kısa kod kazanır.

Test durumları

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

Sayı bir dize olarak geçirilebilir mi? (özellikle '234543454545444' test vakası verilmiştir)
Uriel

@Uriel Bir dizgi olarak girebilirsiniz
caird coinheringaahing

3
Açıklama için bir öneri olarak: "Rakam" yerine "rakam" terimini, özellikle sayı değerlerinden soyutlanmış ondalık karakterlere atıfta bulunacağınız için kullanırım.
Jonathan Frech

list of digits- Bu ASCII rakamı karakterlerin bir listesini ya da 0-9 den sayının bir liste olurdu
Οurous

1
@ Οurous Size kalmış
caird coinheringaahing

Yanıtlar:


9

APL (Dyalog) , 36 bayt

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

Çevrimiçi deneyin!

Nasıl?

Neredeyse bir şiir.

⌽⍵ - girişi bir kez tersine çevirmek,

1,2=/ - farklılıklar listesini al.

⌊\ - sadece ilk grup olanları tut

- ve tamamlamak için ters çevirin.


o←- atama o,

~o - değiştir ve sıfır (lar),

⍵/⍨ - girişi filtre uygulayın,

⍎¨ - sonucu, her hanenin listesine dönüştürmek,

  • ⌈/- ve maksimumda olsun. (O bir)

⍵/⍨o- girişi ounalt (ered) ile filtrelemek,

- ve uzunluğu al, B olur.

÷ - bu sonucun bölerek elde edilmesini sağlamak,

* - ve A'yı bu güçe götür.


⊢≡⌊ - tamsayı?


8

05AB1E , 11 bayt

γRćgUZXzm.ï

Çevrimiçi deneyin!

açıklama

gRćgUZXzm.ï ~ Tam program.

runs ~ Basamak sayısına bölün.
 R ~ Ters.
  ć ~ Yığına [1:], a [0] tuşlarına basın.
   g ~ Uzunluk (a [0]).
    Bunu X tamsayı değişkenine atayın.
     ZX ~ Çarpma olmadan maksimum alın ve X tuşuna basın.
       zm n-A 1 / B .
         bir tam sayı mı?

Emigna 1 bayt kaydetti.

Eğer gerçeğine dayanır bir tam sayı pozitif N gücüne yükseltilmiş B , daha sonra N = A 1 / B , dolayısıyla bir tamsayı olmalıdır.


UZXyerine çalışmalıs{θs
Emigna,

9 baytlık program başarısız olur 41902000(sahte olmalıdır).
Zgarb

@Zgarb Evet, neredeyse başarısız olacağından emindim, bu yüzden kaldırdım ... Ayrıca lol , tam olarak aynı tamsayıyı aldık
Bay Xcoder

Başarısız418802000
Okx

8

Haskell , 85 75 72 71 bayt

Düzenleme : Bir dize yerine basamakların bir listesini alarak -10 bayt. Buna izin verildiğine işaret ettiği için WhatToDo'ya teşekkür ederiz . Ourous'un Clean'deki çözümü sayesinde -3 bayt . User28667 sayesinde -1 bayt .

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

Çevrimiçi deneyin! Girdiyi basamak listesi olarak alır. Örnek kullanım: f [4,1,8,0,2,0,0,0]verim True.

Açıklama:

Bir giriş Verilen s=[4,1,8,0,2,0,0,0]biz reverselistesi ve birlikte gelen unsurları ayırmak span(==last s): ([0,0,0],[2,0,8,1,4]). Desen eşleştirme (b,a)verimleri b=[0,0,0]ve a=[2,0,8,1,4].

Liste kavraması or[n^length b==maximum a|n<-[1..a]]kontrol herhangi bir tamsayı olup naralığında 1için 9tatmin n^length b==maximum aolmasıdır n^3=8.


Sizinkini ben yapmadan önce gönderdiniz ve bizimki de benzer, yani: Çevrimiçi deneyin!
WhatToDo

@WhatToDo Teşekkürler, giriş olarak izin verilen basamak listelerini görmedim.
Laikoni

En fazla alamaz mısın? Hepsini kontrol etmene gerek yok.
Tim

@Tim Ne demek istediğinizi anladığımdan emin değilim. Tüm giriş listelerinin maksimumunu almak agibi durumlarda başarısız olur 477.
Laikoni

Ben almak için maksimum alıyoruz @Tim b, ama her tamsayı kontrol ndan 0kadar 9(eskiden gelen 0için a). Bu gördüğüm kadarıyla tam bir şartname.
Laikoni

5

Haskell , 104 89 bayt

@Likonikoni daha kısa bir çözüm buldu , ancak yapabileceğimin en iyisi bu. Rakam listelerini girdi olarak kabul edebileceğimizi bize bildirdiğiniz için @Laikoni'ye teşekkür ederiz.

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

Açıklama:

Çevrimiçi deneyin!


Kullanabiliyorken neden any(==a)kullanıyorsun elem a?
Buğday Sihirbazı

@WheatWizard İkinci yorumunuzla ilgili önerileriniz için teşekkür ederiz: Bu, örneğin başarısız olur 2888mu?
kusur

Evet, soruyu yanlış anladım. Sondaki sayıların sıfırdan başka bir şey olabileceğini bilmiyordum.
Buğday Sihirbazı

ancak head.maximumyine de maximum.concat2 bayttan daha kısa ve işlevselliğini koruyor.
Buğday Sihirbazı

4

R , 80 bayt

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

Çevrimiçi deneyin!

Kullanımları utf8ToInt - 48basamak içine sayısını bölmek. Bu bir dizgeye dönüşümden bir uyarı atar.

Rle kullanarak izlenen hanelerin sayımını ve ilk hanelerin maksimum değerini alın. 0 ila maksimum değerlerden herhangi biri, takip sayımının gücüne göre maksimum değere eşitse true döndürür.

Diğer golf fırsatları olduğunu düşünüyorum, ancak bu yarına kadar bekleyebilir.


2
Cevabımı sildim çünkü gönderimin sadece cevabınızı ve @ NofP'leri birleştirdiğini görmedim: function(x,R=rle(rev(utf8ToInt(x)-48)))!max(R$v[-1])^(1/R$l[‌​1])%%1(66 bayt, xbir dize olarak alarak )
plannapus 12

@ plannapus Şahsen ben geri almak istiyorum. Bu ikimizin de sayısından daha iyi bir sayı ve aslında ikisinin de kopyası değil
MickyT

@plannapus MickyT ile aynı fikirdeyim!
NofP

@NofP ve MickyT: Tamam o zaman, işte burada
plannapus

4

Jöle , 11 bayt

ŒgµṪL9*€fṀL

Girdiyi basamak listesi olarak alır.

Çevrimiçi deneyin!

Nasıl çalışır

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

Cevaplara bakmadan önce ve Jelly'i hiç tanımadan, Jelly cevabının 12 bayt olacağını tahmin etmiştim. ;)
DLosc

4

R, 66 bayt

Bu cevap az ya da çok MickyT ve NofP'nin cevaplarının bir karışıklığı ve talepleri üzerine, işte burada:

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

Bir dizge olarak x alır.

> 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 bayt

Girdiyi bir dize veya bir karakter dizisi olarak alır. Bir boole döndürür.

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

Test durumları


3

Temiz , 130 128 118 93 bayt

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

@Bir tamsayı sayısının listesini alarak işlevi tanımlar .

Çevrimiçi deneyin!



2

R , 93 bayt

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}

Çevrimiçi deneyin!

Kod giriş olarak bir tamsayı alır ve sayı hoş ise FALSE, aksi takdirde TRUE döndürür.


2

Python 3 , 88 85 bayt

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
  • Giriş bağımsız değişkeni bir rakam dizesi olması bekleniyor
  • Çıktı TrueyaFalse .
  • Halvard'ın cevabından bağımsız olarak geliştirilene benzer, ancak 2 53 üzerinde bir değer gerektiren b whicha'dan a ** (1 / b)en az 0.5 olana kadar , yuvarlama hatalarından muzdarip olmayan bir şekilde kayan nokta aritmetiği kullanır (ya da ne olursa olsun kayan nokta yarıçapı ve mantis uzunluk Python kullanmak olur, bkz.sys.float_info .
  • Hala 2 ve 36 arasındaki rasgele sayı tabanlarıyla çalışmak için trivally değiştirilebilir.

@ovs: Küçük bir değişiklikle, evet. Fonksiyon ekstra argüman olarak tabanını alıp halinin çağrıları için geçmek zorunda kalacak intve range. (Bir noktada, arama alanını a^(1/b)büyük miktarda güç hesaplamaktan ziyade tahmin etmek daha uygun hale gelecektir .)
David Foerster


1

Ruby , 64 bayt

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

Bir dize olarak giriş yaparsanız true değerini döndürür:

  • B == 1 (A'yı kontrol etmeniz gerekmez)
  • A == 4 ve B == 2
  • A == 9 ve B == 2
  • A == 8 ve B == 3

Çevrimiçi deneyin!


1

Perl 6 , 55 bayt

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

Çevrimiçi deneyin!

İlk regex'in değerlendirilmesinden sonra - bu sadece giriş pozitif bir tamsayıysa başarılı olabilir - sayının $0ilk kısmını içerir ve$1 içerir ve izleyen tekrarlanan rakamları içerir.

combBir dizi tatbik bağımsız değişken olmayan yöntem, karakterler listesi, döner listenin uzunluğuna sayısal içerik değerlendirir hangi. Bu $0.comb.max, önek içindeki rakamların en büyüğüdür $1.combve sonekin uzunluğudur.

Daha sonra any(^10)(yani, 0-9 arasındaki sayıların birleşiminin), sonekin uzunluğunun gücüne getirildiğinde önekteki en büyük basamağa eşit olup olmadığını kontrol ederiz . soKuvvetler aksi gayet bir truthy değeri olarak kendi başına olurdu çıkan kavşak, boole değerlendirilmesi, ama sadece iki farklı değerleri için mücadele çağrıları iade edilecek.


Bu geç, ancak girişin bir tamsayı olduğu garanti edildiğinden, regex .yerine kullanabilirsiniz \d.
DLosc



1

C # (.NET Core) , 132 bayt

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

Çevrimiçi deneyin!

Teşekkür

@KevinCruijssen sayesinde -12 bayt

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

Biliyorum, bir süre geçti, ama i=n.Length-2;for(;i>=0;i--)golf oynayabiliyor i=n.Length-1;for(;i-->0;)ve &&golf oynayabiliyor &.
Kevin Cruijssen

Oh, ve doğrudan using System;kullanarak 6 bayt golf oynayabilirsiniz System.Math.Pow.
Kevin Cruijssen

Son bir şey. Şu anda bir karakter listesi alıyorsunuz, ancak aynı zamanda bir hane listesi almanıza da izin veriyor. Bu durumda, -48-3 bayt için golf oynanabilir.
Kevin Cruijssen

1

Japt , 26 18 bayt

ó¶
o l
ñ o n qV v1

Çevrimiçi deneyin!


Bir dize olarak girdi alır 1, 0aksi halde hoş numaralar için döner .

Kısa açıklama:

ó¶

İlk girişi alın ve doğru olan değerlere bölün (x,y) => x===y. Örneğin '41802000'için ['4','1','8','0','2','000'].

o l

Diziyi ilk adımdan alın, son elemanı çıkarın ve uzunluğunu elde edin ( B) .

ñ o n qV v1

Kalan dizideki en büyük elemanı bulun, A vererek , onu güce götürün 1/Bve sonuç bir bölüştürülürse geri dönün.


Japt ile ilk kez çalışmak, herhangi bir tavsiyeye çok açık. ETHproductions
sayesinde 8 byte'lıktı .


Hey, Japt'a hoş geldin! Üzgünüm, ilk başta cevaplarınızı özledim. Birkaç ipucu: 1) İlk satırı tam tersine çevirmek için bir otomatik işlev kullanabilirsiniz ó¶. 2) Emin neden var değil vsadece küçük harfe dize dönüştürür ve uzunluğu ;-) 3) önleyebilirsiniz üzerinde hiçbir etkisi yoktur olarak, ikinci satırda !(Udeğiştirerek son satırında %1için v1hangi iadeler, 1konu eğer 1 veya 0başka şekilde bölünebilir .
ETHproductions

@ETHproductions Geri bildiriminiz için teşekkür ederiz, gerçekten minnettarım. Daha önce otomatik işlevleri okudum, ancak örnek olarak teşekkür ederim. Değişikliklerinizi de dahil ettik, toplam 8 bayt kaybediyorum.
Nit

0

Clojure, 168 bayt

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

Çevrimiçi deneyin!


0

Kömür , 33 bayt

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

Çevrimiçi deneyin! Bağlantı, kodun ayrıntılı bir versiyonudur. -Hoş sayılar için bir çıktılar . Açıklama:

≔ESιθ

Girişi qkarakterlere bölün.

⊞υ⊟θ

Son karakteri kaldır qve it u(boş bir listeye önceden tanımlanmış).

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

En son karakteri qilk karakter ise tekrar tekrar pop ve it u.

¬﹪XI⌈θ∕¹Lυ¹

Maksimum basamağını alın ve quzunluğu, karşılıklılığın gücüne yükseltin u, ardından sonucun bir tamsayı olup olmadığını kontrol edin.




0

Java 8, 125 bayt

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 Ayb4btu @ 'ın C # .NET cevap .

Çevrimiçi deneyin.

Açıklama:

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 bayt

JezWqezJ=Pz=hZ)K@sh.MsZzZqKsK

Test odası

Python 3 çeviri:
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))
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.