查找相关的数字分组


14

最近,我的声誉是25,121。我注意到每个数字分组(即用逗号分隔的数字)都是一个完美的正方形。

您的挑战是,给定一个非负整数Ñ和一元布尔黑匣子功能 ˚Fž *,如果每个值产生truthy值˚F施加到的数字分组Ñ是truthy,和falsey否则。

您可以通过从右侧开始将数字分成3组来找到数字分组。最左边的组可以有1位,2位或3位数字。一些例子:

12398123  -> 12,398,123    (3 digit groupings)
10        -> 10            (1 digit grouping)
23045     -> 23,045        (2 digit groupings)
100000001 -> 100,000,001   (3 digit groupings)
1337      -> 1,337         (2 digit groupings)
0         -> 0             (1 digit grouping)

附加规则

  • 此函数可以映射到布尔值(例如truefalse),1s和0s或任何true / falsey值。请指定您的答案支持的格式。
  • 您可以采用整数作为输入,也可以采用整数字符串(即由数字组成的字符串)。
  • 您可以编写程序或函数。
  • 将数字组传递给函数f时,应修剪所有不必要的前导零。例如,当f应用于N = 123,000时,应将其作为f(123)和f(0)执行。

测试用例

函数符号是n -> f(n),例如,n -> n == 0。所有运算符均采用整数算术。(例如sqrt(3) == 1

function f
integer N
boolean result

n -> n == n
1230192
true

n -> n != n
42
false

n -> n > 400
420000
false

n -> n > 0
0
false

n -> n -> 0
1
true

n -> sqrt(n) ** 2 == n
25121
true

n -> sqrt(n) ** 2 == n 
4101
false

n -> mod(n, 2) == 0
2902414
true

n -> n % 10 > max(digits(n / 10))
10239120
false

n -> n % 10 > max(digits(n / 10))
123456789
true

如果我们无法将函数作为参数,是否可以假定函数定义为变量,并在程序中引用它?
Caird coinheringaahing

@cairdcoinheringaahing请阅读参考资料 黑盒函数的参考,特别是该。概括地说,是的,你可以,即使你的语言能够拍摄功能作为参数(AFAICT)
康纳尔奥布莱恩

输入可以为负吗?零?您谈论整数,但所有示例都是肯定的。我还建议包括一些需要处理000个分组的测试用例。
xnor

1
@ ConorO'Brien在那种情况下,您应该在测试用例中添加(n -> n > 0应用于0),因为大多数答案都失败了。
Asone Tuhid

1
@EriktheOutgolfer他们是[0]
Conor O'Brien

Answers:


4

果冻,5个字节

bȷÇ€Ạ

在线尝试!

命令行参数是数字。该函数所在行上方的行是程序其余部分的主行,即为每个组调用的代码。注意不要引用行在里面bȷÇ€Ạ这里使用的示例是第5个测试用例。



@AsoneTuhid不是;数字为0,其数字组列表为[0],因此将其映射到每个元素(0此处为单个),将列表变为[1],由于此列表的所有元素都是真实的,1因此将返回。请注意,如果我有数字组列表[],结果将不会改变,因为的所有元素[]都是真实的(虚假的真实)。但是,对于不同的程序,结果可能会有所不同,并且规则对此并不确定(要求OP)。
暴民埃里克(Erik the Outgolfer)

抱歉,我几乎不了解果冻。不错的解决方案。
Asone Tuhid

7

Brachylog,8个字节

ḃ₁₀₀₀↰₁ᵐ

在线尝试!

黑盒功能在第二行(或TIO上的“页脚”)上执行,并且从STDIN读取整数。打印true.false.相应地。

ḃ₁₀₀₀      Compute the base-1000 digits of the input.
     ↰₁ᵐ   Map the blackbox predicate over each digit. We don't care about the
           result of the map, but the predicate must succeed for each digit,
           otherwise the entire map fails.






3

JavaScript(ES6),40 36字节

f=>g=i=>f(i%1e3)&(i<1e3||g(i/1e3|0))

通过curry获取函数和值并返回0或1。编辑:感谢@Shaggy,节省了4个字节。


1000-> 1e3保存几个字节。可你替换&&&另一个字节?
毛茸茸的

@Shaggy是的,我认为这已经足够安全了。betseg的答案也一样吗?
尼尔

失败function_name(n=>n>0)(0)(返回true
Asone Tuhid

@AsoneTuhid谢谢,已修复。
尼尔

2

Pyth,9个字节

.AyMjQ^T3

在线尝试!(使用第三个测试用例)

假设黑盒函数名为y。您可以使用L(argument b:)声明这样的函数,如TIO所示。如果有时间,我将在以后实施所有测试用例。


2

Stax,8个字节

Vk|Eym|A

Stax程序没有函数调用或参数,因此我们将一块存储在Y寄存器中的块消耗并产生单个值。这可以在程序代码之前完成。

{...}Yd     store a block in the Y register that executes ...
Vk|E        get "digits" of input using base 1000
    ym      map "digits" to array using y as mapping function
      |A    all elements are truthy?

这是使用完美平方函数的示例





1

05AB1E,8个字节

₄вεI.V}P

在线尝试!

说明

₄в         # convert first input to base-1000
  ε   }    # apply to each element
   I.V     # execute second input as code
       P   # product of the resulting list

