有点紧张․․․


18

输入:

我们接受两个输入:

  • b具有两个不同值的输入:LeftRight
  • 和一个正整数n

输出:

基于向左/向右输入,我们输出范围内的以下两个序列之一1-n(在显示前125个项目的序列以下):

Left:
1, 6, 7, 56, 57, 62, 63, 960, 961, 966, 967, 1016, 1017, 1022, 1023, 31744, 31745, 31750, 31751, 31800, 31801, 31806, 31807, 32704, 32705, 32710, 32711, 32760, 32761, 32766, 32767, 2064384, 2064385, 2064390, 2064391, 2064440, 2064441, 2064446, 2064447, 2065344, 2065345, 2065350, 2065351, 2065400, 2065401, 2065406, 2065407, 2096128, 2096129, 2096134, 2096135, 2096184, 2096185, 2096190, 2096191, 2097088, 2097089, 2097094, 2097095, 2097144, 2097145, 2097150, 2097151, 266338304, 266338305, 266338310, 266338311, 266338360, 266338361, 266338366, 266338367, 266339264, 266339265, 266339270, 266339271, 266339320, 266339321, 266339326, 266339327, 266370048, 266370049, 266370054, 266370055, 266370104, 266370105, 266370110, 266370111, 266371008, 266371009, 266371014, 266371015, 266371064, 266371065, 266371070, 266371071, 268402688, 268402689, 268402694, 268402695, 268402744, 268402745, 268402750, 268402751, 268403648, 268403649, 268403654, 268403655, 268403704, 268403705, 268403710, 268403711, 268434432, 268434433, 268434438, 268434439, 268434488, 268434489, 268434494, 268434495, 268435392, 268435393, 268435398, 268435399, 268435448, 268435449

Right:
1, 4, 7, 32, 39, 56, 63, 512, 527, 624, 639, 896, 911, 1008, 1023, 16384, 16415, 16864, 16895, 19968, 19999, 20448, 20479, 28672, 28703, 29152, 29183, 32256, 32287, 32736, 32767, 1048576, 1048639, 1050560, 1050623, 1079296, 1079359, 1081280, 1081343, 1277952, 1278015, 1279936, 1279999, 1308672, 1308735, 1310656, 1310719, 1835008, 1835071, 1836992, 1837055, 1865728, 1865791, 1867712, 1867775, 2064384, 2064447, 2066368, 2066431, 2095104, 2095167, 2097088, 2097151, 134217728, 134217855, 134225792, 134225919, 134471680, 134471807, 134479744, 134479871, 138149888, 138150015, 138157952, 138158079, 138403840, 138403967, 138411904, 138412031, 163577856, 163577983, 163585920, 163586047, 163831808, 163831935, 163839872, 163839999, 167510016, 167510143, 167518080, 167518207, 167763968, 167764095, 167772032, 167772159, 234881024, 234881151, 234889088, 234889215, 235134976, 235135103, 235143040, 235143167, 238813184, 238813311, 238821248, 238821375, 239067136, 239067263, 239075200, 239075327, 264241152, 264241279, 264249216, 264249343, 264495104, 264495231, 264503168, 264503295, 268173312, 268173439, 268181376, 268181503, 268427264, 268427391

您问这些序列是如何产生的?

从1到默认序列n=10为:

As integer:
1, 2, 3, 4, 5, 6, 7, 8, 9, 10

As binary:
1 10 11 100 101 110 111 1000 1001 1010

当我们向左伸展时,二进制文件将变为:

1, 110, 111, 111000, 111001, 111110, 111111, 1111000000, 1111000001, 1111000110

为什么?最后一位仅使用一次;单-使用两次;倒数第二次使用了3次;等等

So `1010` will become (spaces added as clarification): `1111 000 11 0`

这些新的向左拉伸的二进制字符串将转换回整数:

1, 6, 7, 56, 57, 62, 63, 960, 961, 966

至于右延伸,第一位只使用一次;第二次 第三三遍;像这样:

