Eine Zeitleiste lesen

11

Inspiriert von Zeichnen Sie eine Zeitleiste .

Geben Sie anhand einer Zeitleiste mit Ereignissen das Datum für jedes Ereignis aus.

Eine Zeitleiste wird im Formular angegeben

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

Wo die erste Zeile einen bekannten Zeitpunkt zeigt. Das bekannte Jahr ist immer das Zeichen unter der ersten Ziffer des bekannten Jahres

Sie können annehmen:

  • Auf der Zeitachse selbst repräsentiert jedes Zeichen ein Jahr.
  • Es wird immer mindestens eine Veranstaltung geben
  • Die Ereignisse müssen nicht in Ordnung sein
  • Sie können davon ausgehen, dass jedes Zeichen im Bereich zwischen Aund das am weitesten entfernte Zeichen vorhanden ist
  • Es werden höchstens 26 Veranstaltungen stattfinden
  • Der bekannte Punkt hat rechts keine Polsterung
  • Sowohl am bekannten Punkt als auch am Ausgang können negative Zahlen vorhanden sein
  • Sie müssen keine Zahlen verarbeiten, die größer als 2 ^ 32 sind
  • Sie müssen keine Bereiche verarbeiten, die größer als 2 ^ 8 sind
  • Sie können Eingaben als Kleinbuchstaben anstelle von Großbuchstaben verwenden

Sie sollten ein Programm schreiben, das eine Zeitleiste in dieser Form verwendet und die Stichtage in der angegebenen Reihenfolge ausgibt (A, B, C, D ...).

Sie können in einer bequemen Form ausgeben, müssen jedoch Eingaben in dem angegebenen Format vornehmen.

Testfälle:

    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]
Blau
quelle
1
... Eingabe im angegebenen Format. Das ist? Eine einzelne Zeichenfolge mit einem Zeilenumbruch? oder 2 Saiten?
edc65
1
2 Saiten oder eine Saite mit einem Zeilenumbruch
Blau

Antworten:

1

Pyth, 16 Bytes

Übernimmt die Eingabe als Kleinbuchstaben anstelle von Großbuchstaben.

VS@GJw+-sz/zdxJN
drobilc
quelle
2

05AB1E , 19 18 Bytes

Code:

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

Erläuterung:

ð¢                   # 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

Probieren Sie es online aus!

Verwendet die CP-1252- Codierung.

Adnan
quelle
1

JavaScript (ES6), 72

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

Prüfung

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>

edc65
quelle
1

Bash + Coreutils, 68

Zeile 1 wird als Befehlszeilenoption in Anführungszeichen und Zeile 2 von STDIN eingegeben:

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

Perl, 58 + 1 = 59 Bytes

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

Nervenzusammenbruch:

/\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
}

Benötigt -nund kostenlos -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--
andlrc
quelle
0

Pyth, 22 Bytes

V+r\AJeSKwJ+xKN-izT/zd

Nein, ich habe dies nicht geschrieben, bevor ich die Herausforderung gepostet habe.

Erläuterung:

                       - 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)

Probieren Sie es hier aus

Blau
quelle
0

Python 3, 118

Mann, heute ist der Tag der langen Python-Antworten.

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)))
Morgan Thrapp
quelle
0

Im Ernst, 40 Bytes

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

Probieren Sie es online aus!

Erklärung später nach weiterem Golfen.

Mego
quelle
0

Perl, 80 79 71 67 Bytes

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

Danke an @ dev-null für 12 Bytes!

($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
Türknauf
quelle