अच्छाई, यह टैब में शामिल है!


26

अंतरिक्ष इंडेंटेशन उपयोगकर्ताओं, एकजुट ! हमें सभी नीच टैब उपयोगकर्ताओं के खिलाफ लड़ना चाहिए !

आपका मिशन (आपको इसे स्वीकार करने के लिए चुनना चाहिए) एक प्रोग्राम या फ़ंक्शन लिखना है जो दो तर्कों में होता है:

  • एक स्ट्रिंग: यह इनपुट है।
  • एक सकारात्मक पूर्णांक: यह प्रति टैब रिक्त स्थान की संख्या है।

आपको स्ट्रिंग की प्रत्येक पंक्ति के माध्यम से जाना चाहिए और दिए गए नंबर के रिक्त स्थान के साथ इंडेंटेशन के लिए उपयोग किए जाने वाले प्रत्येक टैब को बदलना होगा , और इंडेंटेशन के लिए उपयोग नहीं किए जाने वाले प्रत्येक टैब (जैसे लाइन के बीच में) को एक स्थान के साथ उपयोग करना होगा।

ध्यान दें कि इस तरह की रेखाएं \t \tabcअपरिभाषित व्यवहार हैं; उन्हें दुष्ट टैब उपयोगकर्ताओं द्वारा आपके प्रोग्राम को जटिल बनाने के लिए डाला गया था।

टैब्स मस्ट डाई सोसाइटी के अनुसार, बुराई टैब उपयोगकर्ताओं द्वारा पता लगाने से बचने के लिए आपका कार्यक्रम यथासंभव छोटा होना चाहिए।

उदाहरण

\t यहाँ टैब का प्रतिनिधित्व करने के लिए उपयोग किया जाता है।

इनपुट स्ट्रिंग:

a
\t\tb\tc
d

इनपुट नंबर:

4

आउटपुट:

a
        b c
d

मध्य रेखा 8 स्थानों, 4 प्रति टैब (चूंकि दी गई संख्या 4 थी) से प्रेरित थी।

इनपुट स्ट्रिंग:

\ta\t\tb

इनपुट नंबर:

4

आउटपुट:

    a  b

नोट: यह टैब विस्तार चुनौती का डुप्लिकेट नहीं है ; इसके लिए बहुत अलग इनपुट प्रारूप और थोड़ी अलग आवश्यकताओं की आवश्यकता होती है।


1
हां , जब तक यह सवाल स्पष्ट रूप से दशमलव संख्या (जो यह नहीं है) के लिए नहीं पूछता है।
मार्टिन एंडर


1
क्या हम मान सकते हैं कि इनपुट में केवल मुद्रण योग्य ASCII, टैब और न्यूलाइन शामिल हैं?
डेनिस

2
प्रस्तावित परीक्षण का मामला: \ta\t\tb, 4(मेरे पिछले संशोधन असफल रहा था कि एक)
डेनिस

2
हमें व्हॉट्सएप में जवाब चाहिए।
कज़ वोल्फ

जवाबों:


7

सीजेएम, 30 24 23 बाइट्स

q{_9=NA=Seasi*' ?@?:N}/

मैं आमतौर पर इंटरनेट पर दुर्भावनापूर्ण कोड पोस्ट करने से मना करता हूं ...

यह एक पूर्ण कार्यक्रम है जो STDIN से स्ट्रिंग और कमांड-लाइन तर्क के रूप में संख्या को पढ़ता है।

CJam दुभाषिया में इसे ऑनलाइन आज़माएं ।

यह काम किस प्रकार करता है

q                        Read all input from STDIN.
 {                   }/  For each character C in the input:
  _9=                      Push 1 if C is a tab and 0 otherwise.
     NA=                   See below.
        Seasi*             Push a string of W spaces, where W is the integer from
                           the command-line arguments.
              '            Push a spaces character.
                ?          Select the string if NA= pushed a truthy value, the
                           single space otherwise.
                 @         Rotate C on top of the stack.
                  ?        Select the string of spaces or the single space if _9=
                           pushed 1, the character C otherwise.
                   :N      Save the result in N.

क्या NA=करता है:

  • पहले वर्ण के लिए, Nइसका डिफ़ॉल्ट मान होगा, अर्थात, स्ट्रिंग "\n"

    बाद के सभी पात्रों के लिए, Nअंतिम पुनरावृत्ति का परिणाम होगा, अर्थात, इनपुट से अंतिम वर्ण, एक अंतरिक्ष वर्ण या एक या अधिक रिक्त स्थान का एक स्ट्रिंग।

  • यदि Nएक स्ट्रिंग है, तो NA=एन के सूचकांक 10 पर तत्व का चयन करता है (चारों ओर लपेटता है)। परिणाम एक अंतरिक्ष या एक लाइनफीड चरित्र होगा। दोनों सत्य हैं।

    यदि N एक वर्ण है, तो NA=एक लाइनफीड के लिए 1 धक्का और 0 अन्यथा।

  • उपर्युक्त के कारण, NA=पहले वर्ण के लिए एक सत्य मान को धक्का देगा, एक चरित्र जो लाइनफीड से पहले था या एक चरित्र जो रिक्त स्थान की एक स्ट्रिंग से पहले था (इंडेंटेशन जो पहले ही बदल दिया गया है)।

    अन्य सभी मामलों में (एक टैब्युलेटर सहित जो एक अंतरिक्ष वर्ण द्वारा प्रतिस्थापित किया गया है ), NA=एक मिथ्या मूल्य को धक्का देगा।


6
अच्छी बात है कि आप दुर्भावनापूर्ण टैब निकालकर इंटरनेट सेवा कर रहे हैं। ;)
एलेक्स ए।