As binary:
1, 100, 111, 100000, 100111, 111000, 111111, 1000000000, 1000001111, 1001110000

As integer:
1, 4, 7, 32, 39, 56, 63, 512, 527, 624

挑战规则:

  • 您可以采用任意两个不同的值,但请说明使用哪个。因此,它可以是1/0true/falsenull/undefined"left"/"right",等。
  • n 始终大于0。
  • 您应支持的最大输出量至少为您语言的默认整数(大多数语言为32位)。
  • 输出格式灵活。可以打印或作为数组/列表返回。可以使用空格,逗号,管道等作为分隔符。你的来电。(再次,请说明您的使用习惯。)

通用规则:

  • 这是,因此最短答案以字节为单位。
    不要让代码高尔夫球语言阻止您发布使用非代码高尔夫球语言的答案。尝试针对“任何”编程语言提出尽可能简短的答案。
  • 标准规则适用于您的答案,因此您可以使用STDIN / STDOUT,具有正确参数的函数/方法和返回类型的完整程序。你的来电。
  • 默认漏洞是禁止的。
  • 如果可能的话,请添加一个带有测试代码的链接。
  • 另外,如有必要,请添加说明。

1
您是否考虑接受只能支持的基于位的答案n < 128,以使结果适合32位整数?
Arnauld

@Arnauld对此表示怀疑,但是既然您问了,为什么不呢。会将最大1000条规则更改为适合您语言整数的规则。
凯文·克鲁伊森

@KevinCruijssen仍建议将其限制为至少16位-至少有一种语言仅支持一位作为数据类型。

Answers:




5

05AB1E14 13字节

多亏了Erik the Outgolfer,节省了1个字节

LbεIiRƶRëƶ}JC

1为左。
0(或其他任何权利)。

在线尝试!

说明

L                # push range [1 ... first_input]
 b               # convert to binary
  ε              # apply to each
   Ii            # if second_input is true
     RƶR         # reverse, multiply each element with its 1-based index and reverse again
        ëƶ       # else, multiply each element with its 1-based index
          }      # end if
           J     # join
            C    # convert to base-10

2
您可以使用ε-1:LbεIiRƶRëƶ}JC
暴民埃里克(Erik the Outgolfer)

@EriktheOutgolfer:使用的好主意ë。解决if这种情况下的申请问题:)
Emigna

3

外壳,13个字节

mȯḋṠṘo?ḣṫ⁰Lḋḣ

那是很多点缀的字母...

首先b0左和1右),然后n在线尝试!

说明

mȯḋṠṘo?ḣṫ⁰Lḋḣ  Inputs b=1 and n=5 (implicit).
            ḣ  Range to n: [1,2,3,4,5]
mȯ             Map function over the range:
                 Argument: number k=5
           ḋ     Binary digits: [1,0,1]
   ṠṘ            Repeat each digit with respect to the list
     o    L      obtained by applying to the length (3) the function
      ?  ⁰       if b is truthy
       ḣ         then increasing range: [1,2,3]
        ṫ        else decreasing range: [3,2,1].
                 We get [1,0,0,1,1,1].
  ḋ              Convert back to integer: 39
               Final result [1,4,7,32,39], implicitly print.

您可能会选择b直接取ḣ或as来保存三个字节:)
Leo

@Leo Hmm,那有点滑。我也可以采用整个程序的两个版本之一,b而我的解决方案只是I...
Zgarb

3

Japt19 18 17字节

0为“左”,1为“右”。(实际上,它可以使用任何虚假或真实的值代替那些2。)

õȤËpV©EĪEnFlÃn2

测试一下


说明

整数U&的隐式输入V

õ

创建一个从1到的整数数组(包括1和2 U)。

È

通过一个函数传递每个。

¤

将当前整数转换为二进制字符串

Ë           Ã

在字符串上映射,将每个字符传递给一个函数,其中,E是当前索引,F是完整的字符串。

p

重复当前字符

V©  ª

©是逻辑AND(&&)和ª逻辑OR ||,因此在这里我们检查是否V为真(非零)。

