একটি ক্যাফে খোলার সময়কে দলবদ্ধভাবে দেখানো একটি চিহ্ন


20

আপনি সম্ভবত বিভিন্ন দোকানের দরজায় এই লক্ষণগুলি দেখেছেন:

খোলার ঘন্টা

সোম
-শুক্র 0900-1800 সাত-সূর্য 1100-1530

পুরো কাজটি পুরো সপ্তাহের জন্য খোলার সময়গুলির তালিকা থেকে একই খোলার সময়কালের সাথে একটানা দিনগুলিতে গ্রুপিং করা, এর মতো একটি চিহ্ন তৈরি করা এখানে কাজ task নোট করুন যে ধারাবাহিকভাবে বিবেচনা করা হয় তার জন্য সপ্তাহটি "চারপাশে মোড়ানো"।

ইনপুট:

  • সোমবার থেকে শুরু করে এক সপ্তাহে প্রতিটি দিনের জন্য খোলার সময়কে উপস্থাপন করে 7 টি উপাদান।
  • XXXX-XXXX ফর্মের প্রতিটি উপাদানই একটি স্ট্রিং
  • উদাহরণ ইনপুট:

    0900-1800 0900-1800 0930-1730 0930-1730 0900-1500 1100-1500 1100-1500
    
  • অ্যারের হিসাবে ইনপুটটি পাঠানো ঠিক আছে (উদাহরণস্বরূপ কোনও ফাংশনে ইনপুট হিসাবে যদি আপনি স্টিডিন থেকে না পড়ে থাকেন)

আউটপুট:

  • খোলার সময়গুলির একটি তালিকা, যেখানে একই খোলার ঘন্টাগুলির সাথে একটানা দিন ব্যাপ্তি হিসাবে দেখানো হয়। উল্লেখ্য যে রবিবার (শেষ দিন) এবং সোমবার (প্রথম দিন )ও একটানা দিন।
  • এমন একটি দিন যেখানে দিনটির খোলার সময়গুলি তার আগে বা পরে নিজেই মুদ্রিত হওয়ার আগে হয় না
  • দিনগুলি তিনটি ছোট হাতের অক্ষর হিসাবে নির্দিষ্ট করা হয়: সোম মঙ্গল মঙ্গল থ্রি শুক্র সূর্য
  • মনে রাখবেন ইনপুটটিতে প্রথম উপাদানটি সোমের সাথে মিলিত হয়, মঙ্গল ইত্যাদির পাশে etc.
  • খোলার সময়গুলি ইনপুট হিসাবে প্রদর্শিত হয়
  • দুটি উদাহরণ

    mon-fri 0900-1800, sat-sun 1100-1500
    mon-wed 1030-1530, thu 100-1800, fri-sun 1200-1630
    
  • আউটপুটটি বাছাই করা উচিত, সুতরাং সপ্তাহগুলিতে দিনগুলি ক্রম অনুসারে উপস্থিত হয়। সোমবার প্রথম হতে পছন্দ করা হয়, তবে এটি ঘটতে পারে এটি কোনও গ্রুপে প্রথম নয় কারণ সপ্তাহটি মোড় নেয়। সুতরাং এই ক্ষেত্রে মঙ্গল প্রথম পরিসর।

    tue-fri 0900-1800, sat-mon 1100-1500
    
  • ধারাবাহিক না হয়ে গ্রুপ করবেন না, এখানে বুধবার এবং শুক্রবার একই উদ্বোধনী সময় রয়েছে তবে বৃহস্পতিবার দ্বারা পৃথক পৃথক পৃথক খোলার সময় রয়েছে যাতে তারা নিজেরাই তালিকাভুক্ত থাকে।

    mon-tue 1000-1200, wed 0900-1500, thu 1000-1800, fri 0900-1500, sat-sun 1000-1500
    
  • আউটপুটটি হয় এখানে উদাহরণ হিসাবে কমা দ্বারা পৃথক করা যেতে পারে, বা উপরে যেমন উদাহরণ হিসাবে একটি নতুন লাইন দ্বারা পৃথক করা যেতে পারে।

