অলস প্রোগ্রামার এক্সএমএল পার্সার


15

পটভূমি

আপনি একটি গাড়ি বিক্রয় সংস্থার প্রোগ্রামার হিসাবে কাজ করছেন। এই সপ্তাহের জন্য আপনার কাজটি হল একটি এক্সএমএল পার্সার প্রোগ্রাম করা যা বিভিন্ন গাড়ি নির্মাতাদের থেকে উপলভ্য মডেলগুলির ডেটা এবং নতুন মডেলগুলির সম্পর্কে সুন্দর-মুদ্রণের তথ্য গ্রহণ করে। ভাগ্যক্রমে আপনার জন্য, পরীক্ষা বিভাগ কেবল একটি পরীক্ষার কেস সরবরাহ করেছে! আপনি যে কোডটি দ্রুত পাস করতে পারেন তা তত দ্রুত লিখতে পারবেন, সপ্তাহের বাকি সময়গুলিতে আপনার বিলম্বের জন্য আরও বেশি সময় থাকবে।

ইনপুট

আপনার ইনপুট হয় ঠিক এক্সএমএল তথ্য এই টুকরা, টেস্টিং বিভাগের দ্বারা সরবরাহকৃত। এতে কিছু গাড়ি নির্মাতারা, তাদের গাড়িগুলির সিরিজ এবং এই সিরিজের মডেলগুলির তথ্য রয়েছে। আপনি একটি অনুবর্তনযোগ্য নতুন লাইন ধরে নিতে পারেন।

<?xml version="1.0" ?>
<products>
  <manufacturer name="Test Manufacturer 1">
    <series title="Supercar" code="S1">
      <model>
        <name>Road Czar</name>
        <code>C</code>
        <year>2011</year>
      </model>
      <model>
        <name>Ubervehicle</name>
        <code>U</code>
        <year>2013</year>
      </model>
      <model>
        <name>Incredibulus</name>
        <code>I</code>
        <year>2015</year>
      </model>
      <model>
        <name>Model 1</name>
        <code>01</code>
        <year>2010</year>
      </model>
    </series>
    <series title="Test series 22" code="Test">
      <model>
        <name>Test model asdafds</name>
        <code>TT</code>
        <year>2014</year>
      </model>
    </series>
  </manufacturer>
  <manufacturer name="Car Corporation">
    <series title="Corporation Car" code="CC">
      <model>
        <name>First and Only Model</name>
        <code>FOM</code>
        <year>2012</year>
      </model>
    </series>
  </manufacturer>
  <manufacturer name="Second Test Manufacturer">
    <series title="AAAAAAAAAAAAAA" code="D">
      <model>
        <name>Some older model</name>
        <code>O</code>
        <year>2011</year>
      </model>
      <model>
        <name>The newest model</name>
        <code>N</code>
        <year>2014</year>
      </model>
    </series>
    <series title="BBBBBBBBBBBBBBB" code="asdf">
      <model>
        <name>Another newest model here</name>
        <code>TT</code>
        <year>2015</year>
      </model>
    </series>
  </manufacturer>
</products>

আউটপুট

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

Car Corporation: 1 series
  Corporation Car, First and Only Model (CC-FOM)
Second Test Manufacturer: 2 series
  BBBBBBBBBBBBBBB, Another newest model here (asdf-TT)
  AAAAAAAAAAAAAA, The newest model (D-N)
  AAAAAAAAAAAAAA, Some older model (D-O)
Test Manufacturer 1: 2 series
  Supercar, Incredibulus (S1-I)
  Test series 22, Test model asdafds (Test-TT)
  Supercar, Ubervehicle (S1-U)
  Supercar, Road Czar (S1-C)
  Supercar, Model 1 (S1-01)

বিধি এবং স্কোরিং

আপনি কোনও ফাংশন বা সম্পূর্ণ প্রোগ্রাম লিখতে পারেন। সর্বনিম্ন বাইট গণনা জয়, এবং মান লুফোলগুলি অনুমোদিত নয়।

নোট করুন যে ইনপুট স্থির হয়েছে: আপনাকে এখানে প্রদত্ত চেয়ে অন্য কোনও ইনপুট সমর্থন করতে হবে না। যদি আপনার প্রোগ্রামটিকে কোনও উপায়ে পরিবর্তন করা হয় তবে আপনার প্রোগ্রামটিকে বাজে কথা বা এমনকি ক্রাশ করার অনুমতি দেওয়া হয়েছে is আপনি চাইলে ইনপুট এবং হার্ড-কোড আউটপুটটিকেও এড়িয়ে যেতে পারেন। তবে আপনি এক্সএমএল বা এইচটিএমএল পার্সার লাইব্রেরি বা বিল্ট-ইন ব্যবহার করতে পারবেন না


