Sie sind Tom Sawyer und müssen einen 102400 m langen Zaun streichen. Zum Glück haben Ihre Freunde beschlossen, Ihnen beim Austausch verschiedener Dinge zu helfen. Jeder Freund wird malen L m, ausgehend von S mit Farbe C . S , L sind ganzzahlige Meter und 1 ≤ C ≤ 97. Wenn Sie sich langweilen, entscheiden Sie sich, herauszufinden, wie viele Meter jeder Farbe Sie haben.
Eingang
Die Eingabe wird von der Standardeingabe gelesen. Jede Zeile enthält drei Zahlen S , L , C wie oben beschrieben.
Ausgabe
Die Ausgabe wird in die Standardausgabe geschrieben. Drucken Sie für jede Farbe, die auf dem endgültigen Zaun erscheint, die Farbnummer und die Häufigkeit, mit der sie erscheint. Nach Farben sortieren.
Beispiele
Eingabe 0
..............
0 3 1 111...........
2 4 2 112222........
1 2 3 133222........
0 4 1 111122........
7 3 5 111122.555....
Ausgabe 0
1 4
2 2
5 3
Eingabe 1
0 100 1
50 150 2
Ausgabe 1
1 50
2 150
Eingabe 2
500 1000 1
0 2000 2
Ausgabe 2
2 2000
Mehr Beispiele
Hier ist ein kleiner Generator:
#include <stdio.h>
#include <assert.h>
#include <stdlib.h>
/* From http://en.wikipedia.org/wiki/Random_number_generation */
unsigned m_w;
unsigned m_z;
unsigned get_random()
{
m_z = 36969 * (m_z & 65535) + (m_z >> 16);
m_w = 18000 * (m_w & 65535) + (m_w >> 16);
return (m_z << 16) + m_w; /* 32-bit result */
}
int main(int argc, char **argv)
{
int i;
assert(argc == 2);
m_w = 0xbabecafe;
m_z = atoi(argv[1]);
i = 10;
while (i--);
get_random();
i = atoi(argv[1]);
while (i--) {
int s = (int) ((get_random() << 8) % 102397);
int l = (int) ((get_random() << 8) % (102397 - s));
int c = (int) ((get_random() << 8) % 97 + 1);
printf("%d %d %d\n", s, l, c);
}
return 0;
}
Laufende Beispiele:
$ ./gen 1 | ./paint
6 535
$ ./gen 10 | ./paint
28 82343
36 3476
41 1802
49 4102
82 1656
$ ./gen 100 | ./paint
2 2379
22 17357
24 4097
25 1051
34 55429
42 9028
45 9716
66 1495
71 196
85 640
97 706
$ ./gen 1000 | ./paint
16 719
26 29
28 24
33 1616
55 371
65 35
69 644
74 16
84 10891
86 36896
87 50832
89 19
$ ./gen 10000 | ./paint
3 800
6 5712
14 3022
17 16
26 1
29 18770
31 65372
37 387
44 40
49 37
50 93
55 11
68 278
70 19
71 64
72 170
77 119
78 6509
89 960
97 15
$ ./gen 100000 | ./paint
2 6
8 26
12 272
24 38576
26 1
34 1553
35 8
36 19505
43 2
45 11
46 2
47 9
49 27339
50 139
53 3109
69 11744
92 89
$ ./gen 1000000 | ./paint
1 1
3 4854
6 523
13 1
16 11
18 416
22 7
24 3920
25 96
31 10249
32 241
37 1135
45 10
57 758
62 2348
65 11
66 7422
78 6
85 13361
87 3833
88 187
91 46
93 7524
96 45436
Ihr Programm muss in angemessener Zeit ausgeführt werden. Meine Lösung läuft im letzten Beispiel in wenigen Sekunden.
Der kürzeste Code gewinnt.
Geben Sie die Laufzeit und Ihre Ausgabe für den letzten Test an.
BEARBEITEN : Dieses Problem soll nicht brutal erzwungen werden, daher ist eine triviale Lösung nicht akzeptabel.
Antworten:
Python, 221
239ZeichenHält
F
als ungeordnete Liste von Tripeln (Startbeginn, Laufende, Farbe) gespeichert, die den aktuellen Status des Zauns darstellen. Da das zufällige Malen im Generator die Schwaden ziemlich häufig übermalt, ist diese Liste nie zu lang (normalerweise im Bereich von 15 bis 40).Läuft im 1M-Beispiel in 37 Sekunden.
quelle
G+=[(a,min(b,s),d)]*(a<s)
usw. verwenden, um die for-Schleife in einer Zeile zu erhaltenfor C in sorted(f[2] for f in F):print C,sum(b-a for a,b,c in F if c==C)
speichert ein paar Zeichen über Ihre letzten vier Zeilen und vermeidet die Notwendigkeit, die magische Zahl 98 zu kennen.sorted(set(...))
was keine Verbesserung mehr ist.Haskell, 251
261269294ZeichenDaran stimmt etwas nicht, da es viel zu viel Zeit und Stapel kostet ... Aber es liefert die richtigen Antworten:
replicate
undgroup
ist ebenso effizient zu zählen , die Farbe an und lässt weniger Code als die benutzerdefinierte Funktions
max
Anruf erforderlichf
quelle
Perl - 148 Bytes
Es scheint, dass Perl das Beste ist, mit dem man spielen kann. einfach kürzer und schneller zu codieren. ;)
Code:
Zeit:
quelle
quelle
JavaScript, 183 Zeichen, 1,3 Sekunden
Leider musste ich den stdin / out-Teil der Anforderung ausschneiden, den JavaScript nicht unterstützt. Stattdessen erhalte ich die Eingabe
<input>
stattdessen von einem Datei-Upload (den ich in meiner Zeichenanzahl nicht zähle, obwohl ich es wahrscheinlich sollte).Hier ist die ungolfed Version. Es ist eine Funktion, die die vollständige Eingabezeichenfolge übernimmt ... alle 14 MB! Dies dauert 1,3 Sekunden. Die Golfversion dauert etwa doppelt so lange - aber sie schlägt immer noch die anderen Lösungen! Interessanterweise ist es in Firefox doppelt so schnell wie in Chrome. Live-Demo hier .
Und hier ist die Golfversion.
quelle