Xkcd স্বরলিপি একটি তারিখ পড়ুন


49

তার পরিবর্তে কৌতূহল বিকল্প স্বরলিপি আইএসও 8601 স্ট্যান্ডার্ড তারিখ ফর্ম্যাট র্যান্ডাল snuck সম্পর্কে তার xkcd মধ্যে :

এখানে চিত্র বর্ণনা লিখুন

বড় সংখ্যা হ'ল সমস্ত অঙ্ক যা তাদের স্বাভাবিক ক্রমে বর্তমান তারিখে উপস্থিত হয় এবং ছোট সংখ্যাগুলি সেই অঙ্কটির সংঘটনগুলির 1-ভিত্তিক সূচক হয়। সুতরাং উপরের উদাহরণ উপস্থাপন করে 2013-02-27

আসুন যেমন একটি তারিখের জন্য একটি ASCII প্রতিনিধিত্ব সংজ্ঞায়িত করা যাক। প্রথম লাইনে 1 থেকে 4 সূচক রয়েছে contains দ্বিতীয় লাইনে "বড়" সংখ্যা রয়েছে। তৃতীয় লাইনে সূচকগুলি 5 থেকে 8 পর্যন্ত রয়েছে। যদি একক স্লটে একাধিক সূচক থাকে তবে সেগুলি ছোট থেকে বড় পর্যন্ত একে অপরের পাশে তালিকাভুক্ত হয়। যদি mএকক স্লটে সর্বাধিক সূচক থাকে (যেমন একই অঙ্কে এবং একই সারিতে), তবে প্রতিটি কলামের m+1অক্ষর প্রশস্ত এবং বাম-প্রান্তিক হওয়া উচিত :

2  3  1  4
0  1  2  3  7
5     67    8

বিপরীত রূপান্তরকরণের জন্য সহচর চ্যালেঞ্জটিও দেখুন ।

চ্যালেঞ্জ

Xkcd- স্বীকৃতিতে একটি তারিখ দেওয়া হয়েছে, সংশ্লিষ্ট ISO 8601 তারিখ ( YYYY-MM-DD) আউটপুট করুন ।

আপনি STDIN (অথবা নিকটতম বিকল্প), কমান্ড-লাইন আর্গুমেন্ট বা ফাংশন আর্গুমেন্টের মাধ্যমে ইনপুট নিয়ে কোনও প্রোগ্রাম বা ফাংশন লিখতে এবং STDOUT (বা নিকটতম বিকল্প), ফাংশন রিটার্ন মান বা ফাংশন (আউট) প্যারামিটারের মাধ্যমে ফলাফল আউটপুট করতে পারেন।

আপনি ধরে নিতে পারেন যে ইনপুটটি বছর 0000এবং 9999সমেতের মধ্যে কোনও বৈধ তারিখ ।

ইনপুটটিতে কোনও শীর্ষস্থানীয় স্পেস থাকবে না, তবে আপনি ধরে নিতে পারেন যে রেখাগুলি একটি আয়তক্ষেত্রকে ফাঁকা করে প্যাড করা হয়েছে, যার মধ্যে ফাঁকের ফাঁকে ফাঁকে ফাঁকে ফাঁকে ফাঁকে ফাঁকে ফাঁকে থাকা একটি কলাম রয়েছে।

স্ট্যান্ডার্ড বিধি প্রযোজ্য।

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

2  3  1  4
0  1  2  3  7
5     67    8
2013-02-27

2  3  1     4
0  1  2  4  5
   5  67 8
2015-12-24

     1234
1    2
5678
2222-11-11

   1     3  24
0  1  2  7  8
57    6     8
1878-02-08

2   4   1   3
0   1   2   6
5       678
2061-02-22

      1 4 2 3
0 1 2 3 4 5 6 8
6 5 7         8
3564-10-28

1234
1
5678
1111-11-11

1 2 3 4
0 1 2 3
8 5 6 7
0123-12-30

11
"কালো বিড়াল" ফর্ম্যাটে যে সমস্ত লোকেরা তারিখটি লেখেন তারা আমার অস্তিত্বের নিষিদ্ধ।
কারসিজেনিকেট

1
আমার অজ্ঞতা ক্ষমা করুন, তবে কীভাবে অদ্ভুত বিন্যাসটি তারিখের সাথে মিলবে? আমার জীবনের জন্য প্যাটার্ন কাজ করতে পারে না।
টম কার্পেন্টার