এইচটিএমএল পার্সারের অনুমতি দেওয়া হবে বা নিয়মগুলি বাঁকানো হবে?
ডাউনগোট

11
আমি কখনই এই সংস্থার কাছ থেকে গাড়ি কিনতে চাই না।
kirbyfan64sos

1
@ভিহান আমি (বরং নির্বিচারে) সিদ্ধান্ত নেব যে এইচটিএমএল পার্সারগুলিরও অনুমতি নেই, যেহেতু দুটি ফর্ম্যাটটি একই রকম।
জাগারব

এক্সএসএলটি সম্পর্কে কী? ;)
বিটা ক্ষয়

@ বেটাডেএকে আমি এক্সএসএলটিকে ব্যতিক্রম হিসাবে মঞ্জুর করতে যাচ্ছি, যেহেতু এটি ভাষায় এক্সএমএল পার্সিং অপারেশন ব্যবহার না করা সম্ভবত খুব ক্লান্তিকর এবং বিরক্তিকর হবে । : পি এবং এটি যাইহোক সিজেএম উত্তরের সাথে প্রতিযোগিতা করবে না।
জাগারব

উত্তর:


8

সিজেম, 109 107 বাইট

"rzn ¸À¨ 4T\$D"S/q"<>"'"er'"/
f{\:i2/_E5bf.+.+\ff=)1<_s,9/+":  series
"2/.+\"  ,  ()
-"2/Z4e\f.\}

নোট করুন যে স্ট্রিংয়ের শুরুতে চারটি অক্ষর অপ্রিনিতযোগ্য।

সিজেএম ইন্টারপ্রেটারে এটি অনলাইনে চেষ্টা করুন ।

ধারণা

এটি মূলত একটি হার্ডকোড যা < , > এবং " এর সমস্ত ক্ষেত্রে ইনপুটটি বিভক্ত করে , নির্দিষ্ট অংশগুলি নির্বাচন করে এবং আউটপুটটির বাকী অংশগুলির সাথে সেগুলি ইন্টারলেভ করে।

বিভাজন ইনপুট করার পর, ইনডেক্স এ খন্ডে 110 , 114 এবং 122 হয় গাড়ি কর্পোরেশন , কর্পোরেশন গাড়ি এবং প্রথম এবং একমাত্র মডেল । সিরিজ এবং নামের কোডগুলি সূচী 116 এবং 126 এ পাওয়া যাবে, যা নামের সূচকে 2 এবং 4 যোগ করে গণনা করা যেতে পারে। অবশেষে, সিরিজের সংখ্যাটি স্ট্রিং কার কর্পোরেশনের দৈর্ঘ্য 9 (স্পষ্টতই) দ্বারা বিভক্ত ।

সুতরাং, আমরা আউটপুট অংশটি এনকোড করি যা এই প্রস্তুতকারকের সাথে [114 122 110]বা বরং স্ট্রিংয়ের সাথে সম্পর্কিত "rzn"

কোড

e# Split the string at spaces.

"rzn ¸À¨ 4T\$D"S/

e# After replacing characters with their code points, this will be the result:
e# [[114 122 110] [184 192 144 168 144 152 140] [12 52 84 92 12 36 12 20 12 68 8]]

e# Read from STDIN, replace < and > with " and split at double quotes.

q"<>"'"er'"/ 

f{       e# For each chunk of the split string, push the split input; then:
\:i2/    e# Replace characters with character codes and split into chunks of
         e# length 2.
_E5b     e# Copy the result and push [2 4].
f.+      e# Replace each pair [I J] in the copy with [I+2 J+4].
.+       e# Vectorized concatenation.
         e# For the first chunk, we've achieved
         e# [114 122 110] -> [[114 122] [110]]
         e#               -> [[114 122] [110]] [[116 126] [110 112 4]]
         e#               -> [[114 122 116 126] [110 112 4]]
\ff=     e# Replace each integer with the chunk of the split input at that index.
)1<      e# Pop the first chunk and reduce it to the first string.
_s,9/    e# Divide that strings length by 9 and append the integer to the array.
":  series
"2/      e# Push [": " " s" "er" "ie" "s\n"].
.+       e# Vectorized concatenation; pushes the manufacturer line.
\        e# Swap the remaining strings on top of the stack.
"  ,  ()
-"2/     e# Push ["  " ", " " (" ")\n" "-"].
Z4e\     e# Swap the chunks at indexes 3 and 4.
\f.\     e# Interleave both arrays of strings.
}

