अंतरिक्ष युद्ध बनाम टैब समाप्त करें


24

अंतरिक्ष युद्ध बनाम टैब समाप्त करें

इसलिए, इस बात पर बहुत बहस हो गई है कि क्या इंडेंट / फॉर्मेट कोड को टैब या स्पेस का उपयोग करना है। क्या आप प्रारूपण के अविश्वसनीय रूप से पागल अनोखे तरीके से जाकर विश्वविद्यालय को विवाद को सुलझाने में मदद कर सकते हैं ।


आपका काम एक पूर्ण कार्यक्रम या फ़ंक्शन लिखना है जो सभी टैब को चार स्थानों में विस्तारित करता है। और फिर "/ (n - दो सितारों यहाँ) /" के साथ n अग्रणी स्थानों की एक रन बदलता है। आप किसी भी उचित प्रारूप में कई लाइनों पर इनपुट प्राप्त करेंगे (प्रत्येक नई पंक्ति के लिए स्ट्रिंग के एकल स्ट्रिंग सरणी। स्तंभ पूर्व सरणी आदि)

नमूना इनपुट बेशर्मी से चुराया । ध्यान दें कि चूंकि टैब SE पर चार स्थानों पर स्वचालित रूप से विस्तारित हो जाता है इसलिए मैं इसे "^" वर्ण के रूप में प्रस्तुत करता हूं, लेकिन आपको टैब (कोडपॉइंट 0x09) को भी संभालना होगा। सभी "^" वर्ण एक सारणीकरण का प्रतिनिधित्व करते हैं।

Calculate the value 256 and test if it's zero
If the interpreter errors on overflow this is where it'll happen
++++++++[>++++++++<-]>[<++++>-]
+<[>-<
    Not zero so multiply by 256 again to get 65536
    [>++++<-]>[<++++++++>-]<[>++++++++<-]
    +>[>
        # Print "32"
        ++++++++++[>+++++<-]>+.-.[-]<
    <[-]<->] <[>>
        # Print "16"
        +++++++[>+++++++<-]>.+++++.[-]<
<<-]] >[>
    # Print "8"
    ++++++++[>+++++++<-]>.[-]<
<-]<
# Print " bit cells\n"
+++++++++++[>+++>+++++++++>+++++++++>+<<<<-]>-.>-.+++++++.+++++++++++.<.
>>.++.+++++++..<-.>>-
Clean up used cells.
[[-]<]l
^this is preceded by a tab
^^two tabs
^^^three tabs etcetera! 

नमूना उत्पादन

Calculate the value 256 and test if it's zero
If the interpreter errors on overflow this is where it'll happen
++++++++[>++++++++<-]>[<++++>-]
+<[>-<
/**/Not zero so multiply by 256 again to get 65536
/**/[>++++<-]>[<++++++++>-]<[>++++++++<-]
/**/+>[>
/******/# Print "32"
/******/++++++++++[>+++++<-]>+.-.[-]<
/**/<[-]<->] <[>>
/******/# Print "16"
/******/+++++++[>+++++++<-]>.+++++.[-]<
<<-]] >[>
/**/# Print "8"
/**/++++++++[>+++++++<-]>.[-]<
<-]<
# Print " bit cells\n"
+++++++++++[>+++>+++++++++>+++++++++>+<<<<-]>-.>-.+++++++.+++++++++++.<.
>>.++.+++++++..<-.>>-
Clean up used cells.
[[-]<]l
/**/this is preceded by a tab
/******/two tabs
/**********/three tabs etcetera! 

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

अस्वीकरण

यह "उत्कृष्ट" प्रारूपण रणनीति जियोबिट्स के सौजन्य से आई, और उसकी अनुमति के साथ पुन: प्रस्तुत किया गया है। इस चुनौती के उत्पादन के दौरान किसी भी प्रोग्रामर को नुकसान नहीं पहुंचाया गया।


