যে বেড়া আঁকা


9

আপনি টম সাওয়ার এবং আপনাকে 102400 মিটার দীর্ঘ বেড়া আঁকতে হবে। ভাগ্যক্রমে, আপনার বন্ধুরা আপনাকে বিভিন্ন জিনিসের বিনিময়ে সহায়তা করার সিদ্ধান্ত নিয়েছে। প্রতিটি বন্ধু রঙিন সি দিয়ে এস থেকে শুরু করে এল মিটার আঁকবেএস , এল হ'ল মিটারের পরিমাণ এবং 1 ডিগ্রি সেন্টিগ্রেড 97।

ইনপুট

ইনপুট স্ট্যান্ডার্ড ইনপুট থেকে পঠিত হয়। প্রতিটি লাইনে উপরে বর্ণিত হিসাবে তিনটি এস , এল , সি রয়েছে ।

Ouput

আউটপুট মান আউটপুট লিখিত হয়। চূড়ান্ত বেড়াতে প্রদর্শিত প্রতিটি রঙের জন্য রঙ নম্বর এবং এটি প্রদর্শিত হওয়ার সংখ্যাটি মুদ্রণ করুন। রঙ দ্বারা অর্ডার।

উদাহরণ

ইনপুট 0

                           ..............
0 3 1                      111...........
2 4 2                      112222........
1 2 3                      133222........
0 4 1                      111122........
7 3 5                      111122.555....

আউটপুট 0

1 4
2 2
5 3

ইনপুট ঘ

 0 100 1
 50 150 2

আউটপুট 1

 1 50
 2 150

ইনপুট 2

 500 1000 1
 0 2000 2

আউটপুট 2

 2 2000

আরও উদাহরণ

এখানে একটি ছোট জেনারেটর রয়েছে:

#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;
}

চলমান উদাহরণ:

$ ./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

আপনার প্রোগ্রামটি অবশ্যই যুক্তিসঙ্গত সময়ে চলবে। আমার সমাধানটি শেষ উদাহরণে কয়েক সেকেন্ডে চলে।

সংক্ষিপ্ততম কোড জিতেছে।

শেষ পরীক্ষার জন্য চলমান সময় এবং আপনার আউটপুট অন্তর্ভুক্ত করুন।

সম্পাদনা : এই সমস্যাটি নিষ্ঠুর-বাধ্য হওয়ার উদ্দেশ্যে নয়, তাই একটি তুচ্ছ সমাধান গ্রহণযোগ্য নয়।


আমার কাছে মনে হয় যে সরলতম উপায় (অ্যারে বরাদ্দ করুন, এটি পূরণ করুন, অ্যারের প্রতিটি রঙের গণনা, আউটপুট) একটি যুক্তিসঙ্গত সময়ে চলবে। দেখে মনে হচ্ছে আপনি চ্যালেঞ্জের অংশ হওয়ার জন্য একটি অ্যালগরিদম নিয়ে আসার ইচ্ছা করেছিলেন, যদিও - আমি কি ভুল করছি?
ম্যাথু

আমি ভাবছিলাম 1000000 ops এক্স 25000 গড় দৈর্ঘ্য = 25 * 10 ^ 9 যথাযথ সময়ে চলবে না। আপনি অন্যথায় চিন্তা করলে আমি বেড়া দৈর্ঘ্য বৃদ্ধি করতে পারেন।
আলেকজান্দ্রু

আহ, আমি মিস করেছি যে ইনপুটটি এক মিলিয়ন লাইন ছিল, আমার খারাপ।
ম্যাথু

1
@Keith: ITYM ইম্পেরিয়াল ইউনিট : en.wikipedia.org/wiki/Imperial_units
পল আর

1
কিথ: আমি মনে করি আপনি ধরে নিতে পারেন যে আজ একজন টম সাওয়ার অনেক বেশি বুদ্ধিমান এবং এসআই ব্যবহার করবে।
জোয়ি

উত্তর:


2

পাইথন, 221 239 অক্ষর

import sys
F=[]
for L in sys.stdin:s,l,c=map(int,L.split());F=sum([[(a,min(b,s),d)]*(a<s)+[(max(a,s+l),b,d)]*(b>s+l)for a,b,d in F],[(s,s+l,c)])
C=[0]*98
for a,b,c in F:C[c]+=b-a
for c in range(98):
 if C[c]:print c,C[c]

