输出数字,或多或少


15

挑战

给定由<和组成的输入字符串(或数组)>,输出整数序列(数组或字符串),使得:

  • 在输出中的连续数字之间按顺序应用时,运算符都是正确的
  • 所有整数均为正数(1或更大)
  • 整数之和在数学上尽可能小

输入可以变化,以匹配所选语言中的“大于”和“小于”。

作为替代输出,只需指定输出中数字的总和即可。在“答案”标题中说明要解决的版本。

通常适用排除规则,以最小的字节数为准。

您可以假设输入字符串将永远不会导致您的语言出现整数溢出,如果有帮助的话。

例子

  • >使2 1该款项3
  • >>>使4 3 2 1该款项10
  • ><使2 1 2该款项5
  • 使1该款项1
  • >>>>>>>>>使10 9 8 7 6 5 4 3 2 1该款项55
  • >><<>><>>>使3 2 1 2 3 2 1 4 3 2 1该款项24
  • ><>><>><>使2 1 3 2 1 3 2 1 2 1该款项18
  • <<<<>使1 2 3 4 5 1该款项16
  • <<<<><<>使1 2 3 4 5 1 2 3 1该款项22
  • >><<使3 2 1 2 3该款项11

我们可以使用>和以外的符号<吗?
暴民埃里克(Erik the Outgolfer)'18年

@JonathanAllan我认为这是错误的示例,您应该假设在回答时,而不是说明是错误的。编辑:那么,恐怕它们是无效的,因为定义挑战的是规范,而不是测试用例。
暴民埃里克(Erik the Outgolfer)

4
只需等待<> <中的答案。
Khuldraeseth na'Barya

1
向所有人致歉,以免混淆示例!至于其他字符,可以,只要它们在您的语言中具有相同的含义即可
simonalexander2005年

3
@Scrooble您拼写错误。这是><>
Jo King

Answers:


3

果冻,19字节

0;+×¥@\
=”<µCṚÇṚ»Ç‘

在线尝试!

每个数字的值是最大(数目的>立即显示在其右侧<立即显示在其左边)+ 1


或者...

在线尝试!


我不喜欢需要像Stax这样的程序进行翻译的语言...好吧,Jelly处于临界点。(需要一个压缩字符串的程序)至少,Jelly仍然获胜。
user202729 '18


从美学上来说,我也不是很喜欢。但是我最喜欢打高尔夫球的一件事就是使程序最小的东西。我仍然对此有一些想法...
递归

8

> <>40 38字节