1
क्या टैब केवल लाइनों की शुरुआत (यानी इंडेंटेशन) के रूप में होंगे? क्या लाइनों में मिश्रित इंडेंटेशन (टैब + स्पेस) हो सकता है?
लिन

20
कोई व्यक्ति व्हॉट्सएप में लिखे गए उत्तर को प्रस्तुत करें ।
गिटारपाइकर

2
क्या हमें उन रेखाओं पर विचार करना चाहिए /*, जिन्हें "अच्छी तरह से गठित इनपुट" नहीं माना जा सकता है? C ++ स्रोत फ़ाइल एक बेहतर परीक्षा होती, क्योंकि इसकी बहु-भाषी टिप्पणी /* */संभवत: कुछ उत्तरों को तोड़ देती है, जो प्रमुख रिक्त स्थान के पहले और अंतिम को एक के साथ बदल देते हैं /, और फिर रिक्त स्थान को भरने के लिए आगे बढ़ते हैं *
शेषमारा

1
युद्ध समाप्त हो गया है: medium.com/@hoffa/… (जब तक आप C, जाहिरा तौर पर प्रोग्रामिंग कर रहे हैं।)
बीकर

1
@ रोहन झुनझुनवाला तो अब मैं फिर से अपना पहला सवाल पूछता हूं, क्योंकि यह कोडेबल कोड के बारे में नहीं था। समान /* */सी ++ कोड की कल्पना करें , लेकिन इस बार लाइन की शुरुआत में। आपकी कल्पना के अनुसार इसे वैसे ही छोड़ देना चाहिए। यहाँ जाल है, और पहले से ही गलत उत्तरों को देखा गया है, जैसे कि कहना है कि एक रेक्सक्स /\** /उन रिक्त स्थान को // के बीच भरता है जिसका उपयोग तारांकन के साथ होता है /***/। मैंने इस रूपांतरण को भी देखा है /*//*/। मुझे लगता है कि दोनों गलत हैं।
शीशमारा

जवाबों:


2

वी , 21 , 20 बाइट्स

Íô/    
Î^hr/hv0r*r/

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

यह वस्तुतः मेरे विम उत्तर का प्रत्यक्ष बंदरगाह है। उल्लेखनीय अंतर:

  • Íआदेश (ग्लोबल विकल्प) स्वचालित रूप से में भर जाता है /gझंडा है, जो दो बाइट्स की बचत होती है

  • ô के समान है \t

  • Îके लिए एक महामारी है :%norm, और यह :%normकीस्ट्रोक्स के सेट के बीच आवश्यक स्थान को भी भरता है ।

  • अंत में पीछे आने वाली गाड़ी वापसी में निहित है।


27

विम, 37, 34, 33, 32 बाइट्स

:%s/\t/    /g|%norm ^hr/hv0r*r/

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

ध्यान दें कि इसके लिए vim में पीछे चलने वाली गाड़ी की वापसी (प्रवेश) की आवश्यकता होती है, हालांकि ऑनलाइन दुभाषिया में नहीं।

यह वी दुभाषिया का उपयोग करता है क्योंकि यह पीछे की ओर संगत है। एक बहुत ही सीधा हल।

यहाँ एक gif है जो आपको वास्तविक समय में समाधान को देखने देता है। यह थोड़ा पुराने संस्करण का उपयोग करता है, और मैंने इसे चलाने के लिए कुछ अतिरिक्त कीस्ट्रोक्स जोड़े हैं ताकि आप देख सकें कि क्या होता है:

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

और यहां बताया गया है कि यह कैसे काम करता है:

:%s/\t/    /g           "Replace every tab with 4 spaces
|                       "AND
%norm                   "On every line:
      ^                 "  Move to the first non-whitespace char
       h                "  Move one character to the left. If there is none, the command will end here.
         r/             "  Replace it with a slash
           h            "  Move to the left
            v0          "  Visually select everything until the first column
              r*        "  Replace this selection with asterisks
                r/      "  Replace the first character with a slash

