Nó có phải là một con số dễ chịu?


22

Một số dễ chịu (theo định nghĩa này) là một số có thể được chuyển qua quy trình sau (hãy sử dụng 41802000 làm ví dụ):

  • Phân tách các số giống hệt nhau ( 41802000 => [41802, 000])
  • Sắp xếp nửa đầu của các chữ số và lấy tối đa ([41802, 000] => [8, 000] )
  • Lấy chiều dài của phần tử cuối cùng. Gọi các phần tử kết quả AB ([8, 000] => A=8, B=3 )
  • N B = A có phải là số nguyên Nkhông? ( Truetrong ví dụ này; 2 3 = 8)

Nếu kết quả đầu vào trong Truequá trình sau đây, nó được coi là làm hài lòng.

Nhiệm vụ của bạn là lấy một số nguyên xvà xuất ra cho dù đó xlà một số dễ chịu. Bạn có thể xuất bất kỳ hai giá trị riêng biệt nào cho sự thật và chim ưng, nhưng vui lòng cho biết những gì bạn đang sử dụng trong câu trả lời của mình. xđược đảm bảo có ít nhất hai chữ số riêng biệt (ví dụ: 111đầu vào không hợp lệ). Như với hầu hết các thử thách, bạn có thể lấy xmột chuỗi hoặc một danh sách các chữ số.

Đây là một để mã ngắn nhất tính bằng byte thắng.

Các trường hợp thử nghiệm

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

số có thể được thông qua như một chuỗi? (đặc biệt được đưa ra trường hợp thử nghiệm '234543454545444')
Uriel

@Uriel Bạn có thể lấy đầu vào dưới dạng chuỗi
caird coinheringaahing 17/12/17

3
Như một gợi ý để làm rõ: Tôi sẽ sử dụng thuật ngữ "chữ số" thay vì "số", vì bạn đang đề cập cụ thể đến các ký tự thập phân, được trừu tượng hóa từ các giá trị số của chúng.
Jonathan Frech

list of digits- đây sẽ là danh sách các ký tự số ASCII hoặc danh sách các số nguyên từ 0-9
urous 17/12/17

1
@ Urous Tùy bạn
caird coinheringaahing 17/12/17

Câu trả lời:


9

APL (Dyalog) , 36 byte

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

Hãy thử trực tuyến!

Làm sao?

Gần như một bài thơ.

⌽⍵ - đảo ngược đầu vào một lần,

1,2=/ - có được danh sách khác biệt.

⌊\ - chỉ giữ lại nhóm đầu tiên

- và lật nó để hoàn thành.


o←- gán cho o,

~o - chuyển đổi những cái và số không,

⍵/⍨ - lọc đầu vào với nó,

⍎¨ - biến kết quả thành danh sách của mỗi chữ số,

  • ⌈/- và nhận được tối đa. (đó là một)

⍵/⍨o- lọc đầu vào với ounalt (ered),

- và lấy chiều dài, đó sẽ là B.

÷ - được chia cho kết quả này,

* - và đưa A đến quyền lực đó.


⊢≡⌊ - số nguyên?


8

05AB1E , 11 byte

γRćgUZXzm.ï

Hãy thử trực tuyến!

Giải trình

RćgUZXzm.ï ~ Chương trình đầy đủ.

~ Chia thành các chữ số.
 R ~ Đảo ngược.
  ć ~ Đẩy a [1:], a [0] vào ngăn xếp.
   g ~ Chiều dài (của một [0]).
    U ~ Gán điều này cho biến số nguyên X.
     ZX ~ Nhận tối đa, không bật và đẩy X.
       ZM ~ A 1 / B .
         .ï ~ Có phải là số nguyên không?

Emigna đã lưu 1 byte.

Dựa vào thực tế là nếu A là số nguyên dương N được nâng lên lũy thừa của B , thì N = A 1 / B , do đó nó phải là số nguyên.


