8 के बहुत सारे पाने के लिए संख्याओं को जोड़ने का सही तरीका


16

इस प्रश्न से प्रेरित होकर , जिसे इस एक से प्रेरित किया गया था , एक प्रोग्राम लिखें जो दो पूर्णांक लेता है और उन्हें एक अनोखे तरीके से जोड़ता है, 7 खंडों के डिस्प्ले में उन्हें प्रदर्शित करने के लिए उपयोग किए गए सेगमेंट पर एक OR ऑपरेशन करके। संदर्भ के लिए, अंकों को निम्नलिखित तरीके से दर्शाया जाता है:

 _        _   _         _    _   _    _    _
| |   |   _|  _|  |_|  |_   |_    |  |_|  |_|
|_|   |  |_   _|    |   _|  |_|   |  |_|   _| 

ध्यान दें कि 1 दाईं ओर दो खंडों का उपयोग करता है, बाईं ओर नहीं। दो विशेष वर्ण हैं जो इस तरह से निर्मित किए जा सकते हैं जो संख्या नहीं हैं। नीचे दी गई अतिरिक्त तालिका देखें:

  | 0 1 2 3 4 5 6 7 8 9
--+--------------------
0 | 0 0 8 8 8 8 8 0 8 8
1 | 0 1 a 3 4 9 8 7 8 9
2 | 8 a 2 a 8 8 8 a 8 8
3 | 8 3 a 3 9 9 8 3 8 9
4 | 8 4 8 9 4 9 8 Q 8 9
5 | 8 9 8 9 9 5 6 9 8 9
6 | 8 8 8 8 8 6 6 8 8 8
7 | 0 7 a 3 Q 9 8 7 8 9
8 | 8 8 8 8 8 8 8 8 8 8
9 | 8 9 8 9 9 9 8 9 8 9

उपयोगी अवलोकन:

  • कोई भी अंक प्लस खुद ब खुद समान हो जाता है
  • 8 प्लस कोई अंक 8 के बराबर है
  • 2 प्लस 1, 3, या 7 अक्षर 'a' के बराबर है (लोअर-केस होना चाहिए)
  • 4 प्लस 7 आपकी पसंद 'क्यू' या 'क्यू' के बराबर है
  • संख्याएं दाएं-संरेखित होनी चाहिए, इसलिए अंकों को दाएं से बाएं जोड़ा जाना चाहिए। यदि एक संख्या में दूसरे की तुलना में अधिक अंक हैं, तो शुरुआत में अतिरिक्त अंक अपरिवर्तित होने चाहिए। कोई अग्रणी 0 नहीं हैं, जब तक कि संख्या ठीक 0 न हो।
  • सभी नंबर 0 या अधिक होंगे। आपको '-' चिन्ह को संभालने की आवश्यकता नहीं है। (मुख्यतः क्योंकि '-' और '1' या '7' के योग के लिए कोई अच्छा योग नहीं है।)

आपके प्रोग्राम को आपके द्वारा चुने गए किसी भी प्रारूप में 2 पूर्णांक को स्वीकार करना चाहिए, और इस तरह से गणना किए जाने पर एक स्ट्रिंग को उनके "योग" से आउटपुट करना चाहिए। यह कोड-गोल्फ है, इसलिए आपका कार्यक्रम जितना संभव हो उतना छोटा होना चाहिए।

उदाहरण:

  • इनपुट: 12345, 123. आउटपुट: 12389
  • इनपुट: 88888, 42. आउटपुट: 88888
  • इनपुट: 0, 23. आउटपुट: 28
  • इनपुट: 120, 240. आउटपुट: a80
  • इनपुट: 270, 42. आउटपुट: 2Q8 (या 2q8)
  • इनपुट: 1234567890, 1234567890. आउटपुट: 1234567890

4
दिलचस्प चुनौती है, लेकिन यह कुछ परीक्षण मामलों का उपयोग कर सकता है ताकि लोग अपने उत्तरों को मान्य कर सकें।
AdmBorkBork

3
Qलोअरकेस नहीं होना चाहिए? वास्तविक आकार एक के qबजाय दिखता हैQ
लुइस मेंडो