রাখে Ftriples এর একটি unordered তালিকা হিসাবে বেড়া বর্তমান অবস্থা প্রতিনিধিত্বমূলক (রান রান শেষে, রং এর শুরু)। যেহেতু জেনারেটরের এলোমেলো পেইন্টিং বেশিরভাগ ক্ষেত্রে প্রায়শই ছড়িয়ে পড়ে তাই এই তালিকাটি কখনই দীর্ঘ হয় না (সাধারণত 15-40 পরিসরে থাকে)।

1 এম উদাহরণে 37 সেকেন্ডে চলে।


আপনি G+=[(a,min(b,s),d)]*(a<s)এক লাইনে লুপটি পেতে ইত্যাদি ব্যবহার করতে পারেন
gnibbler

for C in sorted(f[2] for f in F):print C,sum(b-a for a,b,c in F if c==C)আপনার শেষ চারটি লাইনের চেয়ে বেশ কয়েকটি অক্ষর সংরক্ষণ করে এবং 98 নম্বর

@ গ্যারেথ: আমি মনে করি যদি একই রঙ একাধিক ব্যাপ্তি দ্বারা ব্যবহৃত হয় তবে এটি নকলগুলি মুদ্রণ করবে। সেখানে কোথাও এককীকরণের প্রয়োজন হবে ...
কিথ র্যান্ডাল

আপনি ঠিক বলেছেন: এটি হওয়া দরকার sorted(set(...))যা এখন আর উন্নতি হয় না।

1

হাস্কেল, 251 261 269 294 টি অক্ষর

import Data.List
w@(y@(f,d,e):z)§x@[a,b,c]|e<=d=z§x|a+b>d=(f,d,e`min`a):((f,a+b,e):z)§x
w§[a,b,c]=(c,a,a+b):w
r(c,a,b)=replicate(b-a)c
f l=shows(l!!0)" "++shows(length l)"\n"
main=interact$(>>=f).group.(>>=r).sort.foldl'(§)[].map(map read.words).lines

এটিতে অনেক বেশি সময় এবং স্ট্যাক লাগে বলে কিছু ঠিকঠাক নয় ... তবে এটি সঠিক উত্তর দেয়:

$> ghc -O3 --make -rtsopts -with-rtsopts -K32m 3095-PaintTheFence.hs 
Linking 3095-PaintTheFence ...

$> ./3095-gen 1000000 | time ./3095-PaintTheFence
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
       43.99 real        43.42 user         0.46 sys

  • সম্পাদনা (294 → 269) replicateএবং groupপেইন্ট গণনা করার মতোই কার্যকর উপায়, এবং কাস্টম ফাংশনের চেয়ে কম কোড নেয়s
  • সম্পাদনা (269 → 261) maxকল প্রয়োজন নেই
  • সম্পাদনা করুন (261 → 251) পেইন্ট 0 টি কুল করার প্রয়োজন নেই f

এটা খুব ধীর
আলেকজান্দ্রু

এটা কোড-গল্ফ, না? কোড-গল্ফের জন্য, সাধারণত "যুক্তিসঙ্গত সময়" এর মতো বিধিনিষেধের অর্থ হ'ল লক্ষ্য ইনপুট আকারের জন্য, এটি কয়েক দিন সময় নিতে পারে না। এমন কি কিছু মানদণ্ড রয়েছে যার মাধ্যমে ৩ seconds সেকেন্ড (অন্য উত্তরের সময়) ঠিক আছে, তবে ৪৪ সেকেন্ড খুব ধীর? আপনি চাইলে আমি কেবল একটি দ্রুত সিপিইউতে আমার সময় দিতে পারতাম!
এমটনভিউমার্ক

এই ক্ষেত্রে এটি কয়েক সেকেন্ড সময় লাগবে * ভাষার মন্দা slow আমি ভুল হলে আমাকে সংশোধন কর, তবে হাস্কেল পাইথনের চেয়ে বেশি দ্রুত নয়? (এই কারণেই আমি কীথের সমাধানটি বাতিল করি নি)। নিয়ম অনুসারে একই সময়ে প্রায় একটি সি ব্রুট ফোর্স সলিউশন পোস্ট করা হয়েছিল যা অনুমোদিত ছিল না।
আলেকজান্দ্রু