UZXnên làm việc thay vìs{θs
Emigna

Chương trình 9 byte không thành công cho 41902000(nên bị giả mạo).
Zgarb

@Zgarb Vâng, tôi gần như chắc chắn rằng nó sẽ thất bại, vì vậy tôi đã xóa nó ... Ngoài ra lol chúng tôi có cùng một số nguyên
Ông Xcoder

418802000
Thất

8

Haskell , 85 75 72 71 byte

Chỉnh sửa : -10 byte bằng cách lấy danh sách các chữ số thay vì chuỗi. Cảm ơn WhatToDo đã chỉ ra rằng điều này được cho phép. -3 byte nhờ giải pháp của chúng tôi trong Clean . -1 byte nhờ người dùng28667 .

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

Hãy thử trực tuyến! Lấy đầu vào là một danh sách các chữ số. Ví dụ sử dụng: f [4,1,8,0,2,0,0,0]sản lượng True.

Giải trình:

Đưa ra một đầu vào s=[4,1,8,0,2,0,0,0], chúng tôi reverseliệt kê danh sách và phân tách các yếu tố hàng đầu với span(==last s): ([0,0,0],[2,0,8,1,4]). Các mô hình phù hợp trên (b,a)sản lượng b=[0,0,0]a=[2,0,8,1,4].

Việc hiểu danh sách or[n^length b==maximum a|n<-[1..a]]kiểm tra xem có bất kỳ số nguyên nào ntrong phạm vi từ 1đến 9thỏa mãn hay không n^length b==maximum a, đó là n^3=8.


Bạn đã đăng của bạn trước khi tôi làm của tôi và của chúng tôi cũng tương tự, vì vậy: Hãy thử trực tuyến!
WhatToDo

@WhatToDo Cảm ơn, tôi không thấy danh sách các chữ số được phép làm đầu vào.
Laikoni

Bạn không thể chỉ lấy tối đa. Không cần phải kiểm tra tất cả.
Tim

@Tim Tôi không chắc là tôi hiểu ý của bạn. Lấy tối đa toàn bộ danh sách đầu vào để nhận asẽ thất bại trong các trường hợp như477 .
Laikoni

@Tim Tôi lấy tối đa để lấy b, nhưng kiểm tra mọi số nguyên ntừ 0đến9 (trước đây là từ 0để a). Đó chính xác là thông số kỹ thuật theo như tôi thấy.
Laikoni

5

Haskell , 104 89 byte

@Laikoni tìm thấy một giải pháp ngắn hơn , nhưng đây là cách tốt nhất tôi có thể làm. Cảm ơn @Laikoni đã cho tôi biết rằng chúng tôi cũng có thể chấp nhận danh sách các chữ số làm đầu vào.

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

Giải trình:

Hãy thử trực tuyến!


Tại sao sử dụng any(==a)khi bạn có thể sử dụng elem a?
Thuật sĩ lúa mì

@WheatWizard Cảm ơn các đề xuất, liên quan đến nhận xét thứ hai của bạn: Điều này có thất bại không 2888?
flawr

Có vẻ như tôi đã đọc sai câu hỏi. Tôi đã không nhận ra rằng các số kéo dài có thể là bất cứ thứ gì khác không.
Thuật sĩ lúa mì

nhưng head.maximumvẫn ngắn hơn maximum.concat2 byte và duy trì chức năng.
Thuật sĩ lúa mì

4

R , 80 byte

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

Hãy thử trực tuyến!

Sử dụng utf8ToInt - 48để chia số thành chữ số. Điều này đưa ra một cảnh báo từ chuyển đổi thành một chuỗi.

Sử dụng rle có được số lượng các chữ số ở cuối và giá trị tối đa của các chữ số đầu tiên. Trả về true nếu bất kỳ giá trị nào trong phạm vi từ 0 đến tối đa với sức mạnh của số đếm bằng với giá trị tối đa.

Tôi nghĩ rằng có nhiều cơ hội chơi gôn hơn, nhưng điều đó có thể đợi đến ngày mai.


2
Tôi đã xóa câu trả lời của mình vì tôi không thấy rằng bài đăng của mình chỉ là kết hợp câu trả lời của bạn và @ NofP's: function(x,R=rle(rev(utf8ToInt(x)-48)))!max(R$v[-1])^(1/R$l[‌​1])%%1(66 byte, lấy xdưới dạng chuỗi)
plannapus 18/12/17

@plannapus Cá nhân tôi sẽ phục hồi nó. Đó là một số lượng tốt hơn so với cả hai chúng ta và không thực sự là một bản sao của một trong hai
MickyT

@plannapus Tôi đồng ý với MickyT!
NofP

@NofP và MickyT: Được rồi, đây rồi
plannapus 19/12/17

4

Thạch , 11 byte

ŒgµṪL9*€fṀL

Lấy đầu vào là một danh sách các chữ số.

Hãy thử trực tuyến!

Làm thế nào nó hoạt động

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

Trước khi nhìn vào các câu trả lời, và không biết gì về Jelly, tôi đoán rằng câu trả lời của Jelly sẽ là 12 byte. ;)
DLosc

