这是令人愉快的数字吗?


22

一个令人愉悦的数字(根据此定义)是可以通过以下过程传递的数字(以我们的41802000示例为例):

  • 分隔尾随相同的数字(41802000 => [41802, 000]
  • 排序数字的前半部分并取最大值([41802, 000] => [8, 000]
  • 取最后一个元素的长度。调用结果元素AB[8, 000] => A=8, B=3
  • N B = A是否代表任何整数N?(True在此示例中; 2 3 = 8)

如果输入True来自以下过程,则认为是令人满意的。

您的任务是取一个整数x,并输出是否x为令人满意的数字。您可以输出真值和假值的任意两个不同的值,但请在回答中说明您使用的是什么。x保证至少有两个不同的数字(例如111,无效的输入)。与大多数挑战一样,您可以将其x视为字符串或数字列表。

这是一个因此以字节为单位的最短代码获胜。

测试用例

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

数字可以作为字符串传递吗?(尤其是考虑到'234543454545444'测试用例)
Uriel

@Uriel您可以将输入作为字符串输入
caird coinheringaahing

3
作为澄清的建议:我将使用术语“数字”而不是“数字”,因为您专门指的是从数字值中抽象出来的十进制字符。
乔纳森·弗雷希

list of digits-这将是ASCII字符数字的列表,或从0-9整数列表
Οurous

1
@ouurous由您决定
caird coinheringaahing

Answers:


9

APL(Dyalog),36字节

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

在线尝试!

怎么样?

几乎是一首诗。

⌽⍵ -一次反转输入,

1,2=/ -获取差异列表。

⌊\ -只保留第一批,

-并将其翻转完成。


o←-分配给o

~o -切换1和0,

⍵/⍨ -用它过滤输入

⍎¨ -将结果转换为每个数字的列表,

  • ⌈/-并获得最大收益。(那是一个)

⍵/⍨o-使用ounalt(ered)过滤输入,

-取长度,即B。

÷ -得到一个除以该结果,

* -把A带给你。


⊢≡⌊ - 整数?


8

05AB1E,11个字节

γRćgUZXzm.ï

在线尝试!

说明

γRćgUZXzm.ï〜完整程序。

γ〜分成几串。
 R〜反向。
  ć〜将a [1:],a [0]推入堆栈。
   g〜长度(a [0]的长度)。
    U〜将其分配给整数变量X。
     ZX〜获得最大值,不弹出,然后按X。
       ZM〜阿1 / B。
         .ï〜是整数吗?

Emigna保存了1个字节。

依赖于以下事实:如果A是一个升为B的幂的正整数N,则N = A 1 / B,因此它必须是整数。


UZX应该工作,而不是s{θs
Emigna '17

9字节程序因失败41902000(应该是虚假的)。
Zgarb

@Zgarb是的,我几乎确定它会失败,所以我将其删除了…… 大声笑,我们得到了完全相同的整数
Xcoder先生

失败418802000
Okx

8

Haskell85 75 72 71字节

编辑:-10字节通过采用数字列表而不是字符串。感谢WhatToDo指出允许这样做。-3字节归功于Ourous在Clean中的解决方案。-1个字节感谢user28667

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

在线尝试!将输入作为数字列表。用法示例:f [4,1,8,0,2,0,0,0]yields True

说明:

给定一个输入s=[4,1,8,0,2,0,0,0],我们reverse列出并用span(==last s):分隔主要元素([0,0,0],[2,0,8,1,4])(b,a)收益b=[0,0,0]和收益的模式匹配a=[2,0,8,1,4]

列表解析or[n^length b==maximum a|n<-[1..a]]检查是否任何整数n在从范围内1,以9满足n^length b==maximum a,即n^3=8


您在我做我的事之前就发布了您的事,我们的事也差不多,所以:在线试用!
WhatToDo

@WhatToDo谢谢,我没有看到允许输入的数字列表。
Laikoni '17

你不能只拿最大的。无需全部检查。
蒂姆(Tim)

@Tim我不确定我明白你的意思。a在诸如此类的情况下,要获取整个输入列表的最大值将失败477
Laikoni '17

@Tim我确实要获取最大值b,但是检查nfrom 09(以前是0to a)的每个整数。就我所知,这正是规范。
Laikoni '17

5

Haskell104 89字节

@Laikoni找到了一个较短的解决方案,但这是我能做的最好的。感谢@Laikoni,让我知道我们也可以接受数字列表作为输入。

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

说明:

在线尝试!


为什么any(==a)在可以使用时使用elem a
小麦巫师

@WheatWizard感谢您的建议,关于您的第二条评论:这样会不会失败2888
瑕疵

是的,看来我误解了这个问题。我没有意识到尾随数字可能不是零。
小麦巫师

head.maximum仍短于maximum.concat2字节,并保持功能。
小麦巫师

4

R,80个字节

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

在线尝试!

用于utf8ToInt - 48将数字拆分为数字。这将引发从转换为字符串的警告。

使用rle获取尾数的计数和前几位数的最大值。如果从0到最大值的范围中的任何一个到尾随次数的幂等于最大值,则返回true。

我认为还有更多的高尔夫机会,但这可以等到明天。


2
我删除了答案,因为我没有发现我的帖子只是将您的答案和@NofP结合在一起:function(x,R=rle(rev(utf8ToInt(x)-48)))!max(R$v[-1])^(1/R$l[‌​1])%%1(66字节,以x字符串形式)
plannapus

@plannapus我个人将不删除它。比我们两个人都更好,但不是一个真正的副本
MickyT

@plannapus我同意MickyT!
NofP

@NofP和MickyT:好吧,这是
plannapus

4

果冻,11字节

ŒgµṪL9*€fṀL

将输入作为数字列表。

在线尝试!

怎么运行的

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

在查看答案之前,并且根本不了解Jelly,我猜测Jelly的答案将是12个字节。;)
DLosc

4

R,66个字节

这个答案或多或少是MickyTNofP的答案,应他们的要求,这里是:

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

它以x作为字符串。

> 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个字节

将输入作为字符串或字符数组。返回一个布尔值。

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

测试用例


3

干净130个 128 118 93字节

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

定义函数@,采用整数列表。

在线尝试!



2

[R,93字节

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}

在线尝试!

代码采用整数作为输入,如果数字令人满意,则返回FALSE,否则返回TRUE。


2

Python 3中88 85个字节

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

取消高尔夫:

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
  • 输入参数应为数字字符串
  • 输出为TrueFalse
  • 类似但独立开发的Halvard的答案,但使用浮点运算在不从舍入误差遭受直到办法a ** (1 / b)是关闭的,至少从0.5 b √A这需要超过2的值53(或任何浮点基数和尾数Python恰好使用的长度,请参阅sys.float_info)。
  • 可以进行少量修改,以仍然可以使用2到36之间的任意数字基。

@ovs:稍作修改,是的。该函数必须将base作为额外参数,并将其传递给intand 的调用range。(在某个时候,基于搜索范围估计a^(1/b)比计算大量能力更可行。)
David Foerster


1

红宝石,64字节

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

输入为字符串,如果满足以下条件,则返回true:

  • B == 1(无需检查A)
  • A == 4和B == 2
  • A == 9和B == 2
  • A == 8和B == 3

在线尝试!


1

Perl 6、55个字节

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

在线尝试!

对初始正则表达式求值后(仅当输入为正$0整数时才能成功),包含数字的初始部分,并且$1包含数字包含尾随重复数字。

comb应用于字符串的不带参数的方法将返回一个字符列表,该字符列表在数字上下文中的值将为列表的长度。所以$0.comb.max前缀中的最大位数是位,$1.comb后缀的长度是。

然后any(^10),当升至后缀长度的幂时,我们检查(即0-9之间的数字的交点)是否等于前缀中的最大数字。将so要返回部队所产生的交界处,否则只是罚款自身作为truthy值的布尔评价,但只是两个不同的值的挑战要求。


这很晚了,但是由于保证输入是整数,因此regex可以使用.代替\d
DLosc



1

C#(.NET Core),132字节

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

在线尝试!

致谢

-12个字节感谢@KevinCruijssen

去高尔夫

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

我知道已经有一段时间了,但是i=n.Length-2;for(;i>=0;i--)可以打高尔夫i=n.Length-1;for(;i-->0;)&&也可以打高尔夫&
凯文·克鲁伊森

哦,您可以通过删除using System;System.Math.Pow直接使用来再打6个字节。
凯文·克鲁伊森

最后一件事。您目前使用的是字符列表,但也可以使用数字列表。在这种情况下,-48可以打-3字节。
凯文·克鲁伊森

1

Japt26 18字节

ó¶
o l
ñ o n qV v1

在线尝试!


将输入作为字符串10否则返回令人满意的数字。

简短说明:

ó¶

取第一个输入并将其按值拆分(x,y) => x===y为true。例如'41802000'['4','1','8','0','2','000']

o l

取从所述第一步骤中的阵列,删除最后一个元件,并得到它的长度,从而得到

ñ o n qV v1

在剩余数组中找到最大的元素,产生A,将其取幂1/B,然后将结果除以1即可返回。


第一次使用Japt,非常欢迎任何建议。
由于ETHproductions减少了8个字节。


嗨,欢迎来到Japt!抱歉,我一开始错过了您的答案。一些提示:1)您可以使用自动功能将第一行变成just ó¶。2)不确定为什么v在第二行中使用了,因为它只是将字符串转换为小写而对长度没有影响;-) 3)您可以!(U通过更改%1为来避免最后一行上的v11如果主题是可被1整除0
ETHproductions'Apr

@ETHproductions非常感谢您的反馈,非常感谢。之前我读过有关自动功能的文章,但是我仍然不太了解它的功能,感谢示例。我也合并了其余的更改,总共丢失了8个字节。
Nit

0

Clojure,168个字节

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

在线尝试!


0

木炭,33字节

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

在线尝试!链接是详细版本的代码。输出a -表示令人愉快的数字。说明:

≔ESιθ

将输入拆分q为字符。

⊞υ⊟θ

从中删除最后一个字符q并将其推送到u(预定义为空列表)。

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

重复弹出并推动,而的最后一个字符q是的第一个字符u

¬﹪XI⌈θ∕¹Lυ¹

取的最大位数q并将其提高为的倒数的幂u,然后检查结果是否为整数。




0

Java 8,125字节

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

@ Ayb4btu的C#.NET答案的端口。

在线尝试。

说明:

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个字节

JezWqezJ=Pz=hZ)K@sh.MsZzZqKsK

测试套件

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))
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.