একই মেশিনে মাপা, এটা নেই অনেক দ্রুত পাইথন সমাধান চেয়ে চালানো। পাইথন দ্রবণটি আমার মেশিনে 133.556 সেকেন্ড সময় নেয়। হাস্কেল দ্রবণটি 3x দ্রুত। এছাড়াও, নোট করুন যে এই হাস্কেল সমাধানটি "নিষ্ঠুর শক্তি" সমাধান নয় (যার দ্বারা আমি অনুমান করছি যে আপনি কেবল প্রাচীরের দৈর্ঘ্যের রঙের অ্যারে তৈরি করছেন))
এমটনভিউমার্ক

0

পার্ল - 148 বাইট

মনে হচ্ছে পার্লই খেলছেন সেরা। সংক্ষিপ্ত এবং দ্রুত কোড করা সহজ। ;)

কোড:

#!perl -n
($a,$b,$c)=split;substr($s,$a,$b,chr($c)x$b)}BEGIN{$s="z"x102400}{$s=~s/([^z])\1*/$H{$1}+=length$&/ge;print ord," $H{$_}
"for sort keys%H

সময়:

time ./gen 1000000 | perl paint.pl
...
real    0m9.767s
user    0m10.117s
sys 0m0.036s

0
$ cat input.txt
0 3 1
2 4 2
1 2 3
0 4 1
7 3 5

$ cat input.txt  | perl -anE '@a[$F[0]..$F[0]+$F[1]]=($F[2])x$F[1];END{$i[$_]++for@a;$i[$_]&&say"$_ $i[$_]"for 1..$#i}'
1 4
2 1
5 3


$ cat input2.txt
500 1000 1
0 2000 2

$ cat input2.txt  | perl -anE '@a[$F[0]..$F[0]+$F[1]]=($F[2])x$F[1];END{$i[$_]++for@a;$i[$_]&&say"$_ $i[$_]"for 1..$#i}'
2 2000

0

জাভাস্ক্রিপ্ট, 183 অক্ষর, 1.3 সেকেন্ড

দুঃখজনকভাবে, আমাকে স্ট্যান্ডিন / প্রয়োজনের অংশটি কাটাতে হয়েছিল, যা জাভাস্ক্রিপ্ট সমর্থন করে না। পরিবর্তে, আমি পরিবর্তে একটি ফাইল আপলোড থেকে ইনপুট <input>পাই (যা আমি আমার চর গণনায় গণনা করি না, যদিও আমার সম্ভবত হওয়া উচিত)।

এখানে বর্ণহীন সংস্করণ। এটি এমন একটি ফাংশন যা পুরো ইনপুট স্ট্রিং নেয় ... এর সমস্ত 14 এমবি! এটিই যে ১.৩ সেকেন্ড সময় নেয়; গল্ফযুক্ত সংস্করণটি প্রায় দ্বিগুণ সময় নেয় - তবে এটি এখনও অন্য সমাধানগুলিকে মারছে! মজার কথা, এটি ফায়ারফক্সে ক্রমের চেয়ে দ্বিগুণ দ্রুত। এখানে লাইভ ডেমো

function Q(input) {

    var c = [];
    var l = input.trim().split(/\s/g);
    input = null
    var length = l.length;

    // Loop through each meter of the wall...
    for (var i = 0; i <= 102400; i++) {

        // ...and loop through each of the friends, finding
        // the last one who painted this meter...
        for (var j = length; j > 0; ) {
            j -= 3;

            // Start = +l[j]
            // Length = +l[j + 1]
            // Color = +l[j + 2]

            var S = +l[j];      
            if (S <= i && +l[j + 1] + S > i) {

                // ...and incrementing the color array.
                var C = +l[j + 2];
                if (!++c[C])
                    c[C] = 1;

                break;
            }
        }
    }

    console.log(c.map(function (a,b) {return b + ' ' + a}).filter(function (a) { return a }).join('\n'));
}

এবং এখানে গল্ফ সংস্করণ।

function G(i){l=i.trim(c=[]).split(/\s/)
for(i=0;i<102401;i++)for(j=l.length;j>0;)if(l[j-=3]<=i&&i-l[j+1]<l[j]){if(!++c[l[j+2]])c[l[j+2]]=1
break}for(k in c)console.log(k+' '+c[k])}

স্ক্রিনশট

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.