मैं +1 का उपयोग करने के लिए जा रहा था, gलेकिन तब आपने g: / +1 का उपयोग नहीं करने के लिए संपादित किया: D
डाउन्गोएट

@downgoat हाहा, धन्यवाद! मैं वास्तव में इस संस्करण के बहुत अधिक प्राउडर हूं, :gक्योंकि यह कम ज्ञात विशेषता का दुरुपयोग करता है: normयदि ^F<space>विफल रहता है, तो कमांड रद्द हो जाती है। तो :%norm ^F<space>fooअनिवार्य रूप से :g/^ /norm fooमज़ेदार विम हैक्स के समान ही है । : डी
DJMcMayhem

हुह, मुझे लगा कि स्क्रीन को पोस्ट करने के लिए एफ का उपयोग किया गया था। क्या इसके अंदर अलग व्यवहार है norm?
डाउनग्रेड

1
@downgoat हाहा, नहीं ^F, यह <C-f>मूर्खतापूर्ण महत्वपूर्ण कुंजी नहीं है। इस स्थिति में, यह ^पहले गैर-व्हाट्सएप चार्ट पर कूदता है, और F<space>जो कर्सर के पीछे पहला स्थान पाता है।
DJMcMayhem

ओह्ह, यह अब और अधिक समझ में आता है> _>
डाउनगोट

11

पर्ल, 41 बाइट्स

s,␉,    ,g;s,^  ( +),/@{[$1=~y| |*|r]}/,

-pध्वज के साथ भागो , जैसे:

perl -pe 's,␉,    ,g;s,^  ( +),/@{[$1=~y| |*|r]}/,'
#     ↑   └───────────────────┬───────────────────┘
#     1 byte               40 bytes

टैब द्वारा बदलें (बैश में, टाइप करने का प्रयास करें Control-V Tab।)


1
जिस तरह से perlउस बैकरेस्ट को मौके पर बदल दिया गया, काश मेरे sedपास भी होता।
शीशमारा

7

चेडर , 60 57 56 बाइट्स

3 बाइट्स @Conor O'Brien की बदौलत बची

@.sub(/\t/g," "*4).sub(/^ +/gm,i->"/"+"*"*(i.len-2)+"/")

मेरी इच्छा है कि चेडर के पास बेहतर स्ट्रिंग प्रारूपण हो।

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

व्याख्या