1v!rnr~<oa
?\i:0(?^3%\+$
{/?:-{:}-1/1:

在线尝试!

适当的语言。作为参考,><>其本身产生2,1,2,1。

怎么运行的:

1v   Initialise the stack as 1 and enter loop
 \i:0(?^  If we're out of input, go to the first line
        3%\ Otherwise mod the input by 3, yielding 0 for < and 2 for >
        -1/Subtract 1 to get -1 and 1 respectively
    -{:}   Copy the previous number and subtract the above from it

 /?:    If the number is not 0, repeat the loop

?\        \+$  Otherwise:
                Increment each number until we reach the original 0
{/        /1:   And enter the first loop again

      ~<    When we're out of input, pop the extra -1 from EOF
   rnr      Output the first number
1v!         Push a 1 
        oa  Print a newline and repeat, popping the extra 1 each time

+1表示语言本身具有什么价值。:)(而且因为它也是一个很好的答案,否则我将不会对其进行+1编辑。)
Kevin Cruijssen

5

Python 3,93个字节

k=0
for r in input().split('<'):p=len(r);print(max(k,p)+1,*range(p,0,-1),end=' ');k=1+(p<1)*k

在线尝试!

解读:

# offset, will be explained later
k = 0 
for run in input().split('<'):
    # p = length of sequence of '>'s, which will produce p+1 decreasing integers
    p = len(run)
    # will print:
    # p+1 p p-1 ... 1    or    k+1 p p-1 ... 1
    print(max(k, p) + 1, *range(p, 0, -1), end=' ')
    # offset of the next sequence: (i.e. -1 + the minimal value of the first integer)
    k = 1 + (k if p > 0 else 0)

1
这是我的第一次高尔夫!
Fons,

5

Haskell,119个字节

n%">"=r[1..n]
n%"<"=[1..n]
n%(c:b)|c==b!!0=(n+1)%b|a:s<-2%b,e:z<-r$n%[c]=r z++last(max:[min|c>'<'])a e:s
r=reverse
(2%)

在线尝试!

说明

这里的想法是我们有>s或<s的运行,每个运行都映射到上升和下降范围。因此,我们group将字符串分成连续的字符组。我们的工作是将它们以适当的方式缝合在一起。

当我们<>想要将两个列表缝合在一起时,以较大的最终值为例

<<<<<<>>

被分割

<<<<<<  >>

映射到范围

[1,2,3,4,5,6,7] [3,2,1]

然后,当我们缝合时,我们放下3它,因为它较小(3不大于7)。

 [1,2,3,4,5,6,7,2,1]

当我们><做相反的事情时,我们丢弃较大的值。

实际的代码是通过使运算符实现的%。的定义%非常复杂,但是基本上它是从左到右读取的,以跟踪多少个连续字符相同。这样做在左侧具有运算符的值。当我们到达字符变化的地方时,我们将按照我所描述的那样进行拼接。


最后一行的目的是什么(2%)
锡拉库扎

@siracusa这就是函数本身。这是一个无点功能,因此基本上将call %with 2作为第一个参数。
发布Rock Garf Hunter,

这是否只是将最后一个函数调用放在最后一行而不是添加完整main实现的一种常见做法?
锡拉库扎

1
@siracusa是的。允许以命名函数,匿名函数或完整程序的形式提交。这是一个匿名函数。我选择匿名仅仅是因为它是最短的。
发布Rock Garf Hunter,


4

视网膜0.8.2,36字节


1
{`\b(1+)>\1
1$&
}`(1+)<\1\b
$&1
1

在线尝试!链接包括测试用例。说明:


1

插入1年代以前,之间和之后<S和>秒。

{`\b(1+)>\1
1$&
}`(1+)<\1\b
$&1

重复递增整数,直到满足所有比较要求。

1

对整数求和,然后转换为十进制。


3

Java的10,198个 181字节

s->{var p=s.split("(?<=(.))(?!\\1)");int l=p.length,L[]=new int[l],i=l,r=0,a,b;for(;i-->0;r+=a*-~a/2-(i<l-1?p[i].charAt(0)<61?a<(b=L[i+1])?a:b:1:0))a=L[i]=p[i].length()+1;return r;}

在线尝试。

说明:

s->{                      // Method with String parameter and integer return-type
  var p=s.split("(?<=(.))(?!\\1)");
                          //  Split the String into parts
                          //  (i.e. ">><<>><>>>" becomes [>>, <<, >>, <, >>>])
  int l=p.length,         //  Get the amount of parts
      L[]=new int[l],     //  Create an integer-array of the same size
      i=l,                //  Index-integer, starting at this size
      r=0,                //  Result-integer, starting at 0
      a,b;                //  Two temp integers to reduce the byte-count
  for(;i-->0;             //  Loop downwards over the array; range: (`l`,0]
      ;r+=                //    After every iteration: increase the result with:
          a*-~a/2         //     The triangle number of the current item
        -(i<l-1?          //     If it's not the last item:
           p[i].charAt(0)<61?
                          //      And the order of the current and previous is "<>":
            a<(b=L[i+1])? //       If the current item in `L` is smaller than the previous:
             a            //        Subtract the current item
            :             //       Else (the current is equal or larger than the previous):
             b            //        Subtract the previous item
           :              //      Else (the order of the two parts is "><" instead):
            1             //       Subtract 1
          :               //     Else (it's the last item in `L`):
           0))            //      Leave the result `r` unchanged
    a=L[i]=               //   Set both `a` and the current item in `L` to:
     p[i].length()+1;     //    The length of the part + 1
  return r;}              //  Return the result


2

萨克斯,21个字节

éda╓~/└↨☺∟╒←║ç Γφ5←9h

运行并调试

它通过对输入进行游程编码,然后将生成的范围连接在一起来工作。拆开包装,松开包装并进行评论,看起来像这样。

|R      run-length encode
{       begin block
  H^R   range from [1 .. run length]
  _hh|1 -1 ** (character code / 2)
  *     multiply run; this will reverse it iff character is '>'
m       map runs using preceding block
O       push a 1 under the top of stack
{       begin block
  h|M   get the start of the generated range, and take max of it and top of stack
  _DE   push the rest (tail) of the generated range to the stack
F       foreach generated range
L|+     sum of all values on the stack

运行这个



1

红色,185字节

func[s][repeat n 1 + length? s[l: 0 i: n - 1 while[i > 0 and(s/(i) = #"<")][i:  i - 1 l: l + 1]r: 0 i: n while[(i <= length? s)and(s/(i) = #">")][i: i + 1 r:
r + 1]prin[1 + max l r""]]]

经过user202729的解释...

在线尝试!

f: func[s][
   repeat n 1 + length? s[
       l: 0
       i: n - 1
       while [i > 0 and (s/(i) = #"<")][ 
           i: i - 1
           l: l + 1
        ]
        r: 0
        i: n
        while [(i <= length? s) and (s/(i) = #">")][
            i: i + 1
            r: r + 1
        ]
        prin[1 + max l r ""]
    ]
]
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.