2
@ টমকার্পেন্টার নীচের এবং উপরের রেখাটি নির্দেশ করে যেখানে মধ্য লাইনের সংখ্যাগুলি তারিখে উপস্থিত হয়। যেমন 1উপরে 2, তাই প্রথম ডিজিট 22উপরে 0, তাই দ্বিতীয় সংখ্যাটি 03উপরে 1, 4উপরে আছে 3, তাই আমরা 2013প্রথম চারটি সংখ্যা হিসাবে পাই । এখন 5নিচে 0, তাই পঞ্চম ডিজিট 0, 6এবং 7উভয় থেকে কম হয় 2, তাই যারা সংখ্যা উভয় 2। এবং অবশেষে, 8নীচে 7, সুতরাং শেষ সংখ্যাটি 8, এবং আমরা শেষ করব 2013-02-27। (হাইফেনগুলি এক্স কে সি ডি সংকেতের অন্তর্নিহিত কারণ আমরা জানি যে তারা কোন অবস্থানে উপস্থিত হয়))
মার্টিন ইন্ডার

উত্তর:


8

সিজেম, 35 বাইট

ll{1$e>}*](l+eeWf%$-8>Wf=\f=2/(o'-*

এখানে চেষ্টা করুন । এটি প্রত্যাশা করে যে ইনপুট লাইনগুলি ফাঁক দিয়ে প্যাড করবে।

ব্যাখ্যা

llইনপুট দুটি লাইন পড়ে এবং {1$e>}*দ্বিতীয়টিতে একটি "স্ক্যান" সম্পাদন করে: এটি এর ইনপুটটির সমস্ত উপসর্গ গ্রহণ করে এবং প্রতিটি উপসর্গের সর্বাধিক গণনা করে। ইনপুট লাইনের জন্য "0 1 2 7 8", এটি ধাক্কা দেয় "0001112227778"। আমাদের স্ট্যাকটি এখন এর মতো দেখাচ্ছে:

"first line" '0 '0 '0 '1 '1 '1 ...

আমাদের নিজেরাই ব্যবহার করা তালিকায় মানগুলি আবার ক্যাপচার করতে হবে ]; এই আমাদের প্রথম লাইন পাশাপাশি ধারন করে, তাই আমরা এটি ফিরিয়ে পপ ব্যবহার করে (, পেতে

"0001112227778" "first line"

প্রত্যাশিত.

eelee+ এই লাইনটি অঙ্কিত করে, তৃতীয় ইনপুট লাইনের জন্য একই কাজ করে এবং ফলাফলকে সম্মতি জানায়, স্ট্যাকের শীর্ষে এই জাতীয় কিছু রেখে:

[[0 '5] [1 ' ] [2 ' ] [3 ' ] [4 ' ] [5 ' ] [6 ' ] [7 ' ] [8 '6] [9 '7] [10 '8] [11 ' ] [12 ' ]
 [0 '2] [1 ' ] [2 ' ] [3 ' ] [4 '4] [5 ' ] [6 ' ] [7 ' ] [8 '1] [9 ' ] [10 ' ] [11 ' ] [12 '3]]

এখন আমাদের স্ট্যাকটি ["0001112227778" X]যেখানে Xউপরে তালিকাভুক্ত তালিকা রয়েছে।

আমরা প্রতিটি জোড়কে X( Wf%) এ ফ্লিপ করব , জোড়গুলিকে ( $) অভিধানটি বাছাই করুন এবং শেষ 8 টি জোড়া ছেড়ে যান -8>। এটি আমাদের মতো কিছু পেয়েছে:

[['1 8] ['2 0] ['3 12] ['4 4] ['5 0] ['6 8] ['7 9] ['8 10]]

এটি কাজ করে, কারণ বাছাই 'সমস্ত সংখ্যার আগে কী (স্পেস) সহ সমস্ত জোড়কে আরোহণের ক্রমে রাখে।

এগুলি প্রথম এবং তৃতীয় লাইনের অক্ষরের " এক্স- পজিশন" 12345678: আমাদের কেবলমাত্র আমাদের (সংশোধিত) দ্বিতীয় লাইন থেকে অক্ষরগুলি পুনরুদ্ধার করতে হবে যা তাদের সাথে উল্লম্বভাবে সাজানো আছে igned

এটি করার জন্য, আমরা প্রতিটি পজিশন ( Wf=), আমাদের আগে তৈরি স্ট্রিংয়ের সূচকে নিয়ে যাই ( \f=)। আমাদের "20610222"এখন স্ট্যাকের মধ্যে রয়েছে: ড্যাশগুলি যুক্ত করতে প্রথমে আমরা দৈর্ঘ্যের দুটি (2 2/) অংশগুলিতে বিভক্ত হয়ে একটি নতুন লাইন ( (o) ছাড়াই প্রথম বিভাগটি মুদ্রণ করি এবং বাকী অংশগুলিকে ড্যাশ ( '-*) দিয়ে যুক্ত করি।

সম্পাদনা : দুর্দান্ত স্ক্যান ট্রিক, মার্টিন! চারটি বাইট সংরক্ষণ করেছেন।

সম্পাদনা 2 : প্রতিস্থাপন করে আরও দুটি বাইট সংরক্ষণ eelee+করা l+ee; এই কাজ করে, কারণ লাইন সব একই লেন্থ আছে, এবং CJam তালিকায় ইন্ডেক্স স্বয়ংক্রিয়ভাবে হয় তালিকার দৈর্ঘ্যে modulo, তাই সূচকের n+0, n+1, n+2... চমত্কারভাবে ম্যাপ 0, 1, 2...

সম্পাদনা 3 : মার্টিন প্রক্রিয়াটির চূড়ান্ত পদক্ষেপে আরও একটি বাইট সংরক্ষণ করেছিল। নিস!


6

পাইথ, 48 43

j\-cj\-ctuuXN.xsTZK?qJhtHdKJ+hHeHGC.z*9d4 7

পরীক্ষা স্যুট

একটি আয়তক্ষেত্রের ফাঁকা জায়গাগুলির সাথে প্যাডিং প্রয়োজন।

আমি মনে করি না এটি সর্বোত্তম পন্থা, তবে মূলত এটি শীর্ষ বা নীচের মানের দ্বারা নির্দেশিত স্ট্রিংয়ে সূচকে মাঝারি মানটি লিখে। ভাল আমি অনুমান করি যে বেশিরভাগ সুস্পষ্ট স্টাফ দেখেছি আমার গল্ফ করার যথেষ্ট সময় ছিল। : P: P


4

জাভাস্ক্রিপ্ট (ES7), 115

বেনামে ফাংশন। টেম্পলেট স্ট্রিংগুলি ব্যবহার করে একটি নতুন লাইন রয়েছে যা স্বাক্ষরকারী এবং বাইট গণনায় অন্তর্ভুক্ত।

প্রয়োজনীয়তা: মাঝের ইনপুট লাইনটি প্রথম বা শেষের চেয়ে কম হওয়া যায় না। যখন ইনপুটটি একটি আয়তক্ষেত্র গঠনের জন্য ফাঁকা স্থানগুলি দিয়ে প্যাড করা হয় তখন এই প্রয়োজনীয়তাটি সন্তুষ্ট হয়।

x=>([a,z,b]=o=x.split`
`,d=i=0,[for(c of z)o[a[i]-1]=o[b[i++]-1]=d=+c||d],o.splice(4,2,'-',o[4],o[5],'-'),o.join``)

ES6 সংস্করণ 117 অ্যারে বোঝার পরিবর্তে .map ব্যবহার করে

x=>([a,z,b]=o=x.split`
`,d=0,[...z].map((c,i)=>o[a[i]-1]=o[b[i]-1]=d=+c||d],o.splice(4,2,'-',o[4],o[5],'-'),o.join``)

কম গল্ফড

x=>(
  o=[],
  [a,z,b] = x.split`\n`,
  d=i=0,
  [ for(c of z) (
      d = +c||d, // each new digit found in z goes in d (but not the spaces and not the '0' (d starts at 0 anyway)
      o[a[i]-1] = o[b[i]-1] = d, // if the index char is space, that gives index -1 that is ignored when joining later
      ++i
  )],
  o.splice(4,2,'-',o[4],o[5],'-'), // add the dashes in the right places
  o.join``
)

পরীক্ষার স্নিপেট

f=x=>(
  [a,z,b]=o=x.split`\n`,
  d=i=0,[for(c of z)o[a[i]-1]=o[b[i++]-1]=d=+c||d],
  o.splice(4,2,'-',o[4],o[5],'-'),o.join``
)


console.log=x=>O.textContent+=x+'\n';

[['2  3  1  4\n0  1  2  3  7\n5     67    8','2013-02-27']
,['2  3  1     4\n0  1  2  4  5\n   5  67 8','2015-12-24']
,['      1234\n1     2   \n5678','2222-11-11']
,['   1     3  24\n0  1  2  7  8 \n57    6     8','1878-02-08']
,['2   4   1   3\n0   1   2   6  \n5       678','2061-02-22']
,['      1 4 2 3\n0 1 2 3 4 5 6 8\n6 5 7         8','3564-10-28']
,['1234\n1   \n5678','1111-11-11']
,['1 2 3 4\n0 1 2 3\n8 5 6 7','0123-12-30']]
.forEach(t=>(k=t[1],r=f(t[0]),console.log(t[0]+'\n'+r+'\n'+(r==k?'OK\n':'Fail\n'))))
<pre id=O></pre>


উভয় চ্যালেঞ্জ সমাধান করার ক্ষেত্রে প্রথম হওয়ায় অভিনন্দন। :)
মার্টিন এন্ডার

3

হাস্কেল, 125 106 103 বাইট

a#' '=a
a#b=b
f i|[a,b,c]<-('-':)<$>lines i=[o|m<-"1234-56-78",(n,o,p)<-zip3 a(scanl1(#)b)c,m==n||m==p]

পূর্ণ আয়তক্ষেত্রের সাথে ফাঁকা স্থানের প্যাডিংয়ের প্রয়োজন।

ব্যবহারের উদাহরণ: f " 1 3 24\n0 1 2 7 8 \n57 6 8 "-> "1878-02-08"

কিভাবে এটা কাজ করে:

[a,b,c]<-('-':)<$>lines i          -- split input into lines, prepend a '-' to
                                   -- each, call them a, b and c
               (scanl1(#)b)        -- fill spaces of the middle line with the
                                   -- previous char, e.g.
                                   -- "-0  1  2  7  8 " -> "-00011122277788"
        zip3 a (scanl...) c        -- combine the lines element wise into triples.
                                   -- This is our lookup table for "1234-56-78" 
o|m<-"1234...",  (n,o,p)<-zip...,  m==n||m==p
                                   -- whenever m equals n or p (i.e. was originally
                                   -- in the first or last line), take the
                                   -- corresponding char o (middle line)


1

পার্ল, 154 বাইট

sub{$_=$_[1];@n=/\d/g;/ +/;map{map{$p[$i++].=$_}unpack"(a$+[0])*";$i=0}@_[0,2];map{map{$r[$_-1]=$n[$i]if/\d/}s plit$"='';$i++}@p;"@r"=~s/....\K(..)/-$1-/r}

অবহেলিত এবং ব্যাখ্যা

sub{
    $_=$_[1]; # $_[1] is 2nd argument (i.e., 2nd line)
    @n=/\d/g; # @n now contains all digits in 2nd line
    / +/;     # $+[0] now the chunk length in 2nd line
              # Equivalent to /( +)/;$l = 1 + length $1;
    map{      # Perl golfer's for-loop
        map{ 
            $p[$i++] .= $_    # @p contains positions of each digit
        } unpack "(a$+[0])*"; # Split line into same chunk width
        $i=0 # At end of loop so we don't need $i=0 before next one
    } @_[0,2];# Outer map works on 1st and 3rd lines
    map{
        map{
            # Shove $n[$i] into ($_-1)th slot in @r if $_ is a number
            $r[$_-1] = $n[$i] if /\d/
        } split $"=''; # Equivalent to split '', but sets $"='' for free
        $i++
    }@p;
    # Concatenate @r, convert 20130227 to 2013-02-27, and return
    "@r"=~s/....\K(..)/-$1-/r
};

0

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

s=>[...(r=[,,,,"-",,,"-"],l=s.split`
`)[1]].map((c,i)=>(c>"-"?n=c:0,y=+l[0][i],d=+l[2][i],y?r[y-1]=n:0,d?r[d+(d>6)]=n:0))&&r.join``

ব্যাখ্যা

একটি আয়তক্ষেত্র গঠনের জন্য ফাঁকা জায়গাগুলি দিয়ে ইনপুট লাগানো দরকার।

s=>
  [...(
    r=[,,,,"-",,,"-"], // r = array of result characters, prefill with "-" symbols
    l=s.split`
`                      // l = array of lines
  )[1]].map((c,i)=>(   // for each character on the middle line
    c>"-"?n=c:0,       // n = the most recent digit encountered
    y=+l[0][i],        // y = index on the year line at the current position
    d=+l[2][i],        // d = index on the date line at the current position
    y?r[y-1]=n:0,      // if y is a number, put n at the index y of the result
    d?r[d+(d>6)]=n:0   // if d is a number, put n at the index d (accounting for "-"s)
  ))
  &&r.join``           // return the result as a string

পরীক্ষা


0

পাওয়ারশেল, 119 বাইট

$r=,'-'*99
($a=$args-split'
')[1]|% t*y|%{if($_-32){$d=$_}
$a[0,2]|%{$r[$_[+$p]-48]=$d}
$p++}
-join$r[1..4+0+5+6+0+7+8]

অসম্পূর্ণ পরীক্ষা স্ক্রিপ্ট:

$f = {

$r=,'-'*99                       # init a result as an array of '-' repeated 99 times
($a=$args-split"`n")[1]|% t*y|%{ # split argument string, store a top, middle and bottom to $a, then for each char of the middle line...
    if($_-32){$d=$_}             # store a digit to $d if the current character of the middle is not a space
    $a[0,2]|%{                   # for the top and the bottom lines...
        $r[$_[+$p]-48]=$d        # store a digit to the result array
    }                            # Note: if char in the current position is a space, then expression $_[+$p]-48 less then 0.
                                 # In this case, the expression $r[32-48]=$d changes unused element in a end of the array.
                                 # That is why the array was created by a large.
    $p++                         # next position
}
-join$r[1..4+0+5+6+0+7+8]        # return joined char with specified numbers
                                 # Note: element with index 0 has value '-'
}

@(
,(@"
2  3  1  4   
0  1  2  3  7
5     67    8
"@,"2013-02-27")

,(@"
2  3  1     4
0  1  2  4  5
    5  67 8  
"@,"2015-12-24")

,(@"
     1234
1    2   
5678     
"@,"2222-11-11")

,(@"
1     3  24
0  1  2  7  8 
57    6     8 
"@,"1878-02-08")

,(@"
2   4   1   3
0   1   2   6
5       678  
"@,"2061-02-22")

,(@"
      1 4 2 3  
0 1 2 3 4 5 6 8
6 5 7         8
"@,"3564-10-28")

,(@"
1234
1   
5678
"@,"1111-11-11")

,(@"
1 2 3 4
0 1 2 3
8 5 6 7
"@,"0123-12-30")

) | % {
    $a,$expected = $_
    $result = &$f $a
    "$(""$result"-eq"$expected"): $result"
}

আউটপুট:

True: 2013-02-27
True: 2015-12-24
True: 2222-11-11
True: 1878-02-08
True: 2061-02-22
True: 3564-10-28
True: 1111-11-11
True: 0123-12-30

0

জেলি , 38 বাইট

Ỵṙ-Zn⁶Ṫ€œṗƊḊZḟ⁶V€$€;2/p/Ʋ€ẎṢṪ€s2Ḣ;jɗ”-

এটি অনলাইন চেষ্টা করুন!

সাহায্যকারী কেবল ইনপুট সহজ করার জন্য আছে; এটি আসলে একটি সম্পূর্ণ প্রোগ্রাম। যত্ন নিতে ভুলবেন না :

  • প্রথম এবং শেষ লাইনগুলি ( ''') পাশাপাশি তাদের পাশের লাইনগুলি (খালি, স্পষ্টতার জন্য)।
    • আসল ইনপুট ফর্ম্যাটটিতে দ্বিতীয় এবং পেনাল্টিমেট খালি লাইন নেই এবং স্ট্রিংটি সরাসরি উদ্ধৃতিগুলির পরে শুরু হয় এবং এর মধ্যে একটি নতুন লাইন থাকে না:
      '' '1 3 24
      0 1 2 7 8 
      57 6 8 '' '
      এই ফর্ম্যাটটি ব্যবহার করার সময় আপনি পাদলেখ রেখে যেতে পারেন। এটি সত্যই পাইথন মাল্টি-লাইন স্ট্রিং এবং কিছু ইনপুটগুলির জন্য উদ্ধৃতিগুলি প্রয়োজনীয়।
  • পেছনে ফাঁকা স্থান সহ ইনপুট! সঠিকভাবে প্যাডযুক্ত ইনপুট ব্যতীত কোনও সঠিক আউটপুট সম্পূর্ণ কাকতালীয় এবং এটি আমার দ্বারা অনুমোদিত নয়।
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.