10

বুবলগাম , 227 225 বাইট

0000000: 6d 50 45 b6 02 31 10 dc cf 29 6a 87 eb 92 1d ee 0e 07  mPE..1...)j.......
0000012: 08 93 1e 3c e1 45 be 9d fe 37 ae bd 2b 7d 95 54 85 41  ...<.E...7..+}.T.A
0000024: 55 9b 83 36 c2 ad b5 2a a1 00 4b 66 4d 36 c0 23 0f f6  U..6...*..KfM6.#..
0000036: a5 d1 58 1b eb 20 94 c4 50 ed 7e d1 d7 92 76 88 57 ab  ..X.. ..P.~...v.W.
0000048: 99 c6 b0 9f 08 a6 14 6a 96 66 c4 9e be 50 3e 12 a1 f3  .......j.f...P>...
000005a: 86 4c 09 c5 7b 67 e5 f9 d2 28 2b ed 56 64 a0 e8 9b 83  .L..{g...(+.Vd....
000006c: d8 9f 3a 99 20 c4 85 95 51 66 36 4b 70 ac fc 74 69 cc  ..:. ...Qf6Kp..ti.
000007e: 56 f4 9c 88 d7 32 83 4f c6 a9 de 13 f4 4e 92 b9 1b 87  V....2.O.....N....
0000090: 89 e0 6d 24 0a 4f 33 a7 fe 40 26 e4 37 a3 ad 42 43 72  ..m$.O3..@&.7..BCr
00000a2: bd f0 3b 6f 11 9f 16 32 ed 04 eb a7 fc d9 8d 62 91 f7  ..;o...2.......b..
00000b4: dc 97 f0 6a 11 49 f6 1e b9 cb fc 7b dd 7c 41 e6 8b 56  ...j.I.....{.|A..V
00000c6: eb 70 47 a7 b6 f9 b3 3c d1 42 a2 fa 27 cc 49 ac 3e 89  .pG....<.B..'.I.>.
00000d8: 97 ff 2e 9c a4 7c 21 f1 0f                             .....|!..

এটি খুব প্রতিযোগিতামূলক নয়, তবে আমি চ্যালেঞ্জের জন্য আমার প্রথম বাবলগাম উত্তর পোস্ট করতে প্রতিরোধ করতে পারিনি ।

হেক্সডাম্প এর সাথে বিপরীত হতে পারে xxd -r -c 18 > xml.bg

কোড সম্পূর্ণভাবে ইনপুট উপেক্ষা করে। সংকোচনের সাথে করা হয়েছেসংক্ষেপটি জোফফ্লির , যা ডিফল্ট ফর্ম্যাট ব্যবহার করে তবে (জি) জিপের চেয়ে আরও ভাল অনুপাত পেয়ে থাকে।

-২ বাইটের জন্য @ Sp3000 কে ধন্যবাদ!


9

সেড, 449 বাইট

-nrবিকল্পগুলি দিয়ে চালানো হবে বলে ধরে নিন।

/\?|<p/d;:M
/<ma/{s/.*"(.*)".*/Q\1: X series/;/C/ s/X/1/;s/X/2/;H;d}
/<se/{s/.*"([^"]*)".*"([^"]*)".*/@\1!\2/;H;d}
/<mo/{
G;s/.*@(.*)*$/\1/;x;s/@(.*)*$//;x;:A N
/<\/m/!bA
s/\n/!/g;s/  +//g;s|<[/a-z]*>||g;s/(.*)!(.*)!(.*)!(.*)!(.*)!/%\1, \3 (\2-\4)@\1!\2/;H}
/<\/se/{x;s/\n*@.*$//;x}
$!{n;bM}
x;s/\n//g;s/Q(.*)Q(.*)%(.*)Q(.*)/\2\n  \3\n\4\n\1/
s/%(.*)%(.*)%(.*)\n(.*)%(.*)%(.*)%(.*)%(.*)%(.*)/\n  \3\n  \2\n  \1\n\4\n  \7\n  \9\n  \6\n  \5\n  \8/;p

অবরুদ্ধ সংস্করণ:

# Remove first 2 lines
/\?|<p/ d

:M
#manufacturer
/<ma/ {
    s/.*"(.*)".*/Q\1: X series/
    #Car corp
    /C/ s/X/1/
    #other
    s/X/2/
    H
    d
}

#series: store in hold buffer. (treating the hold buffer as a list, with @ as a delimeter)
/<se/{
    s/.*"([^"]*)".*"([^"]*)".*/@\1!\2/
    H
    d
}
/<mo/ {
    # pull series from hold buffer
    G
    s/.*@(.*)*$/\1/

    # remove series from hold buffer
    x
    s/@(.*)*$//
    x

    # Concatenate model into one line
    :A N
    /<\/m/ !{
        bA
    }
    s/\n/!/g

    # Remove junk
    s/  +//g
    s|<[/a-z]*>||g

    # Append formatted line to hold buffer, replace series at the end
    s/(.*)!(.*)!(.*)!(.*)!(.*)!/%\1, \3 (\2-\4)@\1!\2/
    H
}
/<\/se/ {
    #pop series name
    x
    s/\n*@.*$//
    x
}

$ ! {
    n
    b M
}
# end of loop

x
s/\n//g

# "sort"
s/Q(.*)Q(.*)%(.*)Q(.*)/\2\n  \3\n\4\n\1/
s/%(.*)%(.*)%(.*)\n(.*)%(.*)%(.*)%(.*)%(.*)%(.*)/\n  \3\n  \2\n  \1\n\4\n  \7\n  \9\n  \6\n  \5\n  \8/
p

1
প্রোগ্রামিং ধাঁধা এবং কোড গল্ফ স্বাগতম!
ডেনিস

2

বাশ, 388 368 365

base64 -d<<<H4sICKVS9FUCA2hlcmUAbVFBasMwELwH8oc92mBD5GNuqUogB9dQOw9QpDUWKFJYWS3t6yvJtI3T7k07szOzKy4IuKObIzFrZ/fAwCNp9NsN3APABVVw1ORnEFZBZ80HtE6hgYLz+ti15XbTo3QRGzCSWmHDKOQcCGkPzZ3q07oqOFg3T0hg8T1NXrNqbCAUwquxHoYyzR1WVcEw4XqkeK5f/mX27orgjIoeP8wuMv8EBbaO2ocbkkybn6wkVPoSTPBQ9Kw+ZaessPChaarlvXjE6GJUkZx63zv8Cp4vSG84aWkw650f8FcnFPDP+D0J5Q/ocnmWsR0rvwC2OTuexgEAAA==|zcat

ছোট পরীক্ষা কারণ:

$ bash ./go_procrastination.sh cars.xml
Car Corporation: 1 series
  Corporation Car, First and Only Model (CC-FOM)
Second Test Manufacturer: 2 series
  BBBBBBBBBBBBBBB, Another newest model here (asdf-TT)
  AAAAAAAAAAAAAA, The newest model (D-N)
  AAAAAAAAAAAAAA, Some older model (D-O)
Test Manufacturer 1: 2 series
  Supercar, Incredibulus (S1-I)
  Test series 22, Test model asdafds (Test-TT)
  Supercar, Ubervehicle (S1-U)
  Supercar, Road Czar (S1-C)
  Supercar, Model 1 (S1-01)

1
এমনকি আপনি যদি অপ্রিনিতযোগ্য অক্ষর এবং সতর্কতাগুলি এড়ানোর জন্য জেদ করেন তবে এটিকে অনেক খাটো করা যেতে পারে। 1. আপনার সংকুচিত ফাইলটিতে মূল ফাইলের নাম car_manufacturer.txt,। ২. এখানে স্ট্রিংটি 3 বাইট সংক্ষিপ্ত হবে। ৩. ভ্যানিলা জিজিপের পরিবর্তে জোফফ্লি ব্যবহার করা আরও 12 টি বাইট সংরক্ষণ করে।
ডেনিস

পরামর্শের জন্য ধন্যবাদ. সত্যিই এটি কিছু বাইট সংরক্ষণ করেছে। তবে চ্যালেঞ্জের মেজাজে রাখার জন্য, অলসতা জোপফ্লি বা পিএকিউ ডেটা সংক্ষেপণ প্রোগ্রামগুলির মধ্যে একটি ইনস্টল করতে নিরুৎসাহিত করেছিল। :)
LukStorms

1
এখানে স্ট্রিং যদিও একটি সহজ গল্ফ। শুধু প্রতিস্থাপন <<Lসঙ্গে <<<(base encoded stuff)
ডেনিস

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