将数字作为输入的第一行,将函数作为第二行。
输出1为真实,0为虚假。


这不会在每个元素上执行代码,而是在整个列表上执行。
暴民埃里克(Erik the Outgolfer)

@EriktheOutgolfer:在大多数情况下,使用05AB1E的自动矢量化功能。我才意识到,它不会对工作QÊ虽然。我将恢复为8字节版本。
Emigna

仍然不是.V向量化,甚至没有将列表作为开始的参数。
暴民埃里克(Erik the Outgolfer)

@EriktheOutgolfer:我从来没有说过.V向量化。在我的链接的示例中为È
Emigna '18

实际上,Q并且Ê可以与矢量化一起工作,这与我之前提到的不同,但是使用自动矢量化将使这些命令映射到整个列表,这感觉超出了挑战的精神,因此我们需要ε
Emigna '18

1

Excel VBA,79个字节

一个匿名的VBE立即窗口函数,该函数接受输入(n作为range范围内的整数类型)[A1]和一个来自range的公共定义VBA函数的名称[B1]

t=1:n=[A1]:While n:t=t*-Application.Run(""&[B1],n Mod 1E3):n=Int(n/1E3):Wend:?t

使用范例

在这种情况下,在公共模块f()中定义了输入功能。

Public Function f(ByVal n As Integer) As Boolean
    Let f = (n Mod 2 = 0)
End Function

输入变量已设置。

[A1]=2902414    ''  Input Integer
[B1]="f"        ''  input function

然后调用立即窗口函数。

t=1:n=[A1]:While n:t=t*-Application.Run(""&[B1],n Mod 1E3):n=Int(n/1E3):Wend:?t
 1              ''  Function output (truthy)

1

Ruby,37个字节

g=->f,n{f[n%x=1000]&&(n<x||g[f,n/x])}

在线尝试!

递归lambda,采用函数和整数并返回布尔值。

36个字节(仅正n)

g=->f,n{n>0?f[n%k=1000]&&g[f,n/k]:1}

此版本返回1真实值,false错误值。不幸的是,当n = 0

在线尝试!


我认为您必须计算一下g=是否递归
Asone Tuhid

@AsoneTuhid哦,这很有道理。我会添加它。
benj2240

另外,尝试此操作(-1字节),它返回1为真实值
Asone Tuhid

那使我的大脑有些皱了……我不得不扭动一下,以说服自己在所有情况下都有效。谢谢!
benj2240 '18

我错了,这个版本不适用于g[->n{n>0},0](return true)。仅当输入0
为时

1

苹果种子,51字节

(lambda(n f)(all(map f(or(to-base 1000 n)(q(0))))))

匿名lambda函数,它接受一个数字和一个函数,并返回一个布尔值。

在线尝试!

(lambda (n f)         ; Function with parameters n and f
 (all                 ; Return true if all elements of this list are truthy:
  (map f              ; Map the function f to each element of
   (or                ; This list if it is nonempty:
    (to-base 1000 n)  ; Convert n to a list of "digits" in base 1000
    (q (0))           ; Or if that list is empty (when n=0), then use the list (0) instead
   ))))

1

加+,15字节

L,1000$bbbUª{f}

在线尝试!

需要功能 f在TIO标头中声明。

怎么运行的

D,f,@,0.5^i2^A=	; Declares a function 'f' to check if a perfect square
		; E.g. 25 -> 1; 26 -> 0

L,		; Declare the main lambda function
		; Example argument: 		[25121]
	1000$bb	; Convert to base 1000	STACK = [[25 121]]
	bUª{f}	; Is 'f' true for all?	STACK = [1]
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.