4

R, 66 byte

Câu trả lời này ít nhiều là một hỗn hợp các câu trả lời của MickyTNofP , và theo yêu cầu của họ, đây là:

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

Nó lấy x là một chuỗi.

> 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

Lấy đầu vào là một chuỗi hoặc một mảng các ký tự. Trả về một boolean.

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

Các trường hợp thử nghiệm


3

Sạch , 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]]

Xác định hàm @, lấy danh sách các chữ số nguyên.

Hãy thử trực tuyến!



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}

Hãy thử trực tuyến!

Mã này lấy một số nguyên làm đầu vào và trả về SAI nếu số đó được làm hài lòng và TRUE nếu không.


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

Ung dung:

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
  • Đối số đầu vào dự kiến ​​là một chuỗi chữ số
  • Kết quả là một trong hai Truehoặc False.
  • Tương tự như được phát triển độc lập với câu trả lời của Halvard nhưng sử dụng số học dấu phẩy động theo cách không bị lỗi làm tròn cho đến khi a ** (1 / b)tắt ít nhất 0,5 từ b √a, yêu cầu giá trị trên 2 53 (hoặc bất kỳ giá trị dấu phẩy động và mantissa nào chiều dài Python xảy ra để sử dụng, xem sys.float_info).
  • Có thể được sửa đổi một cách tầm thường để vẫn hoạt động với các cơ sở số tùy ý trong khoảng từ 2 đến 36.

@ovs: Với một sửa đổi nhỏ, vâng. Hàm sẽ phải lấy cơ sở làm đối số phụ và chuyển nó tới các lệnh của intrange. (Tại một số điểm, việc ước tính phạm vi tìm kiếm dựa trên phạm vi sẽ trở nên khả thi a^(1/b)hơn so với việc tính toán lượng sức mạnh lớn.)
David Foerster


1

Ruby , 64 byte

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

Nhập dưới dạng chuỗi, trả về true nếu:

  • B == 1 (không cần kiểm tra A)
  • A == 4 và B == 2
  • A == 9 và B == 2
  • A == 8 và B == 3

Hãy thử trực tuyến!


1

Perl 6 , 55 byte

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

Hãy thử trực tuyến!

Sau khi đánh giá regex ban đầu - chỉ có thể thành công nếu đầu vào là số nguyên dương-- $0chứa phần đầu của số và $1chứa các chữ số lặp lại theo sau.

Các combphương pháp không có đối số, áp dụng cho một chuỗi, trả về một danh sách các nhân vật, mà trong đánh giá lại bối cảnh số với độ dài của danh sách. Vì thế$0.comb.max là số lớn nhất trong các chữ số trong tiền tố và$1.comb là độ dài của hậu tố.

Sau đó, chúng tôi kiểm tra xem any(^10)(tức là, hoặc điểm nối của các số từ 0-9), khi được nâng lên sức mạnh của độ dài của hậu tố, có bằng chữ số lớn nhất trong tiền tố hay không. Các solực lượng đánh giá boolean của ngã ba kết quả, nếu không thì nó sẽ tự nó tốt như một giá trị trung thực, nhưng thách thức đòi hỏi chỉ có hai giá trị riêng biệt được trả về.