यह एक फंक्शन है। @एक कार्यशील संपत्ति का प्रतिनिधित्व करता है (जैसे रूबी का &:) आपको ऐसा करने की अनुमति देता है: `ar.map (@। head (-1))

@                      // Input
 .sub( /\t/g, " "*4)   // Replace tabs with four spaces
 .sub(
   /^ +/gm,            // Regex matches leading spaces
   i ->                // i is the matched leading spaces
     "/"+              // The / at the beginning
     "*"*(i.len-2)+    // Repeat *s i-2 times
     "/"                // The / at the end
 )

यदि आप regex से परिचित नहीं हैं:

/^ +/gm

यह मूल रूप से हर ( ) लाइन ( ) की शुरुआत ( ) में एक या एक से अधिक ( +) रिक्त स्थान से मेल खाता था ।^gm


क्या चेडर रेगेक्स में शाब्दिक टैब काम करते हैं? इसके अलावा, /^ +/रेगेक्स के रूप में पर्याप्त है, क्योंकि हम यह मान सकते हैं कि अग्रणी स्थान कम से कम 4 लंबाई के होंगे।
कॉनर ओ'ब्रायन

@ ConorO'Brien मुझे विश्वास है कि वे करते हैं, लेकिन मैंने परीक्षण नहीं किया है
डाउगैट

परिवर्तन से पहले टैब को प्रतिस्थापित किया जाना चाहिए।
कॉनर ओ'ब्रायन

@ ConorO'Brien ओह> _> मेरे पास मूल रूप से यह तरीका था और फिर मैंने इसे बदल दिया
डाउनगेट

6

मैथेमेटिका, 97 बाइट्स

a=StringReplace;a[a[#,"\t"->"    "],StartOfLine~~b:" "..:>"/"<>Table["*",StringLength@b-2]<>"/"]&

अनाम फ़ंक्शन। एक स्ट्रिंग को इनपुट के रूप में लेता है और एक स्ट्रिंग को आउटपुट के रूप में देता है।


5

पायथन 3, 124 बाइट्स

अच्छे ol 'regex का उपयोग करता है।

import re
lambda I:re.sub('^\s*(?m)',lambda m:'/'+'*'*len(m.group()[:-2])+'/',re.sub('\t+',lambda g:' '*4*len(g.group()),I))

Ideone यह!


4

जावा 210 207 बाइट्स

यह संदर्भ समाधान है जो इसे भोलेपन से लागू करता है।

void a(String[]a){for(String s:a){s=s.replaceAll("\t", "    ");String x,y="";int j,i=s.length()-(x=s.replaceAll("^\\s+", "")).length();if(i>3){y="/";for(j=0;j++<i-1;)y+="*";y+="/";}System.out.println(y+x);}}

6
विम: ३ 65 बाइट्स, चेडर: ६५ बाइट्स, जावास्क्रिप्ट: ,५ बाइट्स, फिर २१० बाइट्स में जावा है: पी मैं हैरान क्यों नहीं हूं
डाऊगाट

1
जावा में बहुत संक्षिप्त कोड: P
रोहन झुनझुनवाला

आप 1 बाइट बचाने के लिए अंतिम फॉर-लूप को बदल सकते हैं for(int j=0;++j<i-1;):। इसके अलावा, आप int पहले हटा सकते हैं j, और पहले से मौजूद इंट के बाद इसे रख सकते हैं:int i=s.length()-(x=s.replaceAll("^\\s+", "")).length(),j;
केविन क्रूज़सेन

क्या यह (a) -> {...} का उपयोग करके बाइट दाढ़ी बनाने के लिए एक मेमना नहीं हो सकता है?
बनियाक्लोवेन

कम से कम यह अभी भी पठनीय है और आगे की टिप्पणियों की आवश्यकता नहीं है: ओ)
रेने

3

जावास्क्रिप्ट ईएस 6, 75 बाइट्स

s=>s.replace(/\t/g,"    ").replace(/^ +/gm,k=>`/${"*".repeat(k.length-2)}/`)

\tअपने कोड में शाब्दिक टैब से बदलें ।


3

जावा, 185 184 167 152 बाइट्स

S->S.map(s->{s=s.replace("\t","    ");String t=s.replaceAll("^ +","");int n=s.length()-t.length();if(n>3){s="/";for(;n-->2;)s+="*";s+="/"+t;}return s;})

प्रारंभिक पोस्ट में दिए गए स्ट्रिंग ऐरे की बहुत ढीली परिभाषा को देखते हुए, मैंने उपयोग किया है Stream<String>जो कुछ परिणामी बाइट बचत के लिए अनुमति देता है।

मैंने एक ही लक्ष्य को प्राप्त करने के लिए RI से भिन्न तकनीकों का उपयोग किया। एल्गोरिथ्म ही बल्कि एक ही है।

परीक्षण और अपुष्ट :

import java.util.Arrays;
import java.util.stream.Stream;

public class Main {

  public static void main(String[] args) {
    StringStreamTransformer sst = lines -> lines.map(line -> {
      line = line.replace("\t","    ");
      String trimmed = line.replaceAll("^ +", "");
      int startingSpaces = line.length() - trimmed.length();
      if (startingSpaces > 3) {
        line = "/";
        for(;startingSpaces > 2; startingSpaces--) {
          line += "*";
        }
        line += "/" + trimmed;
      }
      return line;
    });


    Stream<String> lines = Arrays.stream(new String[]{
      "lots of spaces and tabs after\t\t    \t\t         \t\t\t\t\t",
      "no space",
      " 1 space",
      "  2 spaces",
      "   3 spaces",
      "    4 spaces",
      "     5 spaces",
      "      6 spaces",
      "       7 spaces",
      "        8 spaces",
      "\t1 tab",
      "\t\t2 tabs",
      "\t\t\t3 tabs"
    });
    sst.map(lines).map(s -> s.replace(" ", ".").replace("\t","-")).forEach(System.out::println);


  }
}

2

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

\tएक वास्तविक टैब वर्ण (0x09) के साथ प्रतिस्थापित किया जाना चाहिए।

\t
4$* 
%`^  ( +)
/$.1$**/

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