如果V是真实的话,那么X就会重复Y+1一次。

YnZl

如果V为假,则X重复Y从(n)中减去长度(lZ

n2

转换回以10为底的整数。

隐式输出结果数组。


在我意识到它是“前n个项目”而不是“ n个项目”之前,我降到了16岁,所以这还不错:P
ETHproductions

@ETHproductions:您不是唯一一个犯该错误的人;)
毛茸茸的

2

盖亚(Gaia),15个字节

⟪¤bw¦¤;ċ%׆_b⟫¦

用途-1为左,1右。

在线尝试!

说明

⟪¤bw¦¤;ċ%׆_b⟫¦  Map this block over the range 1..n, with direction as an extra parameter:
 ¤                Swap, bring current number to the top
  b               List of binary digits
   w¦             Wrap each in a list
     ¤            Bring direction to the top
      ;ċ          Push the range 1..len(binary digts)
        %         Select every direction-th element of it (-1 reverses, 1 does nothing)
         ׆       Element-wise repetition
           _      Flatten
            b     Convert from binary to decimal

2

质子,79字节

n=>d=>[int(''.join(b[x]*[l-x,x-1][d]for x:2..(l=len(b=bin(i)))),2)for i:1..n+1]

0是左,1是右。

在线尝试!

不打高尔夫球

f=n=>d=>                        # Curried function
[                               # Collect the results in a list
 int(                           # Convert from a binary string to an int:
  ''.join(                       # Join together
   b[x]                           # Each character of the binary string of n
   *[l-x,x-1][d]                  # Repeated by its index or its index from the end, depending on d
   for x:2..(l=len(b=bin(i))))    
 ,2)
 for i:1..n+1                   # Do this for everything from 1 to n inclusive
]

2

C#(.NET核心)192个 187 + 23字节

-5个字节,感谢TheLethalCoder

b=>n=>new int[n].Select((_,a)=>{var g=Convert.ToString(a+1,2);return(long)g.Reverse().SelectMany((x,i)=>Enumerable.Repeat(x,b?i+1:g.Length-i)).Select((x,i)=>x>48?Math.Pow(2,i):0).Sum();})

字节数还包括:

namespace System.Linq{}

在线尝试!

输入:leftis truerightisfalse

说明:

b => n =>                                   // Take two inputs (bool and int)
    new int[n].Select((_, a) => {           // Create new collection the size of n
        var g = Convert.ToString(a + 1, 2); // Take every number in sequence 1..n and convert to base 2 (in a string)
        return (long)g.Reverse()            // Reverse the bits
               .SelectMany((x, i) =>        // Replace every bit with a collection of its repeats, then flatten the result
                   Enumerable.Repeat(x, b ? i + 1 : g.Length - i))
               .Select((x, i) => x > 48 ? Math.Pow(2, i) : 0)
               .Sum();                      // Replace every bit with a corresponding power of 2, then sum
    })


185 + 23 ^(评论太长)
TheLethalCoder

@TheLethalCoder谢谢!但不幸的是,它是187,因为我们需要将1添加到索引中,因为它从0开始,序列从1开始
格热戈日Puławski

是不是using System.Linq;比短namespace System.Linq{},还是我失去了一些东西?很久以前我编程.NET TBH ..
凯文Cruijssen

1
@KevinCruijssen会使用这两个方法,Math并且Convert这两个方法都在System名称空间中,因此进行namespace System.Linq操作最短-它允许同时使用SystemSystem.Linq类。
GrzegorzPuławski17年

2

Dyalog APL,23个字节

{2⊥b/⍨⌽⍣⍺⍳≢b←2⊥⍣¯1⊢⍵}¨⍳

左边是1右边0(作为函数的左边参数传递)

是索引生成器