क्या इनपुट पूर्णांक एकल-अंक, अंकों की सीमित संख्या या असीमित होगा?
डिजिटल ट्रॉमा

1
@LuisMendo - मुझे लगता है कि यह किसी भी तरह से जा सकता है। मैं आपके विवेक तक छोड़ दूँगा। aनिश्चित रूप से छोटे अक्षर हालांकि होना चाहिए, के बाद से Aदिखता है पूरी तरह से अलग।
डारेल हॉफमैन

2
@ Adám - हाँ, मैंने इसके बारे में सोचा था, लेकिन यह सोचा नहीं कि हर कोई अपनी पसंद की गोल्फ भाषाओं में यूनिकोड वर्णों तक पहुँच पाता है, इसलिए उनसे अपेक्षा करना अनुचित होगा कि वे इसे संभाल लें।
डारेल हॉफमैन

जवाबों:


7

बैश + आम लिनक्स उपयोगिताओं, 80

s=~0my3[_p^?{}s
h()(tr 0-9 $s<<<$1|xxd -p)
dc -e$[0x`h $1`|0x`h $2`]P|tr $s 0-9aQ

^?स्रोत में नोट को ASCII 0x7f वर्ण से बदला जाना चाहिए।

स्ट्रिंग sप्रत्येक 7 सेगमेंट अंक है 0-9, a, Qजो प्रत्येक ASCII चार के एक बिट से संबंधित प्रत्येक खंड के साथ एन्कोडेड है।

h()समारोह एन्कोडिंग द्वारा निर्दिष्ट दशमलव से इनपुट संख्या transliterates s, तो एक कच्चे हेक्स स्ट्रिंग के रूप में परिणाम आउटपुट।

दो जिसके परिणामस्वरूप कच्चे हेक्स तार कर रहे हैं ORद्वारा नियमित रूप से बैश गणित, तो उत्पादन का उपयोग कर एक साथ एड dcकी Pएक bytestream के रूप में आदेश। इस बाइटस्ट्रीम को फिर दशमलव + ए + क्यू और आउटपुट में बदल दिया जाता है।

यह भी ध्यान दें कि जब <<<फंक्शन में बैश हेस्ट्रिंग कंस्ट्रक्शन का उपयोग किया जाता है, तो इसे नए सिरे h()से रीडायरेक्टेड स्ट्रिंग में जोड़ दिया जाता है। इससे कोई फर्क नहीं पड़ता - यह बस 0x0aप्रत्येक हेक्स स्ट्रिंग के अंत में अनुवादित है ; जब दो हेक्स संख्याओं को ORएक साथ संपादित किया जाता है, तो परिणाम अभी भी 0x0aअंतिम वर्ण में होता है जो कि अनुवादित नहीं होता है और इस प्रकार बस एक नई पंक्ति में वापस आ जाता है जो परिणाम के बाद आउटपुट होता है।

परीक्षण उत्पादन:

$ for testcase in \
> "12345 123" \
> "88888 42" \
> "0 23" \
> "1234 56789" \
> "4 7"; do 
> ./7segadd.sh $testcase
> done
12389
88888
28
58a89
Q
$ 

1
मैं आगे जाऊंगा और इसे पुरस्कार दूंगा क्योंकि कोई भी इस बार कोशिश नहीं कर रहा है।
डारेल हॉफमैन

धन्यवाद डारेल - यह एक मजेदार, दिलचस्प चुनौती थी। यदि आप अधिक उत्तर चाहते हैं, तो आप उस पर एक इनाम लगाने पर विचार कर सकते हैं।
डिजिटल ट्रामा

नहीं, मेरे पास इस साइट पर पर्याप्त प्रतिनिधि नहीं है, जो इसे बाउंसियों पर खर्च करने जा रहा है। (मैं इस एक का भी परीक्षण नहीं कर सकता, क्योंकि मैं लिनक्स नहीं चला रहा हूं, मैं सिर्फ समुदाय को संदेह का लाभ दे रहा हूं।) मैं किसी भी तरह एक प्रश्न के आधार पर इसे एक साथ फेंक देता हूं।
डारेल हॉफमैन

3

पायथन 2, 155 बाइट्स

def f(a,b):exec"a=[ord('?(u|j^_,♥~'[int(c)])for c in a];a=max(len(b)-len(a),0)*[0]+a;a,b=b,a;"*2;print`['214567q3a980'[(c|d)%13]for c,d in zip(a,b)]`[2::5]

एक DELचरित्र (0x7F) के साथ बदलें ।

कॉलिंग f("12345", "123")प्रिंट 12389


मूल्यों के तीन सेट हैं जिनके लिए यह %13चाल काम करती है। स्पष्ट रूप से आप उस सेट के लिए गए थे जिसमें 40 से नीचे कोई वर्ण नहीं था, लेकिन मेरे जावास्क्रिप्ट अनुवाद के लिए मैंने सबसे छोटा सेट चुना। तीसरा सेट जावास्क्रिप्ट में सबसे लंबा है, यह होता 111,5,118,117,29,121,123,37,127,125
नील

2

जावास्क्रिप्ट (ईएस 6), 158 144 बाइट्स

f=(s,t)=>t[s.length]?f(t,s):s[t.length]?f(s,' '+t):s.replace(/./g,(c,i)=>"540q9361278a"[(a[c]|a[t[i]])%13],a=[119,20,47,31,92,91,123,22,127,95])

बेशर्मी से @ लिन की %13चाल से 14 बाइट्स बचाए ।

f=(s,t)=>t[s.length]?f(t,s):s[t.length]?f(s,' '+t):s.replace(/./g,(c,i)=>"540q9361278a"[(a[c]|a[t[i]])%13],a=[119,20,47,31,92,91,123,22,127,95])
;o.textContent=[...s="0123456789"].map(c=>f(c.repeat(10),s)).join`
`;
<pre id=o></pre>


1

जावा, 170 बाइट्स

यह बहुत लंबा है ... लेकिन यह वैसे भी जावा है।

String A(int a,int b){String c="|HgmY=?h}oy",r="";for(;a>0|b>0;a/=10,b/=10)r="0123456789aq".charAt(c.indexOf((a>0?c.charAt(a%10):0)|(b>0?c.charAt(b%10):0)))+r;return r;}

पूर्ण कार्यक्रम, असंगठित कोड के साथ

public class Q80716 {
    String A(int a,int b){String c="|HgmY=?h}oy",r="";for(;a>0|b>0;a/=10,b/=10)r="0123456789aq".charAt(c.indexOf((a>0?c.charAt(a%10):0)|(b>0?c.charAt(b%10):0)))+r;return r;}
    String Add(int a,int b){
        String c = "|HgmY=?h}oy", d = "0123456789aq";
        String r = "";
        for(;a>0|b>0;a/=10,b/=10){
            r = d.charAt(c.indexOf((a>0?c.charAt(a%10):0)|(b>0?c.charAt(b%10):0))) + r;
        }
        return r;
    }
    public static void main(String[]args){
        int[][] testcases = new int[][]{
            {12345,123},
            {88888,42},
            {0,23},
            {120,240},
            {270,42},
            {1234567890,1234567890}
        };
        for(int i=0;i<testcases.length;i++){
            System.out.println(new Q80716().Add(testcases[i][0],testcases[i][1]));
            System.out.println(new Q80716().A(testcases[i][0],testcases[i][1]));
        }
    }
}

सभी आउटपुट (सभी एक बार दोहराया गया)

12389
88888
23
a80
2q8
1234567890

मैं वादा करता हूं कि मैं इस समस्या को हल करने के लिए गोल्फलैंग्स का उपयोग नहीं करूंगा (यह शायद 50 बाइट्स से अधिक नहीं होगा)
लीकी नून

मैंने कभी नहीं कहा कि लोग इसके लिए गोल्फ भाषाओं का उपयोग नहीं कर सकते - मुझे ईमानदारी से आश्चर्य है कि किसी ने अभी तक नहीं किया है। किसी भी तरह, इसके बिना भी आप शायद जावा 8 लैम्ब्डा का उपयोग करके कुछ बाइट्स बचा सकते हैं?
डारेल हॉफमैन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.