七十七七


19

给定一个数n和上限值l的列表,可以由两个或多个数字组成的相乘来创建的数字仅第七集长度的n是小于或更少lA161145即将解决此挑战,但是,您将不包括7、77、777、7777、77777等。

例子

n=anything, l<49 会导致:

[]

n=1, l=49 会导致:

7*7=49

f(1,49)=[49]

n=1, l=343 会导致:

7*7   =49
7*7*7 =343

f(1,343)=[49,343]

n=2,l=6000 会导致:

7*7    =49
7*7*7  =343
7*7*7*7=2401
7*77   =539
7*7*77 =3773
77*77  =5929

f(2,6000)=[49,343,539,2401,3773,5929]

n=3, l=604000 会导致:

[49, 343, 539, 2401, 3773, 5439, 5929, 16807, 26411, 38073, 41503, 59829, 117649, 184877, 266511, 290521, 418803, 456533, 603729]

等等...

规则

  1. 不必输出中间步骤,这样做是为了清楚起见。
  2. 输出可以是数组,也可以由任何字符(甚至换行符)分隔。
  3. 输出必须是数字顺序,从最低到最高。
  4. 为了使标题相关,n必须处理的最高级别是n=77(如果不能处理那么高,请注意原因-语言限制是可以接受的,懒惰是不可接受的)。此限制将阻止那些希望在内存中构建整个超集的人。
  5. 如果TIO无法n=77为您的代码运行,请说明要实现什么规范n=77
  6. 为了使产品有效,它必须至少包含2个数字。
  7. 这是最低字节数,将被认为是胜利的。
  8. 您可以选择列表以包含小于l或小于/等于的项目l
  9. 奖励:如果您的代码正好是77个字节,请告诉我;我一文不值。

我无法解析“列出可以通过将两个或多个数字相乘而得到的数字,这些数字仅由长度n小于或等于7的数字组成l
xnor

某些数字输出不止一次是否可以接受?
数学迷

规则5是非常没有意义的,将任意代码运行给予n=77l=7**7**7,例如?
乔纳森·艾伦,

1
我们可以假设结果不会为空吗?
泰特斯

@乔纳森·艾伦真的。
魔术章

Answers:


1

05AB1E,19个字节

L7×1¸ì©IF®âPD²‹Ïê®K

在线尝试!

说明

效率很低。TIO链接执行ceil(l^(1/7))迭代,而不是l高尔夫球版本中使用的迭代,以更轻松地测试大型测试用例。

L7×                   # create the list ['7', '77', '777' ...] 
                      # with the final item having n 7's 
   1¸ì©               # prepend a 1 and store a copy in register
       IF             # l times do:
         ®â           # cartesian product between current list and the list in register 
           P          # product of each sublist
            D²‹Ï      # keep only numbers smaller than l
                ê     # remove duplicates and sort
                 ®K   # remove 1, 7, 77, 777 ... from the list

$L7ׂ˜-尝试获取5个字节,不能。
魔术章鱼缸

