একটি তারিখকে xkcd স্বরলিপিতে রূপান্তর করুন


26

তার পরিবর্তে কৌতূহল বিকল্প স্বরলিপি আইএসও 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

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

চ্যালেঞ্জ

একটি আইএসও 8601 তারিখ ( YYYY-MM-DD) দেওয়া হয়েছে, সম্পর্কিত xkcd তারিখ চিহ্নিতকরণ আউটপুট করুন।

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

থেকে কোন বছর 0000থেকে 9999বৈধ ইনপুট হয়।

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

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

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

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

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

2222-11-11
     1234
1    2
5678

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

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

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

1111-11-11
1234
1
5678

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

উত্তর:


1

পাইথ, 86 78 বাইট

JS{K-z\-=GheS.nmmlkd=N,mf<T5d=ZmmhkxdcK1Jmf>T4dZjbmjkmj"".[|k\ \ Gd[hNm]dcJ1eN

আমার মস্তিষ্ক সুস্থ হওয়ার সাথে সাথে আমি এটিকে গলফ করার চেষ্টা করব। আমি এটি কাজ দেখে খুশি হয়েছিল।


5

জাভাস্ক্রিপ্ট (ES6), 168 173

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

d=>d.replace(/\d/g,c=>m=(l=((o[c]=o[c]||[b,c,b])[p/2&~1]+=++p).length)>m?l:m,t=[m=p=b='',b,b],o=[])&o.map(x=>x&&x.map((x,i)=>t[i]+=(x+'     ').slice(0,m+1)))||t.join`
`

কম গল্ফড

f=d=>(
  // get the indices in o and the columns width in m
  m=0,
  p=0,
  o=[],
  d.replace(/\d/g,c=>(
    o[c] = o[c]||['',c,''], // for each found digit :array with top indices, digit, bottom indices
    o[c][p/2 & ~1] += ++p, // (p/2 and not 1) maps 0..3 to 0, 4..7 to 2
    l = o[c].length,
    m = l>m ? l : m // max indices string length in m 
  )),
  // build the output in t
  t=['','',''],
  o.map(x=> x && x.map(
    (x,i) => t[i]+=(x+'     ').slice(0,m+1)) // left justify, max value of m is 4
  ),
  t.join`\n` // return output as a newline separated string
)   

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

f=d=>
  d.replace(/\d/g,c=>m=(l=((o[c]=o[c]||[b,c,b])[p/2&~1]+=++p).length)>m?l:m,t=[m=p=b='',b,b],o=[])&
  o.map(x=>x&&x.map((x,i)=>t[i]+=(x+'     ').slice(0,m+1)))
  ||t.join`\n`


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

;['2013-02-27','2015-12-24','2222-11-11','1878-02-08','2061-02-22','3564-10-28','1111-11-11']
.forEach(t=>console.log(t+'\n'+f(t)+'\n'))
<pre id=O></pre>


ওহ, ভাল অতিরিক্ত পরীক্ষার কেস আমি উভয় চ্যালেঞ্জ এ যোগ করব।
মার্টিন এন্ডার

4

রুবি, 200 195 189 178 162 157 টি অক্ষর

(156 অক্ষর কোড + 1 অক্ষর কমান্ড লাইন বিকল্প)

o={}
i=0
$_.gsub(/\d/){o[$&]||=['','']
o[$&][i/4]+="#{i+=1}"}
o=o.sort.map &:flatten
puts [1,0,2].map{|i|o.map{|c|c[i].ljust o.flatten.map(&:size).max}*' '}

নমুনা রান:

bash-4.3$ ruby -n xkcd-date.rb <<< '2013-02-27'
2  3  1  4    
0  1  2  3  7 
5     67    8 

bash-4.3$ ruby -n xkcd-date.rb <<< '2222-11-11'
     1234
1    2   
5678     

bash-4.3$ ruby -n xkcd-date.rb <<< '3564-10-28'
      1 4 2 3  
0 1 2 3 4 5 6 8
6 5 7         8

2

পাইথন 2.7, 308 310 বাইট

i=raw_input().replace("-","")
s,w=sorted(set(i)),len
x,m={},0
for c in s:
    q,v=i,[""]*2
    while c in q:a=str(-~q.index(c)+(w(i)-w(q)));v[int(a)>4]+=a;q=q[q.index(c)+1:]
    m,x[c]=max(m,max(map(w,v))),v
for l in[0,1]:print"".join((lambda x:x+(-~m-w(x))*" ")("".join(x[n][l]))for n in s)+"\n"+(" "*m).join(s)*(-l+1)

বাহ, এটি ঠিক করা কেবলমাত্র 2 বাইট!

তারিখটি আলাদা করতে হবে না, তারিখটি কোনও দৈর্ঘ্য হতে পারে, এটির একটি তারিখ হতে হবে না, এটি কোনও স্ট্রিং হতে পারে (তবে ড্যাশগুলি সরানো হবে)। মাঝের অংশটি আমার কাছে বেশ গল্ফাল দেখাচ্ছে।


1

সি #, 456

Golfed:

string  x(string p){string s=p.Replace("-", ""),a="",d="",e="";var u=new Dictionary<char,List<int>>();for(int i=0;i<s.Length;i++)if(u.ContainsKey(s[i]))u[s[i]].Add(i+1);else u.Add(s[i],new List<int>{i+1});foreach (var c in u.Keys.OrderBy(k=>k)){var t=String.Join("",u[c].Where(i=>i<5));var b=String.Join("",u[c].Where(i=>i>4));var l=Math.Max(t.Length,b.Length);var m=c+"".PadRight(l);a+=t.PadRight(l)+" ";e+=m;d+=b.PadRight(l)+" ";}return a+"\n"+e+"\n"+d;}

Ungolfed:

string  x(string p)
    {
        string s = p.Replace("-", ""),a = "", d = "", e = "";;
        var u = new Dictionary<char, List<int>>();
        for (int i = 0; i < s.Length; i++) if (u.ContainsKey(s[i])) u[s[i]].Add(i + 1); else u.Add(s[i], new List<int>{ i + 1 });            
        foreach (var c in u.Keys.OrderBy(k => k))
        {
            var t = String.Join("", u[c].Where(i => i < 5));
            var b = String.Join("", u[c].Where(i => i > 4));
            var l = Math.Max(t.Length, b.Length);
            var m = c + "".PadRight(l);
            a += t.PadRight(l) + " ";
            e += m;
            d += b.PadRight(l) + " ";
        }
        return a + "\n" + e + "\n" + d;            
    }

1

পার্ল 6, 265 বাইট

Golfed

my$i=get;$i~~s:g/\-//;my@b=$i.comb.unique.sort;my$f={$i.comb[$_[1]-1]eq$_[0]??$_[1]!!''};my$g={[~] .map: $f};my$h={(@b X @^a).rotor(4).map: $g}my@a=$h(1..4);my@c=$h(5..8);my$s=max(|@a».chars,|@c».chars)+1;my$x='%-'~$s~'s';for @a,@b,@c {say [~] @_.map: *.fmt($x)}

অবরুদ্ধ (সামান্য)

my $i = get;
$i ~~ s:g/\-//;
my @b = $i.comb.unique.sort;
my $f = { $i.comb[$_[1]-1] eq $_[0] ?? $_[1] !! '' };
my $g = { [~] .map: $f };
my $h = { (@b X @^a).rotor(4).map: $g }
my @a = $h(1..4);
my @c = $h(5..8);
my $s = max(|@a».chars, |@c».chars)+1;
my $x = '%-'~$s~'s';
for @a,@b,@c { say [~] @_.map: *.fmt($x) }

1

পাইথন 3, 306 বাইট

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

j=''.join
def t(d):
 c,*l={},;i,*n=0,
 for e in d.replace('-',''):
  i+=1
  try:c[e]+=[i]
  except:c[e]=i,
 m=sorted(c)
 for x in m:
  l+=[j(str(p)for p in c[x]if p<5)]
  n+=[j(str(p)for p in c[x]if p>4)]
 f='<'+str(max(map(len,l+n)))
 return'\n'.join(map(lambda o:' '.join(format(i,f)for i in o),(l,m,n)))

1
''.joinআপনি একটি পরিবর্তনশীল সংরক্ষণ করতে পারেন না ?
ডেনিস

@ ডেনিস: হু আমি ভাবছি কেন আমি কখনই তা ভেবে দেখিনি। সম্ভবত আমি অবচেতনভাবে ''.join(...)যেমন আচরণ করছিলাম তখন এর join('',...)পরিবর্তে একটি ফাংশন হিসাবে "সংরক্ষণ" করা দরকার।
টিম পেডারিক

1
আমার মনে হয় +=[i]হতে পারে +=i,
জোনাথন ফ্রেচ

1
return '\n'-> return'\n'
জোনাথন ফ্রেচ

1
@ টিমপিডেরিক আপনি কি নিশ্চিত ? (কমা নোট করুন!)
জোনাথন ফ্রেচ

0

পাওয়ারশেল, 174 170 168 167 বাইট

$a=@{}
$args|% t*y|?{$_-45}|%{if(!$a.$_){$a.$_="","","$_"}$a.$_[++$i-gt4]+=$i}
0,2,1|%{$r=$_
-join($a.Keys|sort|%{$a.$_[$r]}|% p*ht(1+($a|% v*|%{$_|% l*h}|sort)[-1]))}

কম গল্ফ পরীক্ষা স্ক্রিপ্ট:

$f = {

$a=@{}                              # a hash table for a result
$args|% toCharArray|?{$_-45}|%{     # for each digit from argument strings except a '-'
    if(!$a.$_){$a.$_="","","$_"}    #   create an array if there are no values for the current digit
    $a.$_[++$i-gt4]+=$i             #   append the character to the relative row (0 - top, 1 - bottom) and increment position number
}                                   # the result is a hash table in which the key is a char of a digit and the value is an array of string
                                    # for example, first lines for the first test case:
                                    # @{
                                    #     [char]48: ("2","5","0")
                                    #     [char]49: ("3","","1")
                                    #     [char]50: ("1","67","2")
                                    #     ...
                                    # }
$l=1+($a|% Values|%{$_|% Length}|sort)[-1]      # calc the maximum width of strings
0,2,1|%{                            # for each number 0,2,1
    $r=$_                           # store it as row number
    -join(
        $a.Keys|sort|               # for each keys (digit of the dates) in the sorted order
            %{$a.$_[$r]}|           # push to pipe the relative string
            % padRight $l           # for which to execute the 'padright' method to pad with spaces
    )                               # and finally join the row
}

}

@(

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

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

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

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

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

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

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

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

) | % {
    $d, $expected = $_
    $result = &$f $d

    $d
    $j=0
    $result|%{
        "$($_.trimEnd() -eq $expected[$j].TrimEnd()): |$_|"   # Vertical bars only to see trailing and leading spaces
        $j++
    }
}

আউটপুট (কেবল অনুসরণের এবং শীর্ষস্থানীয় স্থানগুলি দেখতে উল্লম্ব বারগুলি):

2013-02-27
True: |2  3  1  4     |
True: |0  1  2  3  7  |
True: |5     67    8  |
2015-12-24
True: |2  3  1     4  |
True: |0  1  2  4  5  |
True: |   5  67 8     |
2222-11-11
True: |     1234 |
True: |1    2    |
True: |5678      |
1878-02-08
True: |   1     3  24 |
True: |0  1  2  7  8  |
True: |57    6     8  |
2061-02-22
True: |2   4   1   3   |
True: |0   1   2   6   |
True: |5       678     |
3564-10-28
True: |      1 4 2 3   |
True: |0 1 2 3 4 5 6 8 |
True: |6 5 7         8 |
1111-11-11
True: |1234 |
True: |1    |
True: |5678 |
0123-12-30
True: |1 2 3 4 |
True: |0 1 2 3 |
True: |8 5 6 7 |
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.