व्याख्या

\t
4$* 

प्रत्येक टैब को चार स्थानों से बदलें।

%`^  ( +)
/$.1$**/

प्रत्येक पंक्ति को अलग से ( %) पंक्ति 2+Nकी शुरुआत में रिक्त स्थान से मिलान करके और /.../जहां ...की Nप्रतियां है, उसे बदल दें *



2

एसईडी (56 + 1-आर के लिए) 57

s/⇥/    /g;tr;:r;s,^ ( *) ,/\1/,;T;:l;s,^(/\**) ,\1*,;tl

कहाँ एक टैब है
1. रिक्त स्थान के साथ टैब बदलता है।
2. पहले और अंतिम अग्रणी स्थान को बदल देता है /
3. जब तक कोई मैच नहीं होता है तब तक /और 0+ *s के बाद पहला स्थान बदलता है *


चूंकि sed निर्दिष्ट किया गया है, कोड के आसपास किसी भी एकल उद्धरण की आवश्यकता नहीं है, उसी तरह -r '' को अपने अन्य sed उत्तरों से हटाने के साथ, क्योंकि आप उस स्क्रिप्ट को स्रोत फ़ाइल में संग्रहीत किए जाने के रूप में मान सकते हैं जिसे आप चलाते हैं -f। N या ​​r जैसे किसी भी अतिरिक्त झंडे का उपयोग प्रत्येक बाइट के रूप में किया जाना चाहिए। इस प्रकार, आप 2 बाइट्स बचाते हैं।
शशमौरा

यही मैंने सोचा था, लेकिन मुझे यकीन है। धन्यवाद।
रिले

;टी आदेश के बाद या तो आवश्यक नहीं है। जैसे ही कोड के लिए, आपको तीसरे sकमांड की शुरुआत में ^ की आवश्यकता होती है , अन्यथा इस "3/5" जैसे इनपुट को "3 / * 5" में बदल दिया जाता है। पहले sकमांड में आपके पास वास्तव में एक टैब है, लेकिन यह सही ढंग से नहीं दिखाया गया है और भ्रामक है, इसलिए या तो \ t का उपयोग करें या बाद में निर्दिष्ट करें, कि एक टैब था।
शीशमारा

@seshoumara धन्यवाद, मैं अपने फोन से पोस्ट करने की कोशिश कर रहा हूं ... यह करना सबसे आसान काम नहीं है।
रिले

मुझे लगता है कि मैंने इस उत्तर को संपादित करने में सभी दूसरों की तुलना में अधिक समय बिताया है। सहायता के लिए धन्यवाद!
रिले

1

विश्वविद्यालय को Emacs Lisp (या डिफ़ॉल्ट रूप से tabifyऔर untabifyअकेले) में कार्यक्रमों के लिए थोड़ी अधिक जगह की अनुमति देने पर विचार करना चाहिए , क्योंकि वे जावा की तुलना में अधिक वर्बोज़ प्राप्त करते हैं। यह उन छात्रों (या शिक्षकों) पर भी ध्यान देना चाहिए जिनकी पहचान का आकार चार से छोटा है या जो कुछ गैर-सी-जैसे भाषा में कोड करने के लिए होते हैं।

निम्नलिखित समाधान में 206 बाइट्स हैं

(lambda (b e)(let((tab-width 4))(untabify b e)(goto-char b)(while(re-search-forward"^ +"e t)(replace-match(format"/%s/"(apply'concat(mapcar(lambda(x)"*")(number-sequence 1(-(length(match-string 0))2)))))))))

यह मानते हुए कि tab-widthइसे स्पष्ट रूप से सेट करने की आवश्यकता नहीं है, हम उनमें से 20 को बचा सकते हैं।

(lambda(b e)(untabify b e)(goto-char b)(while(re-search-forward"^ +"e t)(replace-match(format"/%s/"(apply'concat(mapcar(lambda(x)"*")(number-sequence 1(-(length(match-string 0))2))))))))

और ungolfed संस्करण इस तरह दिखेगा

(defun end-tab-war (beg end)
  (let ((tab-width 4))
    (untabify beg end)
    (goto-char beg)
    (while (re-search-forward "^ +" end t)
      (replace-match
       (format
        "/%s/"
        (apply 'concat
               (mapcar (lambda(x) "*")
                       (number-sequence 1
                                        (- (length (match-string 0))
                                           2)))))))))

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

 (format"/%s/"(apply'concat(mapcar(lambda(x)"*")(number-sequence 1(-(length(match-string 0))2)))))

जो खुद 97 बाइट लेता है। कुछ स्ट्रिंग n बार कॉपी करने के लिए एक छोटा समाधान अत्यधिक सराहना की जाती है।


1

रूबी, 52 47 + 1 (पी ध्वज) = 48 बाइट्स

संपादित करें : पूरे 5 बाइट्स सहेजे गए, मान इंक के लिए धन्यवाद

ruby -pe 'gsub ?\t," "*4;sub(/^ +/){?/+?**($&.size-2)+?/}'

1
क्या आप pइस तथ्य का लाभ उठाने के लिए ध्वज का उपयोग कर सकते हैं कि (छ) उप संशोधित होता है $_और इस प्रकार मुद्रित मूल्य में परिवर्तन होता है? ruby -pe 'gsub ?\t," "*4;sub(/^ +/){?/+?**($&.size-2)+?/}'
मूल्य इंक

धन्यवाद, मुझे नहीं पता था कि (g)subधमाके के बिना $_यहाँ संशोधित किया जा सकता है।
मिचू

1

GNU सेड, 66 64 + 1 (आर झंडा) = 65 बाइट्स

संपादित करें: 1 बाइट कम रिले के सुझाव के लिए धन्यवाद ।

s/\t/    /g
s,^ ( *) ,/\1\n,
:
s,^(/\**) ( *\n),\1*\2,
t
s,\n,/,

रन: sed -rf formatter.sed input_file

\nउस पंक्ति के शेष पाठ से अग्रणी रिक्त स्थान के साथ अलग होने का कारण यह है , क्योंकि अन्यथा एक C ++ लाइन इस तरह की टिप्पणी के साथ शुरू होती है, जो सरल रेखा 4 जैसे या यहां तक ​​कि /* */बारी में बदल जाएगी । चूंकि sed प्रत्येक इनपुट लाइन के लिए स्क्रिप्ट निष्पादित करता है, इसलिए पढ़ने पर पैटर्न स्पेस में कोई भी शुरू नहीं किया जाता है।/*****/s,^(/\**) ,\1*,s,^(/\**) ( */),\1*\2,\n


/जब तक आप प्रतिस्थापित नहीं करते तब तक आप समापन में नहीं डालकर एक बाइट बचा सकते हैं \n। यह आपको लाइन 4 में मेल करने के लिए बचाता है।
रिले

@ रिले अच्छा कैच। कोड अपडेट किया गया।
शीशमारा

\tटैब कैरेक्टर के साथ बदलकर आप दूसरे को बचा सकते हैं ।
रिले

@ रिले यह सच है, लेकिन चूंकि यह यहां एक टैब के रूप में मुद्रित नहीं किया जाएगा, इसलिए मैं संदेह में हूं। मैं इसे भविष्य के साथ जवाब के लिए ध्यान में रखूँगा बाइट के साथ और अधिक प्रतिस्पर्धी मायने रखता है।
शेषमारा
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.