Apakah ini angka yang menyenangkan?


22

Angka yang menyenangkan (menurut definisi ini) adalah angka yang dapat dilewati melalui proses berikut (mari kita gunakan 41802000sebagai contoh):

  • Pisahkan angka identik yang tertinggal ( 41802000 => [41802, 000])
  • Sortir bagian pertama dari digit dan ambil maksimum ( [41802, 000] => [8, 000])
  • Ambil panjang elemen terakhir. Panggil elemen yang dihasilkan A dan B ( [8, 000] => A=8, B=3)
  • Apakah N B = A untuk bilangan bulat apa pun N? ( Truedalam contoh ini; 2 3 = 8)

Jika input dihasilkan Truedari proses berikut ini, itu dianggap menyenangkan.

Tugas Anda adalah mengambil bilangan bulat x, dan menampilkan apakah xangka yang menyenangkan. Anda dapat menampilkan dua nilai berbeda untuk truey and falsey, tetapi sebutkan apa yang Anda gunakan dalam jawaban Anda. xdijamin memiliki setidaknya dua digit berbeda (mis. 111input tidak valid). Seperti kebanyakan tantangan, Anda dapat menggunakan xstring, atau daftar digit.

Ini adalah sehingga kode terpendek dalam byte menang.

Uji kasus

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

dapatkah angka diteruskan sebagai string? (Khususnya diberikan test case '234543454545444')
Uriel

@Uriel Anda dapat mengambil input sebagai string
caird coinheringaahing

3
Sebagai saran untuk klarifikasi: Saya akan menggunakan istilah "digit" daripada "angka", karena Anda secara spesifik merujuk pada karakter desimal, yang disarikan dari nilai angka mereka.
Jonathan Frech

list of digits- ini akan menjadi daftar karakter angka ASCII, atau daftar bilangan bulat dari 0-9
Οurous

1
@ Οurous Terserah Anda
caird coinheringaahing

Jawaban:


9

APL (Dyalog) , 36 byte

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

Cobalah online!

Bagaimana?

Hampir sebuah puisi.

⌽⍵ - balikkan input sekali,

1,2=/ - dapatkan daftar perbedaan.

⌊\ - simpan hanya grup yang pertama,

- dan balikkan untuk menyelesaikan.


o←- ditugaskan ke o,

~o - beralih satu dan nol,

⍵/⍨ - saring input dengan itu,

⍎¨ - ubah hasilnya menjadi daftar setiap digit,

  • ⌈/- dan dapatkan yang maksimal. (itu A)

⍵/⍨o- filter input dengan ounalt (ered),

- dan mengambil panjangnya, itu akan menjadi B.

÷ - dapatkan satu dibagi dengan hasil ini,

* - dan bawa A ke kekuatanmu itu.


⊢≡⌊ - bilangan bulat?


8

05AB1E , 11 byte

γRćgUZXzm.ï

Cobalah online!

Penjelasan

γRćgUZXzm.ï ~ Program lengkap.

γ ~ Membagi menjadi beberapa digit.
 R ~ Mundur.
  ć ~ Dorong [1:], a [0] ke tumpukan.
   g ~ Panjang (dari [0]).
    U ~ Tetapkan ini ke variabel integer X.
     ZX ~ Dapatkan yang maksimal, tanpa muncul, dan tekan X.
       zm ~ A 1 / B .
         .ï ~ Apakah bilangan bulat?

Emigna menyimpan 1 byte.

Bergantung pada fakta bahwa jika A adalah bilangan bulat positif N dinaikkan ke kekuatan B , maka N = A 1 / B , maka itu harus bilangan bulat.