@carusocomputing:是的,我觉得6个字节太多了,但是我真的看不到更短的方法。我希望您能用一种更短的方法来教育我;)
艾米娜(Emigna

我想.p还是.s太多,但即使是那些看起来更长。我不小心用示例实现而不是运行在TIO页面上单击“刷新”,将其删除。我认为是26岁。
魔术章鱼缸

1
@carusocomputing:这就是为什么您应该始终定期按链接按钮的原因。请勿通过刷新或重新引导计算机来松动任何物品。虽然有点令人
不快的

7

果冻21 20 19 18字节

R7ẋḌµ;ŒċP€⁹f€FµÐLḟ

请注意,输出与OP的输出不匹配。我已发表评论。

在线尝试!

怎么运行的

R7ẋḌµ;ŒċP€⁹f€FµÐLḟ  Main link. Left argument: n. Right argument: l

R                   Range; yield [1, ..., n].
 7ẋ                 Times; yield [[7], ..., [7] * n].
   Ḍ                Undecimal; yield s := [7, 77, ...].
    µ         µÐL   Begin a new chain with argument s and call the chain between 
                    until the results no longer chain.
                    Return the last unique result.
      Œċ            Combinations; return all unordered pairs in integers in the
                    return value.
     ;              Concatenate the return value and its pairs.
        P€          Take the product of each individual integer and each pair in
                    the result.
          ⁹f€       Filter each; for each j in [1, ..., l], intersect [j] with the
                    array of products. The result is sorted and contains no 
                    duplicates.
                 ḟ  Filterfalse; remove the elements of s from the result.

6

Python 2中116个 113 109字节

n,l=input()
r=t={1}
exec't|={10**n/9*7};n-=n>1;r=r|{x*y for x in r for y in t if l/x/y};'*l
print sorted(r-t)

请注意,TIO没有足够的内存来存储最后一个测试用例。

在线尝试!


4

的JavaScript(ES6),103个 101字节

以currying语法接受输入(n)(l)

n=>l=>(a=[],g=(n,m,p,i)=>(p>l||g(n,m,(a[i>1?p:a]=p)*m,-~i),--n?g(n,m+7,p,i):a.filter(n=>n)))(n,'7',1)

测试用例

最后一个测试用例可能需要几秒钟才能完成。


4

PHP,142字节

$r=[];for([,$n,$l]=$argv;$n--;)f($v[]=$z.=7);function f($t){global$v,$l,$r;while($c=$t*$v[+$i++])$l<$c?:f($c)&$r[$c]=$c;}sort($r);print_r($r);

-5字节删除 $r=[];并替换sort($r);@sort($r);

在线版本

展开式

递归函数进行所有排列,包括极限

$r=[];
for([,$n,$l]=$argv;$n--;)
  f($v[]=$z.=7);
function f($t){
    global$v,$l,$r;
    while($c=$t*$v[+$i++])
      $l<$c?:f($c)&$r[$c]=$c;
}
sort($r);
print_r($r);

PHP,145字节

for([,$n,$l]=$argv;$n;)$t[]=str_pad(7,$n--,7);for(;$l>=$i+=49;$v>1?:$u[]=$r)for($v=$i,$r=!$c=0;$d=$t[$c];)$v%$d?$c++:($v/=$d)&$r*=$d;print_r($u);

展开式

循环直到包括极限检查每个可被49整除的值

for([,$n,$l]=$argv;$n;)
  $t[]=str_pad(7,$n--,7);
for(;$l>=$v=$i+=49;$v>1?:$u[]=$r)
  for($r=!$c=0;$d=$t[$c];)
    $v%$d?$c++:($v/=$d)&$r*=$d;
print_r($u);

在线版本

再增加几个字节,就可以创建一个关联数组,键为数字,而值则为所使用的7的数组

for([,$n,$l]=$argv;$n;)
  $t[]=str_pad(7,$n--,7);
for(;$l>=$v=$i+=49;$v>1?:$u[array_product($r)]=$r)
  for($r=[],$c=0;$d=$t[$c];)
    $v%$d?$c++:($v/=$d)&$r[]=$d;
print_r($u);

在线版本


while($c=$t*$v[+$i++])$l<$c?f($c)&$r[$c]=$c;节省3个字节;但这应该是$l<=$c$r?sort($r)&print_r($r):0;代替$r=[];保存一个。
泰特斯

1
$z.=7;比短5个字节$z=$z*10+7;
泰特斯

并且@比短4个字节$r?...:0;。(感谢@Christoph)
泰特斯

@Titus为什么会这样$l<=$c?昨天似乎不是我需要的$z.=7和我发现的另外2个字节。我首先考虑您的其他两个建议。你错过了:在while循环
约尔格Hülsermann

我已要求OP进行澄清。在描述中他谈论结果that are less than l,在例子中他们谈论结果are less than or equal。根据说明,$c>$l||.../ $c>$l?:...$c<$l&&...最短。
泰特斯(Titus),

4

Ruby,89 86个字节

递归解决方案。

记住0到0的所有值是-3个字节。

f=->n,l,b=1{n*l>0?(f[n,l/k=eval(?7*n),b*k]+f[n-1,l,b]+(b>1&&l>=k ?[k*b]:[])).sort: []}

在线尝试!


3

Pyth,22个字节

JsM._*\7Eu@s*LR+JGJSQJ

JsM._*\7E
        E               second input
     *\7                repeat "7" as many times as the above
   ._                   all prefixes of above
 sM                     convert each to integer
J                       store list as J

         u@s*LR+JGJSQJ
         u              repeat the following until results not unique
                     J  starting from G = J
                        at each iteration, G is the current value
               +JG      append G to J
                  J     J
            *LR         multiply the elements of the above two, vectorizing each
           s            flatten list
          @        SQ   intersect with [1,2,3,...,first input]
                        this takes elements from [1,2,3,...,first input] and
                        check if each element is in the previous list
                        which ensures the result is sorted and unique

在线尝试!

眼镜

  • 输入: l[newline]n
  • 输出: array containing the sorted result

3

PHP,128个125 130 129 127 123字节

最多可使用22 7s,但会取整更大的值(7 ** 23是64位计算机上的浮点数)。

Jörg保存了3个字节,我保存了3个字节,添加了5 4 1以避免警告结果为空。

for([,$c,$z]=$argv,$n=$c+1;$c<$z;$p<$z&&$r[$p]=$p)for($b=$c+=$p=1;$b|0;$b/=$n)$p*=str_pad(7,$b%$n,7);@sort($r);print_r($r);

从命令行参数获取输入;运行-nr在线尝试

分解

for([,$c,$z]=$argv,$n=$c+1;         # $z=L, $n=N+1
    $c<$z;                          # loop $c from N to L-1:
    $p<$z&&$r[$p]=$p                    # 2. if product is < L, add to array
)                                       #    (key=val to avoid duplicates)
    for($b=$c+=$p=1;$b|0;$b/=$n)        # 1. loop $b through ++$c as base-N+1 number
        $p*=str_pad(7,$b%$n,7);             # take each base-N+1 digit as length
                                            # for a streak of 7s as factor
        // (str_pad is 1 byte shorter than str_repeat and saves 3 by ensuring positive $p)
@sort($r);                          # sort array (muted to avoid warning for empty result)
print_r($r);                        # print array

1
for([,$c,$z]=$argv,$n=1+$c;$c<$z;而不是for($n=1+$c=$argv[1];$c<$z=$argv[2];
约尔格Hülsermann

1
使用@而不是$r&&抑制警告?$p<$z&&$r[$p]=$p
Christoph'Apr

我只是注意到应该$p>$z?:$r[$p]=$p从示例中n=1, l=343很明显地l应该将其包括在内。因此,使用$p>$z||$r[$p]=$p或时那里没有节省$p>$z?:$r[$p]=$p
克里斯多夫

1
@Christoph我要求OP进行澄清。谢谢你提醒我@; OP回复时将进行编辑。
泰特斯

1
@Christoph似乎都还好;它doesn't真正的问题羯羊$p>$z||$p<$z&&。我会坚持描述。
泰特斯(Titus)

3

Brachylog,28个字节

h>.ḋ{p~c×ᵐ{=h7&l}ᵐobt≤~t?∧!}

在这里,语言本身有很多改进的余地。我写的很多东西看起来似乎可以通过对语言设计的一些更改而改进。这是我在当前版本中找到的最短方法。我可能会为Brachylog提出一些建议,这将使该程序更高效,更短且更具可读性。

非常非常慢;即使在最简单的简单回答中,TIO也会超时,因此提供TIO链接没有太多意义。我已经通过在本地运行该程序来验证了该程序。

这是一个函数(不是完整的程序),其输出是一个生成器(与列表相对)。.w⊥如果要查看所有输出,而不只是第一个,请添加到函数的末尾。(请注意,实际上这并不重要,因为无论如何该程序对于TIO而言都太慢,您必须在本地运行它,而本地Brachylog解释器在REPL中运行,可以很好地描述生成器。)

说明

h>.ḋ{p~c×ᵐ{=h7&l}ᵐobt≤~t?∧!}
  .                           The desired output is
h>                            a number less than the first input
   ḋ p                        such that taking its prime factors in some order,
      ~c                      partitioning them,
        ×ᵐ                    and taking the product of each partition
          {     }ᵐ            produces a number for which each digit
           =h7                is composed only of 7s
              &l              and for which the lengths of those numbers
                  o           are in sorted order
                    t         and the last element
                   b          (which is not also the first element)
                     ≤        is less than or equal to
                      ~t?     the last input.
                         ∧    (Delete an unwanted implicit constraint.)
   ḋ{                     !}  Output each number only once.

2

Bash + GNU实用程序,108

seq -f3o%gp $2|dc|sed -r "/0|1{$1}/d;s/./&7/g;s/1//g;s/2/*/g;/[*]/!d;s/^/a=7/;s/$/;if(a<=$2)a;/"|bc|sort -un

在线尝试。最后一个测试用例的TIO大约需要一分钟。我的结果与 @Dennis的相符


1

Pyth- 57 51 49 42字节

FY}2eQKYJv*\7hQWJIqYJBW!%KJ=/KJ)=/JT)Iq1KY

尝试一下


2
欢迎来到PPCG!有许多可用的快捷方式,它们可以将您的代码减少很多字节。如果您想了解更多信息,可以进入我们的聊天室并ping me。
尼姑

1
不幸的是,您当前的程序无法生成正确的结果,即它包含777用于您的当前输入。
Leaky Nun

1
减少字节的方法包括:使用m代替FV等(功能编程与执行控制);用hQ代替@Q0; 用eQ代替@Q1; 使用i*hQ]7T代替长的for循环来生成777...7
Leaky Nun

@LeakyNun非常感谢您的建议和聊天室链接。另外,我修复了它。
玛利亚
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.