পরীক্ষার মামলা

প্রথম লাইনটি ইনপুট, দ্বিতীয় লাইনটি প্রত্যাশিত আউটপুট

0900-1800 0900-1800 0900-1800 0900-1800 0900-1800 1100-1500 1100-1500
mon-fri 0900-1800, sat-sun 1100-1500

0900-1800 0900-1800 0900-1800 0930-1700 0900-1800 1100-1500 1100-1500
mon-wed 0900-1800, thu 0930-1700, fri 0900-1800, sat-sun 1100-1500

1100-1500 0900-1800 0900-1800 0900-1800 0900-1800 1100-1500 1100-1500
tue-fri 0900-1800, sat-mon 1100-1500

1100-1500 1100-1500 0900-1800 0900-1800 0900-1800 0900-1800 1100-1500
wed-sat 0900-1800, sun-tue 1100-1500

1200-1500 1100-1500 0900-1800 0900-1800 0900-1800 0900-1800 1100-1500
mon 1200-1500, tue 1100-1500, wed-sat 0900-1800, sun 1100-1500

বিধি

এটি কোড-গল্ফ, তাই বাইটের মধ্যে সংক্ষিপ্ত উত্তর ins


7
প্রোগ্রামিং ধাঁধা এবং কোড গল্ফ স্বাগতম। এটি একটি ভাল চ্যালেঞ্জ; সাবাশ! ভবিষ্যতে, আমি চ্যালেঞ্জ পোস্ট করার আগে স্যান্ডবক্স ব্যবহার করার পরামর্শ দেব। (আপনি জানেন, কেবলমাত্র ক্ষেত্রে ...)
wizzwizz4

1
একটানা হিসাবে রবিবার ও সোমবার হওয়া আমার কাছে বেআইনি মনে হচ্ছে ...
ফ্রেডেরিক

1
আমি মনে করি যে "সোম-রৌদ্রের" জন্য কোনও পরীক্ষার মামলা থাকা উচিত যদি কোনও জমাটি সেই নির্দিষ্ট বেস কেসটি সঠিকভাবে পরিচালনা না করে তবেই।
প্যাট্রিক রবার্টস

উত্তর:


7

জাভাস্ক্রিপ্ট (ES6), 182 173 170 163 157 বাইট

এডসি 65 এর সাহায্যে 6 বাইট সংরক্ষণ করা হয়েছে

স্ট্রিংগুলির অ্যারের হিসাবে ইনপুট নেয় এবং ফলাফলটি সরাসরি কনসোলে মুদ্রণ করে:

h=>{for(D="montuewedthufrisatsun".match(/.../g),d=c=i=j=0;j<8;y=d)h[i]==h[6]?i++:(v=h[d=(i+j++)%7])!=c&&(j>1&&console.log(D[x]+(x-y?'-'+D[y]:''),c),x=d,c=v)}

ফর্ম্যাট এবং মন্তব্য

h => {                               // input = list h of opening hours
  for(                               //
    D = "montuewedthufrisatsun"      // D = list of abbreviated names of days
        .match(/.../g),              //
    d =                              // d = current day of week
    c =                              // c = current opening hours
    i =                              // i = first day of week to process
    j = 0;                           // j = day counter
    j < 8;                           // stop when 7 days have been processed
    y = d                            // update y = last day of current day range
  )                                  //
  h[i] == h[6] ?                     // while the opening hours of day #i equal the opening
    i++                              // hours of sunday: increment i
  : (v = h[d = (i + j++) % 7]) != c  // else, if the new opening hours (v) of the current
    && (                             // day (d) doesn't match the current opening hours (c):
      j > 1 &&                       //   if this is not the first iteration:
        console.log(                 //     print:
          D[x] +                     //     - the first day of the current day range (x)
          (x - y ?                   //     - followed by either an empty string
            '-' + D[y]               //       or a '-' and the last day of the range
          : ''),                     //       (if they differ)
          c                          //     - the corresponding opening hours
        ),                           //   (endif)
      x = d,                         //   update x = first day of current day range
      c = v                          //   update c = current opening hours
    )                                // (endif)
}                                    // (end)