UZXharus bekerja alih-alihs{θs
Emigna

Program 9-byte gagal untuk 41902000(harus palsu).
Zgarb

@ Zgarb Ya saya hampir yakin itu akan gagal, jadi saya menghapusnya ... Juga lol kami mendapat bilangan bulat yang sama persis
Tn. Xcoder

Gagal untuk418802000
Okx

8

Haskell , 85 75 72 71 byte

Edit : -10 byte dengan mengambil daftar digit alih-alih string. Terima kasih kepada WhatToDo untuk menunjukkan bahwa ini dibolehkan. -3 byte berkat solusi Ourous 'di Clean . -1 byte terima kasih kepada pengguna28667 .

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

Cobalah online! Mengambil input sebagai daftar digit. Contoh penggunaan: f [4,1,8,0,2,0,0,0]hasil True.

Penjelasan:

Diberi masukan s=[4,1,8,0,2,0,0,0], kami reversedaftar dan memisahkan unsur-unsur terkemuka dengan span(==last s): ([0,0,0],[2,0,8,1,4]). Pola yang cocok pada (b,a)hasil b=[0,0,0]dan a=[2,0,8,1,4].

Daftar pemahaman or[n^length b==maximum a|n<-[1..a]]memeriksa apakah setiap bilangan bulat ndalam kisaran 1untuk 9memenuhi n^length b==maximum a, yaitu n^3=8.


Anda memposting milik Anda sebelum saya memilikinya, dan milik kami serupa, jadi: Coba online!
WhatToDo

@ WhatToDo Terima kasih, saya tidak melihat daftar digit yang diizinkan sebagai input.
Laikoni

Tidak bisakah kamu mengambil yang maksimal. Tidak perlu memeriksa semuanya.
Tim

@Tim saya tidak yakin saya mengerti maksud Anda. Mengambil maksimum dari seluruh daftar input untuk mendapatkan aakan gagal dalam kasus seperti 477.
Laikoni

@Tim saya mengambil maksimum untuk mendapatkan b, tetapi memeriksa setiap integer ndari 0ke 9(sebelumnya dari 0ke a). Itu persis spesifikasi sejauh yang saya lihat.
Laikoni

5

Haskell , 104 89 bytes

@Laikoni menemukan solusi yang lebih pendek , tetapi ini adalah yang terbaik yang bisa saya lakukan. Terima kasih @Laikoni karena memberi tahu saya bahwa kami juga dapat menerima daftar digit sebagai input.

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

Penjelasan:

Cobalah online!


Mengapa menggunakan any(==a)saat Anda bisa menggunakannya elem a?
Wheat Wizard

@WheatWizard Terima kasih atas sarannya, mengenai komentar kedua Anda: Tidakkah ini gagal misalnya 2888?
flawr

Ya sepertinya saya salah membaca pertanyaan. Saya tidak menyadari bahwa angka yang tertinggal bisa menjadi apa pun selain nol.
Wheat Wizard

tetapi head.maximummasih lebih pendek dari maximum.concat2 byte, dan mempertahankan fungsinya.
Wheat Wizard

4

R , 80 byte

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

Cobalah online!

Penggunaan utf8ToInt - 48untuk membagi angka menjadi angka. Ini melempar peringatan dari konversi ke string.

Menggunakan rle, hitung jumlah trailing digit dan nilai maksimum digit pertama. Mengembalikan nilai true jika salah satu dari kisaran 0 hingga nilai maksimal ke pangkat trailing count sama dengan nilai maks.

Saya pikir ada peluang golf lebih lanjut, tetapi itu bisa menunggu sampai besok.


2
Saya menghapus jawaban saya karena saya tidak melihat bahwa posting saya hanya menggabungkan jawaban Anda dan @ NofP: function(x,R=rle(rev(utf8ToInt(x)-48)))!max(R$v[-1])^(1/R$l[‌​1])%%1(66 byte, xsebagai string)
plannapus

@plannapus Secara pribadi saya akan membatalkan penghapusan. Ini hitungan yang lebih baik daripada kami berdua dan juga bukan salinan keduanya
MickyT

@plannapus Saya setuju dengan MickyT!
NofP

@NofP dan MickyT: Baiklah, ini dia
plannapus

4

Jelly , 11 byte

ŒgµṪL9*€fṀL

Mengambil input sebagai daftar digit.

Cobalah online!

Bagaimana itu bekerja

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

Sebelum melihat jawaban, dan tanpa mengetahui Jelly sama sekali, saya menduga bahwa jawaban Jelly akan menjadi 12 byte. ;)
DLosc

4

R, 66 byte

Jawaban ini kurang lebih merupakan campuran jawaban MickyT dan NofP , dan atas permintaan mereka, ini dia:

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

Dibutuhkan x sebagai string.

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

Mengambil input sebagai string atau array karakter. Mengembalikan boolean.

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

Uji kasus


3

Bersih , 130 128 118 93 byte

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

Menentukan fungsi @, mengambil daftar angka integer.

Cobalah online!



2

R , 93 byte

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}

Cobalah online!

Kode mengambil integer sebagai input dan mengembalikan FALSE jika nomornya menyenangkan, dan BENAR sebaliknya.


2

Python 3 , 88 85 byte

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

Tidak Disatukan:

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
  • Argumen input diharapkan berupa string digit
  • Outputnya adalah Trueatau False.
  • Mirip dengan belum dikembangkan secara independen dari jawaban Halvard ini tetapi menggunakan aritmatika floating point dengan cara yang tidak menderita dari kesalahan pembulatan sampai a ** (1 / b)mati oleh sedikitnya 0,5 dari b √a yang membutuhkan nilai di atas 2 53 (atau apa pun floating point radix dan mantissa panjang Python yang akan digunakan, lihat sys.float_info).
  • Dapat dimodifikasi secara sepele untuk tetap bekerja dengan basis nomor acak antara 2 dan 36.

@ovs: Dengan sedikit modifikasi, ya. Fungsi harus mengambil basis sebagai argumen tambahan dan meneruskannya ke doa dari intdan range. (Pada titik tertentu, akan menjadi lebih layak untuk memperkirakan rentang pencarian berdasarkan pada a^(1/b)daripada menghitung sejumlah besar kekuatan.)
David Foerster


1

Ruby , 64 byte

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

