阅读时间线


11

受到绘制时间线的启发。

给定事件的时间轴,输出每个事件的日期。

时间线将以以下形式给出

    2000
--AF-C-------E--D---B--

第一行显示已知时间点。已知年份始终是已知年份第一位以下的字符

您可以假设:

  • 在时间轴上,每个字符代表一年。
  • 总会有至少一个事件
  • 事件不一定要井井有条
  • 您可能会假设范围内的每个字符A以及距离最远的字符都存在
  • 最多会有26个活动
  • 已知点在右边将没有任何填充
  • 已知点和输出中都可以有负数
  • 您将不必处理大于2 ^ 32的数字
  • 您将不必处理大于2 ^ 8的范围
  • 您可以输入小写字母而不是大写字母

您应该编写一个采用这种时间表的程序,并按顺序输出关键日期(A,B,C,D ...)

您可以以方便的形式输出,但必须以给定的格式进行输入。

测试用例:

    2000
--AF-C-------E--D---B--
[1998, 2016, 2001, 2012, 2009, 1999]

     10
--C-AB--D
[9, 10, 7, 13]

     0
--ABCDEFG--
[-3, -2, -1, 0, 1, 2, 3]

          5
--ABCDEFG--
[-3, -2, -1, 0, 1, 2, 3]

1
...以给定的格式输入。那是?带有换行符的单个字符串?还是2串?
edc65 '16

1
2个字符串或带换行符的字符串
蓝色

Answers:


1

Pyth,16个字节

将输入作为小写字母而不是大写字母。

VS@GJw+-sz/zdxJN

2

05AB1E19 18字节

码:

ð¢>UágF²N>.bkX-¹+,

说明:

ð¢                   # Count the number of spaces before the year starts
  >                  # Increment by 1
   U                 # Pop and store this into X
    á                # Keep the alphabetic characters of the second input
     g               # Take the length
      F              # For N in range(0, length), do...
       ²             #   Take the second input
        N>           #   Push N and increment by 1
          .b         #   Converts 1 to A, 2 to B, etc.
            k        #   Find the index of that letter in the second input
             X       #   Push X
              -      #   index - X
               ¹     #   Get the first input, which contains the year
                +    #   Add to the difference of the index
                 ,   #   Pop and output the sum

在线尝试!

使用CP-1252编码。


1

JavaScript(ES6),72

(a,b,r=[])=>[...b].map((x,i)=>r[parseInt(x,36)-10]=+a+i-a.search`\\d`)&&r

测试

f=(a,b,r=[])=>[...b].map((x,i)=>r[parseInt(x,36)-10]=+a+i-a.search`\\d`)&&r

console.log=x=>O.textContent+=x+'\n'

;[['    2000','--AF-C-------E--D---B--'],
['     10','--C-AB--D'],
['     0','--ABCDEFG--'],
['          5','--ABCDEFG--']]
.forEach(t=>{
  var a=t[0],b=t[1],r=f(a,b)
  console.log(a+'\n'+b+'\n'+r+'\n')
})  
<pre id=O></pre>


1

Bash + coreutils,68岁

第1行输入为带引号的命令行选项,第2行从STDIN输入:

s="${1//[0-9]}"
fold -1|nl -v$[$1-${#s}]|sort -k2|sed '/-$/d;s/.$//'

1

Perl,58 +1 = 59字节

/\d/;$b=<>;for$c(A..Z){($z=index$b,$c)>-1&&say$_+$z-$-[0]}

分解:

/\d/;                    # Match first digit in input string, this will set $-[0]
$b=<>;                   # Read next line (--A--CB--...) into $b
for $c (A..Z){           # Iterate over A, B, C, ... Z
  ($z=index$b,$c) >-1 && # If the character is found inside $b
  say $_+$z-$-[0]        #   then print
}

要求-n和免费-M5.010

# Added line breaks for each test case
$ perl -nE'/\d/;$b=<>;for$c(A..Z){($z=index$b,$c)>-1&&say$_+$z-$-[0]}' tl
1998
2016
2001
2012
2009
1999

9
10
7
13

-3
-2
-1
0
1
2
3

-3
-2
-1
0
1
2
3
$ cat tl
    2000
--AF-C-------E--D---B--
     10
--C-AB--D
     0
--ABCDEFG--
          5
--ABCDEFG--

0

Pyth,22个字节

V+r\AJeSKwJ+xKN-izT/zd

不,我在发布挑战之前没有写这个。

说明:

                       - autoassign z = input()
 +r\AJeSKwJ            -  create range of letters
        Kw             -      autoassign K = input()
      eS               -     sorted(K)[-1] (get the biggest character)
     J                 -    autoassign J = ^
  r\A                  -   range("A", ^)
 +        J            -  ^ + J
V                      - for N in ^: V
               -izT/zd - Get the number at the start
                izT    -   int(z, 10)
               -       -  ^-V
                   /zd -   z.count(" ")
           +           - V+^
            xKN        -  K.index(N)

在这里尝试


0

Python 3、118

伙计,今天是冗长的Python回答之日。

def f(p,l):o=sum(x<'0'for x in p);e={x:i-o+int(p[o:])for i,x in enumerate(l)if'@'<x};return list(map(e.get,sorted(e)))

0

严重的是40个字节

' ,c,;)l@;±)@-(x@;╗@Z`i3╤τ+@┐`MX╜ú∩S`└`M

在线尝试!

进一步打高尔夫球后再进行解释。


0

Perl,80 79 71 67字节

($a=<>)=~/\d/;$b=<>;say$a+$_-$-[0]for grep{$_+1}map{index$b,$_}A..Z

感谢@ dev-null提供12个字节!

($a=<>)=~/\d/;  # read first line of input, find position of first digit
                # (saved in the $- variable)
$b=<>;          # read the second line
                                           A..Z  # generate range 'A','B',...
                            map{index$b,$_}      # find index for each
                  grep{$_+1}                     # select only those != -1
              for                                # foreach of remaining...
say$a+$_-$-[0]                                   # calculate proper date
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.