टेनेरी-यदि कनवर्टर


18

जावा / .NET / C / जावास्क्रिप्ट / आदि में। यदि आप बयानों को छोटा करने के लिए टर्नरी-आईएफ का उपयोग कर सकते हैं।

उदाहरण के लिए (जावा में):

// there is a String `s` and an int `i`
if(i<0)s="Neg";else if(i>0)s="Pos";else s="Neut";

के साथ छोटा किया जा सकता है-यदि:

s=i<0?"Neg":i>0?"Pos":"Neut";

चुनौती:

इनपुट: एक नियमित अगर-और (घोंसले के शिकार के साथ संभव) जो एक एकल चर सेट करता है।

आउटपुट: परिवर्तित टर्नरी-यदि।

चुनौती नियम:

  • आप यह मान सकते हैं कि सभी और-और मामले बिना कोष्ठक के संभव हैं (इसलिए प्रत्येक if / else-if / अन्यथा ब्लॉक में एक एकल निकाय है)।
  • आप मान सकते हैं कि प्रत्येक else(सहित else if) के बाद एक ही स्थान को छोड़कर, कोई स्थान, टैब या नई-लाइनें नहीं होंगी ।
  • आप मान सकते हैं कि उपयोग किए जाने वाले चर नाम हमेशा एक एकल लोअरकेस अक्षर ( [a-z]) होते हैं।
  • चर को दिए गए मान निम्न में से एक हो सकते हैं:
    • स्ट्रिंग्स, जो डबल उद्धरण से घिरा हो जाएगा (यानी (रिक्त स्थानों / टैब / नई लाइनों के बिना) "Test", "SomeString", "Example_string", आदि)। आप यह मान सकते हैं कि स्ट्रिंग्स में कभी भी सबस्ट्रिंग नहीं होंगे ifया elseन ही इसमें स्पेस, टैब, न्यूलाइन, (बच गए) डबल-कोट्स या कैरेक्टर होंगे =। इसमें वर्ण शामिल हो सकते हैं ><(){}[];?:!&|, लेकिन मुद्रण योग्य ASCII रेंज में ही होंगे ( ['!' (33), '~' (126)])।
    • पूर्णांकों (यानी 0, 123, -55, आदि)
    • दशमलव (यानी 0.0, 0.123, -55.55, आदि)
  • मान कभी मिश्रित नहीं होंगे। इसलिए असाइन किए गए सभी चर पूर्णांक हैं, और कुछ पूर्णांक नहीं हैं और कुछ तार हैं।
  • कोष्टक के भीतर की स्थिति निम्न वर्ण हो सकते =<>!+-/*%&|[], a-z, 0-9। आप मान सकते हैं कि कोई आंतरिक कोष्ठक नहीं होगा, और आप यह भी मान सकते हैं कि एक से अधिक वर्ण (जैसे if(if<0)) के किसी भी (भ्रामक) क्षेत्र नहीं होंगे ।
  • आप मान सकते हैं कि i*=10इसके बजाय कोई भी शॉर्ट-कट नहीं होगा i=i*10
  • आपको झूलने के elseमामलों को संभालने की आवश्यकता नहीं होगी , इसलिए सभी ifको एक साथ जोड़ा जा सकता है else। Ie if(a)if(b)r=0;else r=1;एक संभावित इनपुट-केस नहीं है। if(a)if(b)r=0;else r=1;else r=2;या if(a&&b)r=0;else if(a&&!b)r=1;else r=-1;फिर भी हैं।
  • I / O लचीला है। इनपुट और आउटपुट एक स्ट्रिंग हो सकता है, पात्रों की सूची, एसटीडीआईएन से पढ़ सकते हैं, एसटीडी के बारे में आउटपुट, आदि। आपका कॉल।
  • सभी ternaries में एक समरूपता होगी, जैसा कि अधिकांश भाषाओं में मानक है ( लेकिन उदाहरण के लिए PHP में नहीं )।

सामान्य नियम:

  • यह , इसलिए बाइट्स जीत में सबसे छोटा जवाब है।
    कोड-गोल्फ भाषाओं को गैर-कोडगॉल्फिंग भाषाओं के साथ उत्तर पोस्ट करने से हतोत्साहित न करें। 'किसी भी' प्रोग्रामिंग भाषा के लिए यथासंभव कम उत्तर के साथ आने की कोशिश करें।
  • मानक नियम आपके उत्तर के लिए लागू होते हैं , इसलिए आपको उचित पैरामीटर और रिटर्न-टाइप, पूर्ण कार्यक्रमों के साथ STDIN / STDOUT, फ़ंक्शन / विधि का उपयोग करने की अनुमति दी जाती है। तुम्हारा फोन।
  • डिफ़ॉल्ट लूपोल्स निषिद्ध हैं।
  • यदि संभव हो, तो कृपया अपने कोड के लिए एक परीक्षण के साथ एक लिंक जोड़ें।
  • इसके अलावा, यदि संभव हो तो एक स्पष्टीकरण जोड़ें।

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

Input:   if(i<0)s="Neg";else if(i>0)s="Pos";else s="Neut";
Output:  s=i<0?"Neg":i>0?"Pos":"Neut";

Input:   if(i%2<1)r=10;else r=20;
Output:  r=i%2<1?10:20;

Input:   if(n<10)if(m<0)i=0;else i=10;else if(m<0)i=-1;else i=1;
Output:  i=n<10?m<0?0:10:m<0?-1:1;

Input:   if(i==1)i=0.0;else i=0.25;
Output:  i=i==1?0.0:0.25;

Input:   if(!a)if(b)r=0;else r=1;else r=2;
Output:  r=!a?b?0:1:2;

Input:   if(a)if(b)r=0;else r=1;else if(c)r=2;else r=3;
Output:  r=a?b?0:1:c?2:3;

Input:   if(a&&b)r=0;else if(a&&!b)r=1;else r=-1;
Output:  r=a&&b?0:a&&!b?1:-1;

Input:   if(i[0]>0)if(j>0)if(q>0)r="q";else r="j";else r="i";else r="other";
Output:  r=i[0]>0?j>0?q>0?"q":"j":"i":"other";

Input:   if(i>0)r="i";else if(j>0)r="j";else if(q>0)r="q";else r="other";
Output:  r=i>0?"i":j>0?"j":q>0?"q":"other";

Input:   if(a>0)if(a<2)x="one";else if(a<3)x="two";else if(a<4)x="three";else x="other";else x="other";
Output:  x=a>0?a<2?"one":a<3?"two":a<4?"three":"other":"other";

Input:   if(b[0]<=b[1])q=5;else if(b[0]==null)q=0;else q=-10;
Output:  q=b[0]<=b[1]?5:b[0]==null?0:-10;

तकनीकी रूप से, F # if ... then ... elseमें टर्नरी ऑपरेटर है। इसलिए अगर आप लिखते हैं let result = if 10 > 100 then 99 else -99तो इसका मूल्य resultहोगा -99
Ciaran_McCarthy

1
@Ciaran_McCarthy मुझे उम्मीद है कि अधिकांश के लिए मामला होगा, अगर सभी कार्यात्मक झुकाव वाली भाषाएं नहीं हैं जो डिफ़ॉल्ट के रूप में सशर्त अभिव्यक्तियां हैं। क्लोजर, स्काला और हास्केल एक ही हैं।
१६:१६ पर कारक्जेनिकेट

@tsh उफ़ .. मुझे काम के दिन के बाद देर शाम को टेस्ट के मामले नहीं जोड़ने चाहिए .. फिक्स्ड।
केविन क्रूज़सेन

2
जावास्क्रिप्ट कंप्रेसर क्लोजर कंपाइलर इन सभी टेस्टकेस पर बहुत अच्छा काम करता है। जो दिए गए इनपुट्स को लेते समय सिर्फ अपेक्षित आउटपुट देता है। लेकिन ऐसा लगता है कि मैं इसका जवाब नहीं दे सकता। इसलिए मैं यहां टिप्पणी करना चाहूंगा।
tsh

जवाबों:


5

रेटिना 0.8.2 , 32 बाइट्स

+r`if.(.*?)\)(.=)
$2$1?
;.{6}=
:

इसे ऑनलाइन आज़माएं! स्पष्टीकरण:

r`if.(.*?)\)(.=)
$2$1?

ifस्थिति से पहले असाइनमेंट को स्थानांतरित करके और संलग्न करके एक असाइनमेंट से पहले तुरंत संभाल लें ?। चरण को राइट-टू-लेफ्ट से मिलान किया जाता है ताकि हम यह सुनिश्चित कर सकें कि यदि हम असाइनमेंट के सबसे करीब हैं, जबकि यह \)सुनिश्चित करता है कि हम elseगलती से मेल नहीं खाते हैं ।

+

नेस्टेड ifएस की देखभाल के लिए चरण को दोहराएं ।

;.{6}=
:

किसी भी शेष कार्य elseएस के ;else ?=साथ बदल रहे हैं :


@nwellnhof यह इंगित करने के लिए धन्यवाद; मुझे लगा कि मैं एक बाइट को वहां से निकाल रहा हूं क्योंकि यह परीक्षण मामलों पर काम करता है।
नील

6

पायथन 2 , 126 121 120 114 100 बाइट्स

lambda s:findall(' (.=)',s)[0]+sub('if.(.*?)\)(.=)?',r'\1?',sub('.{5} (.=)?',':',s))
from re import*

इसे ऑनलाइन आज़माएं!


बचाया:

  • -1 बाइट, केविन क्रूज़सेन की बदौलत

@KevinCruijssen धन्यवाद :)
TFeld

1
आयात से पहले फ़ंक्शन की परिभाषा क्यों है?
स्काइलर

@ स्किलेर यह वास्तव में कोई फर्क नहीं पड़ता, लेकिन हेडर में असाइनमेंट को इस तरह से रखना आसान है
जो किंग

6

पर्ल 5- पी, 50 49 48 बाइट्स

s/if.(.*?)\)(.=)/\2\1?/g;s/.if./?/g;s/;.{6}=/:/g

इसे ऑनलाइन आज़माएं!

48 बाइट संस्करण नील के रेटिना उत्तर से प्रेरित है।

व्याख्या

# Replace "if(e1)if(e2)x=" with "x=e1)if(e2?"
s/if.(.*?)\)(.=)/\2\1?/g;
# Replace ")if(" with "?"
s/.if./?/g;
# Replace ";else x=" with ":"
s/;.{6}=/:/g

पुराना 49 बाइट का घोल

s/.{5} (.=)?/:/g;s/if.(.*?)\)(.=)?/\1?/g;$_=$2.$_

3

रूबी , 72 71 बाइट्स

->s{$a=$2while s.gsub!(/if.(.*?)\)(.=)?(.*?);\w* (.=)?/,'\1?\3:');$a+s}

इसे ऑनलाइन आज़माएं!


या तो ;elseया else हो सकता है .{5}एक बाइट को बचाने के लिए।
केविन क्रूज़सेन

1
धन्यवाद, मुझे उसी प्रभाव के साथ कुछ अलग मिला।
जीबी

3

जावा (JDK) , 119 116 बाइट्स

लगभग पूरी तरह से शुद्ध रेगेक्स समाधान, कटा हुआ और अन्य उत्तरों के एक जोड़े से थोड़ा बदल गया।

-3 बाइट्स केविन से कुछ और रेगेक्स प्रवंचना के लिए धन्यवाद

s->s.replaceAll(".*(.=).*","$1$0").replaceAll("if.(.*?)\\)","$1?").replaceAll("([ ?]).=","$1").replace(";else ",":")

इसे ऑनलाइन आज़माएं!

व्याख्या

s->                                         // Lambda function taking a String
   s.replaceAll(".*(.=).*","$1$0")          // Find assigned variable and append to start of String
    .replaceAll("if.(.*?)\\)","$1?")        // Replace any 'if' statements with their condition
                                            // followed by '?'
    .replaceAll("([? ]).=","$1")            // Remove all assignments after a '?' or space
    .replace(";else ",":");                 // Simple replace (no regex) to remove 'else' statements

1
मुझे ".*(.=).*","$1$0"आपके द्वारा उपयोग किया गया पसंद है , यह 1 बाइट से कम है, जो "^(.*)(.=)","$2$1"मेरे दिमाग में था। :) वैसे भी, आप को बदलने 2 बाइट्स बचा सकते हैं if\\(करने के लिए if.और एक अतिरिक्त बाइट को बदलने (\\?| )के लिए ([? ])यह 116 बाइट्स ऑनलाइन प्रयास करें ।
केवि क्रूज़सेन

@ केविनक्रूजसेन चीयर्स! मैंने इतने लंबे समय तक रेगेक्स को नीचे फेंकने की कोशिश की, मुझे विश्वास नहीं हुआ कि मैं चूक गया हूं!
ल्यूक स्टीवंस 19

3

काकाउने v2018.09.04 , 43 38 37 बाइट्स

xs\w=(?!=)<ret>d<a-h>Psif.<ret>df);r?xs;else<space><ret>c:<esc>

स्पष्टीकरण:

काकाउने एक बहुविकल्पी आधारित, मोडल संपादक है, जो विम द्वारा प्रेरित है।

  1. x पूरी लाइन का चयन करें

  2. s... <ret>नियमित अभिव्यक्ति के साथ चयन को फ़िल्टर करें \w=(?!=), जो सभी चर असाइनमेंट से मेल खाता है, और ==तुलना से मेल नहीं खाता है

  3. d प्रत्येक चयन को हटा दें और उसकी सामग्री को डिफ़ॉल्ट रजिस्टर में डालें

  4. <a-h> अपनी लाइन की शुरुआत के लिए सभी चयनों का विस्तार करें

  5. P प्रत्येक चयन से पहले डिफ़ॉल्ट रजिस्टर की सामग्री पेस्ट करें

  6. s... <ret>नियमित अभिव्यक्ति के साथ चयन को फ़िल्टर करेंif.

  7. d प्रत्येक चयन हटाएं

  8. f प्रत्येक चयन को आगे बढ़ाएं )

  9. ; इसके कर्सर के लिए प्रत्येक चयन को कम करें

  10. r प्रत्येक चयन के प्रत्येक चरित्र को बदलें ?

  11. x पूरी लाइन का चयन करें

  12. s... के <ret>साथ चयन फ़िल्टर करें;else<space>

  13. c... <esc>प्रत्येक चयन को साफ़ करें और इसे बदलें:

एक परीक्षण मामले पर कोड का एनीमेशन:

कार्रवाई में कोड


1
हम्म, मैंने पहले कभी काकुने के बारे में नहीं सुना है। मुझे लगता है कि इसके लिए कोई ऑनलाइन संकलक नहीं है? यदि नहीं, तो क्या आप शायद कुछ परीक्षण मामलों के कुछ स्क्रीनशॉट जोड़ सकते हैं ताकि मैं यह सत्यापित कर सकूं कि यह उद्देश्य के रूप में काम करता है? इसके अलावा, अगर यह अपनी भाषा है, तो आप डेनिस में संपर्क कर सकते हैं talk.tryitonline.net चैट अगर वह इसे करने के लिए जोड़ सकते हैं पूछने के लिए TIO
केविन क्रूज़सेन 15

1
@ केविनक्रूजसेन I ने परीक्षण मामलों में से एक का जीआईएफ जोड़ा। यह उन सभी पर काम करता है, लेकिन जिफ बनाना मामूली नहीं है।
वालुस

स्पष्टीकरण और gif के लिए धन्यवाद, +1 मेरी ओर से। :) हमेशा एक नई भाषा के बारे में जानने के लिए अच्छा है।
केविन क्रूज़सेन


1

जावास्क्रिप्ट (Node.js) , 80 बाइट्स

s=>(p=s.replace(/(?:if.(.*?)\)|;.*? )(.=)?/g,(_,t,v)=>(V=v||V,t)?t+'?':':'),V+p)

इसे ऑनलाइन आज़माएं!

केविन क्रूज़सेन के लिए धन्यवाद, 2 बाइट्स बचाए गए।


if\(हो सकता है if.और 2 बाइट्स बचाने के लिए ;else हो सकता ;.{5}है
केविन क्रूज़सेन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.