एक तिथि को xkcd संकेतन में बदलें


26

आईएसओ 8601 मानक तिथि प्रारूप के बारे में अपने एक्सकेडीएन में रान्डेल ने उत्सुक वैकल्पिक संकेतन में झपकी ली:

यहाँ छवि विवरण दर्ज करें

बड़ी संख्या वे सभी अंक हैं जो वर्तमान तिथि में अपने सामान्य क्रम में दिखाई देते हैं, और छोटी संख्याएं उस अंक की घटनाओं के 1-आधारित सूचक हैं। तो उपरोक्त उदाहरण का प्रतिनिधित्व करता है 2013-02-27

आइए ऐसी तारीख के लिए ASCII प्रतिनिधित्व को परिभाषित करें। पहली पंक्ति में सूचक 1 से 4 होते हैं। दूसरी पंक्ति में "बड़े" अंक होते हैं। तीसरी पंक्ति में सूचकांकों 5 से 8 हैं। यदि एकल स्लॉट में कई सूचकांक हैं, तो वे एक-दूसरे के बगल में सबसे छोटे से सबसे बड़े तक सूचीबद्ध हैं। यदि mएक ही स्लॉट (यानी एक ही पंक्ति में) पर अधिकांश सूचकांकों में हैं, तो प्रत्येक कॉलम में m+1वर्ण चौड़े और बाएं-संरेखित होने चाहिए :

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

विपरीत रूपांतरण के लिए साथी चुनौती भी देखें ।

चुनौती

एक आईएसओ 8601 तिथि ( YYYY-MM-DD) को देखते हुए , इसी एक्सकेडब्लू तिथि अंकन का उत्पादन करें।

आप STDIN (या निकटतम विकल्प), कमांड-लाइन तर्क या फ़ंक्शन तर्क के माध्यम से इनपुट ले रहे हैं और STDOUT (या निकटतम विकल्प), फ़ंक्शन रिटर्न मान या फ़ंक्शन (आउट) पैरामीटर के माध्यम से परिणाम लिख सकते हैं।

से किसी भी वर्ष 0000के लिए 9999मान्य इनपुट है।

अनुगामी रिक्त स्थान की अनुमति है, प्रमुख स्थान नहीं हैं। आप वैकल्पिक रूप से एक एकल अनुगामी न्यूलाइन का उत्पादन कर सकते हैं।

मानक नियम लागू होते हैं।

परीक्षण के मामलों

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

जावास्क्रिप्ट (ईएस 6), 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('',...), जिसके बजाय एक फ़ंक्शन के रूप में "सहेजे" जाने की आवश्यकता होगी।
टिम पैडरिक 21:15

1
मुझे लगता है कि +=[i]हो सकता है +=i,
जोनाथन फ्रीच

1
return '\n'-> return'\n'
जोनाथन फ्रेच

1
@TimPederick क्या आपको यकीन है ? (कॉमा पर ध्यान दें!)
जोनाथन फ्रीच

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 |
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.