পরীক্ষার মামলা

let f =

h=>{for(D="montuewedthufrisatsun".match(/.../g),d=c=i=j=0;j<8;y=d)h[i]==h[6]?i++:(v=h[d=(i+j++)%7])!=c&&(j>1&&console.log(D[x]+(x-y?'-'+D[y]:''),c),x=d,c=v)}

f(["0900-1800", "0900-1800", "0900-1800", "0900-1800", "0900-1800", "1100-1500", "1100-1500"]);
console.log('-');
f(["0900-1800", "0900-1800", "0900-1800", "0930-1700", "0900-1800", "1100-1500", "1100-1500"]);
console.log('-');
f(["1100-1500", "0900-1800", "0900-1800", "0900-1800", "0900-1800", "1100-1500", "1100-1500"]);
console.log('-');
f(["1100-1500", "1100-1500", "0900-1800", "0900-1800", "0900-1800", "0900-1800", "1100-1500"]);
console.log('-');
f(["1200-1500", "1100-1500", "0900-1800", "0900-1800", "0900-1800", "0900-1800", "1100-1500"]);


D='montuewedthufrisatsun'.match(/.../g)Dফাংশনের পরিবর্তে অ্যারে হিসাবে ব্যবহার করা কিছু বাইট সংরক্ষণ করা উচিত
edc65

@ edc65 - দুর্ভাগ্যক্রমে কল করা D()যেতে পারে -1(যখন আমরা 'সোমবারের আগের দিনটি সন্ধান করি') যা কাজ করে substr()তবে অ্যারের সাথে কাজ করে না।
আর্নাউল্ড

@ এডসি 65 - সম্পাদনা: আপনার পদ্ধতির সাথে অন্য কোনও ফিক্সের সংমিশ্রণ করে এটি অবশ্যই একটি জয়। ধন্যবাদ!
আর্নৌল্ড

3

ব্যাচ, 334 বাইট

@echo off
set/af=l=w=0
set h=%7
call:l mon %1
call:l tue %2
call:l wed %3
call:l thu %4
call:l fri %5
call:l sat %6
call:l sun %7
if not %w%==0 set l=%w%
if %f%==0 set f=mon
call:l 0 0
exit/b
:l
if not %h%==%2 (
if %f%==0 (set w=%l%)else if %f%==%l% (echo %f% %h%)else echo %f%-%l% %h%
set f=%1
set h=%2
)
set l=%1

কমান্ড-লাইন প্যারামিটার হিসাবে ইনপুট নেয়, প্রতিটি গ্রুপকে আলাদা লাইনে আউটপুট দেয়। আগের দিনের সাথে প্রতিটি দিনের ঘন্টা তুলনা করে, fগ্রুপের প্রথম দিন hহিসাবে , সেই গোষ্ঠীর lশেষ ঘন্টা হিসাবে এবং wশেষ গ্রুপটি সপ্তাহের শুরুতে গুটিয়ে রাখার সময় হিসাবে ট্র্যাক করে Works যখন কোনও অমিল খুঁজে পাওয়া যায় তবে সপ্তাহের মোড়ক কার্যকর না হলে পূর্ববর্তী গোষ্ঠীটি মুদ্রিত হয়। সবশেষে যখন সমস্ত দিন প্রক্রিয়া করা হয় শেষ গ্রুপটি কোনও সপ্তাহের মোড়কের জন্য সামঞ্জস্য করা হয় এবং আউটপুট হওয়ার আগে সমস্ত ঘন্টা একই হয় কিনা। 0স্থানধারক হিসাবে ব্যবহৃত হয় কারণ খালি স্ট্রিংগুলিতে ব্যাচের তুলনায় বেশি বাইট খরচ হয়।


2