{... 将功能括在括号中以应用于右侧的每个项目

b←2⊥⍣¯1⊢⍵b被编码为二进制(使用解码的反函数来获取以2为基数表示所需的最小位数)

⍳≢b生成向量b的索引(≢b是b的长度)

⌽⍣⍺反向时间(此处有条件地用于左或右拉伸)

b/⍨ b复制者(根据(反向)索引复制位)

2⊥ 从基数2解码

TryAPL在线


2

JavaScript(ES6),131个字节

这比Shaggy的答案要长得多,但是我想尝试一种纯粹的按位方法。

由于JS按位操作的32位限制,因此仅适用于n <128

以currying语法进行输入(n)(r),其中r对左是虚假/对右是虚假。

n=>r=>[...Array(n)].map((_,n)=>(z=n=>31-Math.clz32(n),g=n=>n&&(x=z(b=n&-n),r?2<<z(n)-x:b*2)-1<<x*(r?2*z(n)+3-x:x+1)/2|g(n^b))(n+1))

格式化和评论

n => r => [...Array(n)]       // given n and r
  .map((_, n) => (            // for each n in [0 .. n - 1]
    z = n =>                  //   z = helper function returning the
      31 - Math.clz32(n),     //       0-based position of the highest bit set
    g = n =>                  //   g = recursive function:
      n && (                  //     if n is not equal to 0:
        x = z(b = n & -n),    //       b = bitmask of lowest bit set / x = position of b
        r ?                   //       if direction = right:
          2 << z(n) - x       //         use 2 << z(n) - x
        :                     //       else:
          b * 2               //         use b * 2
      ) - 1                   //       get bitmask by subtracting 1
      << x * (                //       left-shift it by x multiplied by:
        r ?                   //         if direction = right:
          2 * z(n) + 3 - x    //           2 * z(n) + 3 - x
        :                     //         else:
          x + 1               //           x + 1
      ) / 2                   //       and divided by 2
      | g(n ^ b)              //     recursive call with n XOR b
    )(n + 1)                  //   initial call to g() with n + 1
  )                           // end of map()

演示版


好的,我对我的时长有所了解,因为您正在寻找一个更长的解决方案,而不是一个更短的解决方案。
毛茸茸的

1
(待OP的批准)。 “批准:)从我+1。
凯文·克鲁伊森

2

JavaScript(ES6),113个字节

哦,这太久了!当您花一天时间编写“真实的” JavaScript时,就会发生这种情况,孩子们;您会忘记正确打高尔夫球!

使用的任何真实或错误值b,分别false为“左”和true“右”。

n=>b=>[...Array(n)].map(_=>eval("0b"+[...s=(++e).toString(2)].map((x,y)=>x.repeat(b?++y:s.length-y)).join``),e=0)

尝试一下

o.innerText=(f=
n=>b=>[...Array(n)].map(_=>eval("0b"+[...s=(++e).toString(2)].map((x,y)=>x.repeat(b?++y:s.length-y)).join``),e=0)
)(i.value=10)(j.value=1);oninput=_=>o.innerText=f(+i.value)(+j.value)
label,input{font-family:sans-serif;font-size:14px;height:20px;line-height:20px;vertical-align:middle}input{margin:0 5px 0 0;width:100px;}
<label for=i>Size: </label><input id=i type=number><label for=j>Direction: </label><input id=j min=0 max=1 type=number><pre id=o>



1

视网膜,111字节

\d+
$*
1
$`1¶
+`(1+)\1
${1}0
01
1
.
$.%`$*R$&$.%'$*L
+s`(R?)(\d)(L?)(.*¶\1\3)$
$2$2$4
¶*[RL]

1
01
+`10
011
%`1

在线尝试!取数字和一个LR作为后缀(或在单独的行上)。说明:

\d+
$*
1
$`1¶

从十进制转换为一进制,并从1转换为n

+`(1+)\1
${1}0
01
1

从一元转换为二进制。

.
$.%`$*R$&$.%'$*L

根据行中的位置包装每个位RL字符。

+s`(R?)(\d)(L?)(.*¶\1\3)$
$2$2$4

用相应的相邻数字替换相关字符RL字符。

¶*[RL]