Điều này là muộn, nhưng vì đầu vào được đảm bảo là một số nguyên, regex có thể sử dụng .thay vì \d.
DLosc



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

Hãy thử trực tuyến!

Lời cảm ơn

-12 byte nhờ @KevinCruijssen

Khói

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

Tôi biết đã được một lúc, nhưng i=n.Length-2;for(;i>=0;i--)có thể chơi gôn i=n.Length-1;for(;i-->0;)&&có thể chơi gôn &.
Kevin Cruijssen

Ồ, và bạn có thể chơi thêm 6 byte bằng cách loại bỏ using System;và sử dụng System.Math.Powtrực tiếp.
Kevin Cruijssen

Một điều cuối cùng. Hiện tại bạn có một danh sách các ký tự, nhưng nó cũng được phép lấy một danh sách các chữ số. Trong trường hợp đó, -48có thể được đánh gôn cho -3 byte.
Kevin Cruijssen

1

Japt , 26 18 byte

ó¶
o l
ñ o n qV v1

Hãy thử trực tuyến!


Lấy đầu vào dưới dạng chuỗi, trả về 1 cho các số dễ chịu,0 nếu không.

Giải thích ngắn gọn:

ó¶

Lấy đầu vào đầu tiên và chia nó theo các giá trị (x,y) => x===ylà đúng. Ví dụ '41802000'để ['4','1','8','0','2','000'].

o l

Lấy mảng từ bước đầu tiên, loại bỏ các yếu tố cuối cùng và có được chiều dài của nó, năng suất B .

ñ o n qV v1

Tìm phần tử lớn nhất trong mảng còn lại, thu được A , đưa nó tới lũy thừa 1/Bvà sau đó trả về nếu kết quả chia hết cho một.


Lần đầu tiên làm việc với Japt, rất cởi mở với bất kỳ khuyến nghị nào.
Cạo sạch 8 byte nhờ vào ETHproductions .


Chào mừng bạn đến với Japt! Xin lỗi tôi đã bỏ lỡ câu trả lời của bạn lúc đầu. Một vài mẹo: 1) Bạn có thể sử dụng chức năng tự động để biến dòng đầu tiên thành chỉ ó¶. 2) Không chắc chắn tại sao bạn có vdòng thứ hai, vì nó chỉ chuyển đổi chuỗi thành chữ thường và không ảnh hưởng đến độ dài ;-) 3) Bạn có thể tránh dòng !(Utrên cùng bằng cách thay đổi %1thành v1, trả về 1nếu chủ đề chia hết cho 1 hoặc 0nếu không.
Sản xuất ETH

@ETHproductions Cảm ơn rất nhiều về phản hồi của bạn, thực sự đánh giá cao nó. Tôi đã đọc về các chức năng tự động trước đây, nhưng tôi vẫn chưa hiểu rõ về nó, cảm ơn vì ví dụ này. Tôi cũng đã kết hợp các thay đổi còn lại của mình, thêm tổng cộng 8 byte bị mất.
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)))

Hãy thử trực tuyến!


0

Than , 33 byte

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

Hãy thử trực tuyến! Liên kết là phiên bản dài dòng của mã. Xuất ra một số -cho vừa lòng. Giải trình:

≔ESιθ

Chia đầu qvào thành các ký tự.

⊞υ⊟θ

Xóa ký tự cuối cùng khỏi qvà đẩy nó tới u(được xác định trước vào một danh sách trống).

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

Lặp lại bật và đẩy trong khi ký tự cuối cùng qlà ký tự đầu tiên của u.

¬﹪XI⌈θ∕¹Lυ¹

Lấy chữ số tối đa của qvà nâng nó lên lũy thừa của độ dài của độ dài u, sau đó kiểm tra xem kết quả có phải là số nguyên hay không.




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

Cổng câu trả lời C # .NET của @ Ayb4btu .

Hãy thử trực tuyến.

Giải trình:

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

Bình thường, 29 byte

JezWqezJ=Pz=hZ)K@sh.MsZzZqKsK

Bộ kiểm tra

Dịch thuật 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))
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.