জেলি , 87 84 80 75 বাইট

  • @ ডেনিসের সদয় সহায়তায় 4 বাইটস ( 'দ্রুত, "ফ্ল্যাট" দিয়ে আমি একটি হ্যাক স্থির করেছি )

খুব নিশ্চিত যে আরও ভাল উপায় আছে তবে এখনকার জন্য:

Ṫ2ị$€;@µ+\µżṙ1’$Ṗị“ḅạṄMḤ9\E¥LḃɓṅÐĿ;$»s3¤Q€j€”-
ṙ7Ḷ¤Œr'€Ėµ2ịLµÐṂḢ
ÇṪḢ€ż@ÇÑ$G

TryiItOnline

কিভাবে?

            “ḅạṄMḤ9\E¥LḃɓṅÐĿ;$» - compressed string "montuewedthufrisatsun"
                  v  v
Ṫ2ị$€;@µ+\µżṙ1’$Ṗị -- s3¤Q€j€”- - Link 1, getDayStrings: [offset, groupedList]
Ṫ                               - Tail: get groupedList
 2ị$€                           - second index of each: get group sizes, e.g. mon-thu is 4
     ;@                         - concatenate (reversed arguments): prepend with offset
       µ                        - monadic chain separation
        +\                      - cumulative reduce with addition: start indexes
          µ                     - monadic chain separation
           ż                    - zip with
               $                - last two links as a monad
            ṙ1                  -     rotated left by one
              ’                 -     decrement:  end indexes
                Ṗ               - pop: remove last one, it's circular
                 ị              - index into
                        ¤       - last two links as a nilad
                    --          -     compressed string of weekdays (as shown at the top)
                      s3        -     split into 3s
                        Q€      - unique items for each: [tue,tue] -> [tue]
                          j€    - join each with
                            ”-  - literal string "-"

ṙ7Ḷ¤Œr'€Ėµ2ịLµÐṂḢ - Link 2: CalculateGroupingData: list of time strings
   ¤              - last two links as a nilad
ṙ                 -    rotate time strings list left by
 7Ḷ               -    range 7: [0,1,2,3,4,5,6]
       €          - for each
    Œr            -     run length encode
      '           -     flat - i.e. don't vectorise
        Ė         - enumerate [[1,[groupsFromMon]],[2,[groupsFromTue], ...]
         µ        - monadic chain separation
              ÐṂ  - filter for minimum of
             L    -     length of
          2ị      -     item at index 2: The number of groupings
                Ḣ - head: get the first occurring minimal (i.e Mon, or Tue, ...)

ÇṪḢ€ż@ÇÑ$G - Main link: list of time strings
Ç          - call last link (1) as a monad: get the offset and grouping
 Ṫ         - tail: get the grouping
  Ḣ€       - head each: get the time information
        $  - last two links as a monad
      Ç    -      call last link (1) as a monad: get the offset and grouping
       Ñ   -      call the next link as a monad: get the day strings
    ż@     - zip (with reversed arguments)
         G - arrange as a group (performs a tabulation to nicely align the result)

1

জাভাস্ক্রিপ্ট (ES6), 171 169 বাইট

a=>a.map((e,d)=>(d='montuewedthufrisatsun'.substr(d*3,3),e!=h&&(f?o(f):w=l,f=d,h=e),l=d),f='',l=w='sun',h=a[6],o=f=>console.log((f==l?l:f+'-'+l)+' '+h))&&o(f||'mon',l=w)

একটি অ্যারে হিসাবে ইনপুট নেয় এবং পৃথক লাইনে কনসোল আউটপুট দেয়। এটি প্রায় আমার ব্যাচের উত্তরের একটি বন্দর; fএখন অবশ্যই একটি খালি স্ট্রিং ডিফল্ট, যখন আমি ডিফল্ট করতে lএবং wকরতে 'sun'(ব্যবহার করে একটি প্রহরী মান আমাকে ব্যাচ 3 বাইট সংরক্ষিত কারণ আমি মধ্যে initialisation একত্রীকরণ করতে সক্ষম হন set/a)।


1

বকন , 514 496 455 বাইট

নীচের বেসিক প্রোগ্রামটি এর ইন্ডেন্টেশন সহ প্রদর্শিত হবে। তবে ইন্ডেন্টেশন ছাড়াই এটি 455 বাইট নিয়ে গঠিত।

ধারণাটি হ'ল সময়সূচীটি কোনও এসোসিয়েটিভ অ্যারেতে সূচি হিসাবে ব্যবহার করা। তারপরে, প্রতিটি দিন কিছুটা উপস্থাপন করে: সোমবার = বিট 0, মঙ্গলবার = বিট 1, বুধবার = বিট 2 এবং আরও অনেক কিছু। এসোসিয়েটিভ অ্যারের সদস্যদের জন্য আসল মানগুলি বাইনারি ওআর ব্যবহার করে দিনের সংশ্লিষ্ট বিট দ্বারা গণনা করা হয়।

এর পরে, বিট 0 দিয়ে শুরু করে কতগুলি বিট অ্যাসোসিয়েটিভ অ্যারে সদস্যদের মধ্যে উপস্থিত রয়েছে তা যাচাই করার বিষয়।

যদি বিট 0 এবং বিট 6 সেট করা হয় তবে একটি সপ্তাহের মোড়ক রয়েছে। সেক্ষেত্রে এই শুরু অবস্থানটি মুখস্থ করে, বিটগুলির পরবর্তী ক্রমের শুরুটির সন্ধান শুরু করুন। অন্যান্য ক্রমগুলি মুদ্রণ করুন, এবং শীঘ্রই বিট 6 এ পৌঁছানোর সাথে সাথে পূর্ববর্তী মুখস্থ পজিশনের সাথে দিনের পরিসরটি শেষ করা উচিত।

LOCAL n$[]={"mon","tue","wed","thu","fri","sat","sun"}
GLOBAL p ASSOC int
SUB s(VAR t$ SIZE a)
    FOR i = 0 TO a-1
        p(t$[i])=p(t$[i])|BIT(i)
    NEXT
    LOOKUP p TO c$ SIZE o
    b=e=0
    REPEAT
        FOR i=0 TO o-1
            IF p(c$[i])&BIT(b) THEN
                IF b=0 AND p(c$[i])&65=65 THEN
                    WHILE p(c$[i])&BIT(b)
                        INCR b
                    WEND
                    e=b
                    BREAK
                FI
                ?n$[b];
                r=b
                REPEAT
                    INCR b
                UNTIL NOT(p(c$[i])&BIT(b))
                IF e AND b>6 THEN
                    ?"-",n$[e-1];
                ELIF b-r>1 THEN
                    ?"-",n$[b-1];
                FI
                ?" ",c$[i]
            FI
        NEXT
    UNTIL b>6
    FREE p
ENDSUB

এসইউবিতে অনুরোধ করতে নিম্নলিখিত কলগুলি ব্যবহার করুন:

s("0900-1800", "0900-1800", "0900-1800", "0900-1800", "0900-1800", "1100-1500", "1100-1500")
PRINT "======"
s("0900-1800", "0900-1800", "0900-1800", "0930-1700", "0900-1800", "1100-1500", "1100-1500")
PRINT "======"
s("1100-1500", "0900-1800", "0900-1800", "0900-1800", "0900-1800", "1100-1500", "1100-1500")
PRINT "======"
s("1100-1500", "1100-1500", "0900-1800", "0900-1800", "0900-1800", "0900-1800", "1100-1500")
PRINT "======"
s("1200-1500", "1100-1500", "0900-1800", "0900-1800", "0900-1800", "0900-1800", "1100-1500")

আউটপুট :

mon-fri 0900-1800
sat-sun 1100-1500
======
mon-wed 0900-1800
thu 0930-1700
fri 0900-1800
sat-sun 1100-1500
======
tue-fri 0900-1800
sat-mon 1100-1500
======
wed-sat 0900-1800
sun-tue 1100-1500
======
mon 1200-1500
tue 1100-1500
wed-sat 0900-1800
sun 1100-1500
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.