19

K5, 53 45 बाइट्स

{{,/(b+a&~b:x*&\a:9=y){$[x;x#" ";y]}'y}[x]'y}

कार्रवाई में:

  {{,/(b+a&~b:x*&\a:9=y){$[x;x#" ";y]}'y}[x]'y}[4;(,"a";"\t\tb\tc";,"d")]
(,"a"
 "        b c"
 ,"d")

मैं केवल यह दिखाना चाहता हूं कि यह प्रश्न नैतिक रूप से निंदनीय है।


11
-21346106841 के लिए... this question is morally reprehensible.
द न्यूम्बरऑन

3
यह शीर्ष मतदान जवाब को समाप्त करने की आवश्यकता है, बस इसलिए लोगों को फुटनोट दिखाई देगा।
भूतपूर्व सैनिक

आप इसे 3 बाइट के लिए प्रिंट करने के बजाय परिणाम वापस कर सकते हैं।
kirbyfan64sos

1
@ kirbyfan64sos: मैं लाइनों में शामिल होने की आवश्यकता से बचने के लिए परिणाम प्रिंट कर रहा हूं। यदि मैं स्ट्रिंग की एक सूची के रूप में परिणाम को स्वीकार कर सकता हूं और वापस कर सकता हूं, तो प्रत्येक पंक्ति के लिए, मैं सहेज सकता हूं `0:और "\ n" \ _।
जॉन सेप

@ जॉन मैंने यह कहते हुए एक नियम नहीं रखा कि आप ऐसा नहीं कर सकते, इसलिए मैं अनुमान लगा रहा हूँ कि आप कर सकते हैं। :)
kirbyfan64sos

8

पर्ल, 23 ​​बाइट्स

22 बाइट्स कोड + 1 बाइट्स कमांड लाइन

उम्मीद नहीं है कि -i पैरामीटर के माध्यम से संख्यात्मक इनपुट दिया जा सकता है मानने के लिए बहुत ही लजीला नहीं है! नीचे दिए गए कोड में वास्तविक टैब वर्ण के साथ \ t को प्रतिस्थापित करना सुनिश्चित करें।

s/\G\t/$"x$^I/ge;y/\t/ /

उपयोग उदाहरण:

printf "a\n\t\tb\tc\nd" | perl -p entry.pl -i4

या सुविधा के लिए:

printf "a\n\t\tb\tc\nd" | perl -pe 's/\G\t/$"x$^I/ge;y/\t/ /' -i4

स्पष्टीकरण:

-pतर्क का उपयोग करके इनपुट में प्रत्येक पंक्ति के लिए प्रोग्राम निष्पादित करेगा, फिर अंत में परिणाम प्रिंट करें।

उपरोक्त उदाहरण में, रेगेक्स प्रतिस्थापन प्रतिस्थापन (एक स्थान को चार बार दोहराया गया) के \G\tसाथ बदल देता है " "x4\Gएक छोटा-सा ज्ञात रेगीक्स कंस्ट्रक्शन है जो या तो पहले मैच की स्थिति से मेल खाता है, अगर पहला पुनरावृत्ति, या पिछले मैच की स्थिति से यदि पहला पुनरावृत्ति नहीं है, तो यह स्ट्रिंग की शुरुआत में सभी टैब को बदल देगा, और होगा एक-एक करके। y/\t/ /बस रिक्त स्थान के साथ सभी शेष टैब बदल देता है।


2

जूलिया, 69 59 बाइट्स

f(s,n)=(r=replace)(r(s,r"^\t*"m,i->" "^endof(i)n),"\t"," ")

Ungolfed:

function f(s::String, n::Int)
    # Replace the leading indentation tabs
    r1 = replace(s, r"^\t*"m, i -> " "^endof(i)n)

    # Replace any remaining tabs between words
    r2 = replace(r1, r"\t", " ")

    # Return
    r2
end

10 बाइट्स बचाए और ग्लेन ओ को धन्यवाद एक मुद्दा तय किया!


क्या अलग इंडेंटेशन टैब को अलग करने का कोई लाभ है? यह मुझे लगता है कि इसे सीधे "शेष टैब" भाग द्वारा नियंत्रित किया जाना चाहिए। इसके अलावा, आपका "टेक्स्ट के बीच टैब को बदलें" भाग केवल एक टैब से मेल खाएगा, अगर आपके पास क्या है "hello\t\t1"?
ग्लेन ओ

यदि हम मानते हैं कि सभी इंडेंटेशन टैब (कोई "\t \t"स्थिति नहीं ) के साथ किया जाता है , तो आप ऐसा कर सकते हैं: f(s,n)=(r=replace)(r(s,r"^\t*"m,i->" "^endof(i)n),"\t"," ")जो एक प्रतिस्थापन फ़ंक्शन का उपयोग करता है और एक हिट में सभी इंडेंटेशन टैब को पकड़ लेगा।
ग्लेन ओ

@GlenO वाह, यह वास्तव में प्रतिभाशाली है। बहुत बहुत धन्यवाद!
एलेक्स ए।

मैंने देखा कि मेरा जवाब खराब हो गया। क्या मैंने कुछ गलत किया है? मुझे किसी भी मुद्दे को संबोधित करने में खुशी होगी।
एलेक्स ए।

मुझे कोई समस्या नहीं दिख रही है। हो सकता है कि यह केवल उन प्रतिशोधी प्रकारों में से एक है जो नीचे की ओर जाते हैं क्योंकि वे एक भाषा, या जैसी चीजें पसंद नहीं करते हैं? मैं कोई दोष नहीं देख सकता।
ग्लेन ओ


2

गणितज्ञ, 42 37 बाइट्स

कई कोड-बचत सुझावों के लिए @ LegionMammal978 का धन्यवाद। पहला पैरामीटर, #इनपुट पाठ के लिए है, दूसरा पैरामीटर, #2प्रति टैब स्थान की संख्या के लिए।

StringReplace[#,"\t"->" "~Table~{#2}]&

इसके अलावा, आप बदल सकते हैं Table[" ",{#2}]करने के लिए " "~Table~{#2}एक बाइट को बचाने के लिए। आप StringJoinउस पर खाली स्ट्रिंग क्यों लगा रहे हैं ?
लीजनमोनमल 978


1

जावास्क्रिप्ट (ईएस 6), 70

टेम्प्लेट स्ट्रिंग्स का उपयोग करते हुए, न्यूलाइन महत्वपूर्ण और गिना जाता है

(s,n,r=n)=>[...s].map(c=>c<`
`?` `.repeat(r):(r=c<` `?n:1,c)).join``

फ़ायरफ़ॉक्स में नीचे स्निपेट का परीक्षण करें।

F=(s,n,r=n)=>[...s].map(c=>c<`
`?` `.repeat(r):(r=c<` `?n:1,c)).join``

// TEST
out=x=>O.innerHTML+=x+'\n\n'

out('Input: "A\\n\\t\\tB\\tC\\nD" 4\nOutput:\n'+F('A\n\t\tB\tC\nD',4))

out('Input: "\\tA\\t\\tB" 4\nOutput:\n'+F('\tA\t\tB', 4))
<pre id=O></pre>


1
वाह एक नीच! कोई ऐसा व्यक्ति हो सकता है जो 'टेस्ट इन फ़ायरफ़ॉक्स' को पढ़ या समझ नहीं सकता है?
edc65

मुझे भाषा पूर्वाग्रह पर संदेह है। जूलिया और सीजेएम में भी गिरावट आई।
डेनिस

1

कॉफ़ीस्क्रिप्ट, 72 बाइट्स

(s,n)->s.replace(/^\t+/mg,(m)->" ".repeat(m.length*n)).replace /\t/g," "

(इसे कम से कम 2 और काटने की कोशिश कर रहा है, इसलिए यह ES6 समाधान को हरा देगा ... मदद की सराहना की: D)

उपयोग:

f=(s,n)->s.replace(/^\t+/mg,(m)->" ".repeat(m.length*n)).replace /\t/g," "
str="""
My nice\tString
\tIndent <--
\t\tDouble
""" #\t is recognized as tab by CS
alert(f(str,4))

1

रेटिना, 42 बाइट्स

सभी .स्थान रिक्त स्थान हैं, सभी \tशाब्दिक टैब (1 बाइट) हैं, और <empty>एक रिक्त फ़ाइल का प्रतिनिधित्व करते हैं। यह सिर्फ पठनीयता के लिए है। मुझे यह भी पूरी तरह से यकीन नहीं है कि मैं लूप को सही तरीके से कर रहा हूं, लेकिन मुझे ऐसा लगता है। प्रत्येक पंक्ति को अपनी फ़ाइल में रखा जाना चाहिए। मैंने प्रत्येक अतिरिक्त फ़ाइल के लिए 1 बाइट जोड़ी है।

इनपुट के अंत में इनपुट को यूनिरी में अपनी लाइन में माना जाता है।

(1*)$
_$1
m+`(?<!^|\t)\t
.
(`1$
<empty>
)`\t
\t.
\t|_
<empty>

व्याख्या

मैं _प्रतिस्थापन के दौरान इसे हटाने के लिए Unary इनपुट से पहले जोड़ता हूं , ताकि मैं इनपुट स्ट्रिंग से किसी भी अनुगामी को न हटाऊं। फिर, मैं सभी टैब को एक सिंगल स्पेस के साथ लाइन की शुरुआत में नहीं बदलता हूं। फिर, मैं लूप हटाता हूं, एक 1टैब को हटाता हूं और प्रत्येक टैब के बाद एक सिंगल स्पेस जोड़ता हूं, जब तक कि मैं इनपुट से बाहर नहीं चला जाता। अंत में, मैं टैब्स और अंडरस्कोर हटाकर सफाई करता हूं।


1

पायथन, 72 68 बाइट्स

टैब शाब्दिक टैब (1 बाइट) हैं, इसलिए r'...'इसकी आवश्यकता नहीं है। दुर्भाग्य से, पायथन को "फिक्स्ड-चौड़ाई" लुक-बिहाइंड / लुक-आहिड्स की आवश्यकता होती है, इसलिए मैं उपयोग नहीं कर सकता (?<!^|\t)। मेरे रेटिना समाधान के रूप में बहुत अधिक विधि का उपयोग करता है।

import re
lambda s,n:re.sub('\t',' '*n,re.sub('(?<!^)(?<!\t)\t',' ',s))




0

हास्केल , 75 बाइट्स

s#m|let('\t':r)#n=(' '<$[1..n])++r#n;(x:r)#n=x:r#(m^sum[1|x<' ']);e#_=e=s#m

इसे ऑनलाइन आज़माएं! यह मानता है कि इनपुट में केवल मुद्रण योग्य वर्ण और साथ ही टैब और newlines हैं, जैसा कि टिप्पणियों में ओपी द्वारा अनुमति है।

स्पष्टीकरण:

बाहरी #फ़ंक्शन एक स्ट्रिंग sऔर एक संख्या लेता है और समान तर्कों के साथ mआंतरिक रूप से परिभाषित #फ़ंक्शन को कॉल करता है। यह मूल mमान का ट्रैक रखने के लिए किया जाता है , क्योंकि आंतरिक #फ़ंक्शन संख्या बदलता है:

  • ('\t':r)#n=(' '<$[1..n])++r#nयदि आप एक टैब का सामना करते हैं, तो इसे nरिक्त स्थान से बदलें और nअपरिवर्तित छोड़ दें ।
  • (x:r)#n=x:r#(m^sum[1|x<' '])यदि कुछ xजो कि टैब नहीं है, का सामना किया गया है, तो इसे रखें, लेकिन nमूल संख्या पर सेट करें mयदि xकोई नई पंक्ति है और 1अन्यथा। इसके द्वारा किया जाता है m^sum[1|x<' ']: mउस शक्ति पर ले जाया जाता है, sum[1|x<' ']जिसका मूल्यांकन किसी स्थान (यानी एक नई रेखा) से छोटा 1होने पर होता xहै, इसलिए हम प्राप्त करते हैं m^1 = m। नहीं तो यह 0हमारे पास है m^0 = 1

0

जावा 11, 134 बाइट्स

n->s->{var r="";for(var p:s.split("\n")){for(;p.charAt(0)==9;p=p.substring(1))r+=" ".repeat(n);r+=p+"\n";}return r.replace('\t',' ');}

इसे ऑनलाइन आज़माएं।
नोट: जावा 11 अभी तक TIO पर नहीं है, इसलिए इसके बजाय (एक ही बाइट-काउंट के साथ) " ".repeat(n)अनुकरण किया गया है repeat(" ",n)

स्पष्टीकरण:

n->s->{                 // Method with integer & String parameters and String return-type
  var r="";             //  Result-String, starting empty
  for(var p:s.split("\n")){
                        //  Loop over the rows (split by new-lines)
    for(;p.charAt(0)==9;//   Inner loop as long as the current row starts with a tab
       p=p.substring(1))//     After every iteration: remove the first character (tab)
      r+=" ".repeat(n); //    Append `n` amount of spaces to the result-String
    r+=p+"\n";}         //   Append the rest of the row with a newline to the result
  return r.replace('\t',' ');} 
                        //   Replace any remaining tabs with a space, and return the result
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.