Input sebagai string, mengembalikan true jika:

  • B == 1 (tidak perlu memeriksa A)
  • A == 4 dan B == 2
  • A == 9 dan B == 2
  • A == 8 dan B == 3

Cobalah online!


1

Perl 6 , 55 byte

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

Cobalah online!

Setelah evaluasi regex awal - yang hanya dapat berhasil jika inputnya adalah bilangan bulat positif - $0berisi bagian awal angka, dan $1berisi trailing digit berulang.

The combmetode tanpa argumen, diterapkan ke string, mengembalikan daftar karakter, yang dalam mengevaluasi konteks numerik dengan panjang daftar. Jadi $0.comb.maxadalah digit terbesar dalam awalan, dan $1.combmerupakan panjang akhiran.

Kami kemudian memeriksa apakah any(^10)(yaitu, atau-persimpangan angka dari 0-9), ketika dinaikkan ke kekuatan panjang akhiran, sama dengan digit terbesar dalam awalan. The sokekuatan evaluasi boolean dari persimpangan yang dihasilkan, yang tidak akan baik-baik saja sendiri sebagai nilai truthy, tetapi panggilan tantangan untuk hanya dua nilai yang berbeda untuk dikembalikan.


Ini terlambat, tetapi karena input dijamin bilangan bulat, regex dapat digunakan .sebagai gantinya \d.
DLosc

1

Kotlin , 106 byte

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

Output: benar / salah

Cobalah online!



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

Cobalah online!

Ucapan Terima Kasih

-12 byte terima kasih kepada @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;
}

Saya tahu sudah lama, tapi i=n.Length-2;for(;i>=0;i--)bisa bermain golf i=n.Length-1;for(;i-->0;)dan &&bisa bermain golf &.
Kevin Cruijssen

Oh, dan Anda bisa bermain golf 6 byte lebih banyak dengan menghapus using System;dan menggunakan System.Math.Powlangsung.
Kevin Cruijssen

Satu hal terakhir. Saat ini Anda mengambil daftar karakter, tetapi juga diizinkan untuk mengambil daftar digit. Dalam hal -48ini dapat golf untuk -3 byte.
Kevin Cruijssen

1

Japt , 26 18 byte

ó¶
o l
ñ o n qV v1

Cobalah online!


Mengambil input sebagai string, mengembalikan 1untuk angka menyenangkan, 0jika tidak.

Penjelasan singkat:

ó¶

Ambil input pertama dan bagi dengan nilai (x,y) => x===yyang benar. Misalnya '41802000'untuk ['4','1','8','0','2','000'].

o l

Ambil array dari langkah pertama, menghapus elemen terakhir dan panjangnya, menghasilkan B .

ñ o n qV v1

Temukan elemen terbesar di array yang tersisa, menghasilkan A , bawa ke kekuasaan 1/Bdan kemudian kembali jika hasilnya dapat dibagi oleh satu.


Pertama kali bekerja dengan Japt, sangat terbuka untuk semua rekomendasi.
Dicukur 8 byte berkat produk ETH .


Hei, selamat datang di Japt! Maaf saya melewatkan jawaban Anda pada awalnya. Beberapa tips: 1) Anda dapat menggunakan fungsi otomatis untuk mengubah baris pertama menjadi adil ó¶. 2) Tidak yakin mengapa Anda memiliki vdi baris kedua, karena hanya mengubah string menjadi huruf kecil dan tidak berpengaruh pada panjang ;-) 3) Anda dapat menghindari !(Upada baris terakhir dengan mengubah %1ke v1, yang kembali 1jika subjek habis dibagi 1 atau 0sebaliknya.
ETHproduk

@ ETHproductions Terima kasih banyak atas tanggapan Anda, sangat menghargainya. Saya membaca tentang fungsi-otomatis sebelumnya, tetapi saya masih belum cukup memahami hal itu, terima kasih untuk contohnya. Saya telah memasukkan sisa perubahan Anda juga, menambahkan hingga total 8 byte yang hilang.
Nit

0

Clojure, 168 byte

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

Cobalah online!


0

Arang , 33 byte

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

Cobalah online! Tautan adalah untuk mengucapkan versi kode. Output a -untuk angka yang menyenangkan. Penjelasan:

≔ESιθ

Membagi input qmenjadi karakter.

⊞υ⊟θ

Hapus karakter terakhir dari qdan dorong ke u(sudah ditentukan ke daftar kosong).

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

Ulangi dan tekan berulang kali saat karakter terakhir q adalah karakter pertama u.

¬﹪XI⌈θ∕¹Lυ¹

Ambil digit maksimum qdan naikkan ke kekuatan timbal balik dari panjang u, lalu periksa apakah hasilnya bilangan bulat.




0

Java 8, 125 byte

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

Pelabuhan @ Ayb4btu 's C # .NET jawaban .

Cobalah online.

Penjelasan:

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 byte

JezWqezJ=Pz=hZ)K@sh.MsZzZqKsK

Suite uji

Terjemahan 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))
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.