1
01
+`10
011
%`1

删除剩余的字符,然后从二进制转换为十进制。


1
嗨,您必须输出从1到的所有数字n。不只是n数字。
凯文·克鲁伊森

@KevinCruijssen Bah,我的不足100字节计数...
Neil

1

JavaScript(ES6), 130 127字节

3个字节,谢谢凯文

我肯定对这个站点不了解足够的ES6,但是我尝试了!遍历每个数字,并遍历该数字的每个二进制表示形式,但是重复每个字符需要多次。

d=>n=>{i=0;while(i++<n){b=i.toString(2),s="",k=-1,l=b.length;while(++k<l)s+=b[k].repeat(d?k+1:l-k);console.log(parseInt(s,2))}}

f=d=>n=>{i=0;while(i++<n){b=i.toString(2),s="",k=-1,l=b.length;while(++k<l)s+=b[k].repeat(d?k+1:l-k);console.log(parseInt(s,2))}}
f(1)(10)
f(0)(10)


1
向我+1。:)我认为您可以通过使用周期性输入(d=>n=>)来保存字节,就像其他两个JS ES6答案所做的那样。另外,我认为您可以通过将更k=-1,l=b.length;while(++k<l)s+=b[k].repeat(d?k+1:l-k);改为来节省另外2个字节k=0,l=b.length;while(k<l)s+=b[k++].repeat(d?k:l+~k);(以k=0代替-1l-k-1然后将缩短为l+~k)。此外,圆括号是否在(i).toString(2)必需的位置?
凯文·克鲁伊森

1
+~k好像它应该工作,但我无法弄清楚,保持惹毛了。感谢其他提示!
Sven

1
哎呀,这l+~k是不正确的,因为不是,l-k-1但是l-k+1..我的糟糕。不过,您仍然可以通过k从零开始高尔夫1个字节k=0,l=b.length;while(k<l)s+=b[k++].repeat(d?k:l-k+1);
凯文·克鲁伊森

1

Ruby,98个字节

->n,r{t=->a{r ?a:a.reverse};(1..n).map{|k|i=0;t[t[k.to_s(2).chars].map{|d|d*(i+=1)}].join.to_i 2}}

三元空间是否a{r ?a:a.reverse}必要?
凯文·克鲁伊森

2
是。Ruby方法可以以结尾?r?将被解释为方法名称。
m-chrzan

好的,谢谢您的解释。从未使用Ruby进行编程,但是如果我在Java(或C#)中使用它,它看起来就像是普通的三元代码,因此我要发表评论。
凯文·克鲁伊森

1

Java 8,136字节

Lambda(咖喱)从Boolean到的消费者Integer。布尔参数指示是否向左延伸(值truefalse)。输出以标准输出输出,并以换行符分隔,并在尾随换行符。

l->n->{for(int i=0,o,c,d,s=0;i++<n;System.out.println(o)){while(i>>s>0)s++;for(o=c=0;c++<s;)for(d=0;d++<(l?s-c+1:c);o|=i>>s-c&1)o<<=1;}}

非高尔夫λ

l ->
    n -> {
        for (
            int i = 0, o, c, d, s = 0;
            i++ < n;
            System.out.println(o)
        ) {
            while (i >> s > 0)
                s++;
            for (o = c = 0; c++ < s; )
                for (
                    d = 0;
                    d++ < (l ? s - c + 1 : c);
                    o |= i >> s - c & 1
                )
                    o <<= 1;
        }
    }

在线试用

限度

由于它们以ints 累加,因此输出限制为31位。结果,输入被限制为7位,因此程序支持的最大输入为127。

说明

此解决方案使用按位运算建立每个扩展数。外循环遍历i要拉伸的数字,从1到n,并在每次迭代后打印拉伸的值。

内部while循环递增s到中的位数i,随后的for循环遍历c每个位的位置。在该循环中,d最多计数重复当前位的次数,具体取决于input l。在每一步中,o将其向左移,并将的适当位i屏蔽掉并进行或运算。

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.