एक ही पहले क्षेत्र के साथ लाइनों को मर्ज करने के लिए ऑनलाइनर


15

यह मेरा पहला कोडगोल्फ प्रश्न है, इसलिए मैं अग्रिम में माफी मांगता हूं यदि यह उचित नहीं है, और मैं किसी भी प्रतिक्रिया का स्वागत करता हूं।

मेरे पास इस प्रारूप वाली फाइल है:

a | rest of first line
b | rest of second line
b | rest of third line
c | rest of fourth line
d | rest of fifth line
d | rest of sixth line

वास्तविक सामग्री बदलती है, जैसा कि सीमांकक है। सामग्री सिर्फ पाठ हैं। सीमांकक केवल एक बार प्रति पंक्ति दिखाई देता है। इस पहेली के लिए, सीमांकक को बदलने के लिए स्वतंत्र महसूस करें, उदाहरण के लिए "%" का उपयोग परिसीमनक के रूप में करें।

वांछित उत्पादन:

a | rest of first line
b | rest of second line % rest of third line
c | rest of fourth line
d | rest of fifth line % rest of sixth line

मेरे पास पहले से ही इसे मर्ज करने के लिए माणिक और जाग दोनों लिपियों हैं, लेकिन मुझे संदेह है कि यह एक छोटा ऑनलाइनर होना संभव है। यानी एक लाइनर जिसका उपयोग कमांड लाइन पर पाइप और अन्य कमांड के साथ किया जा सकता है। मैं इसका पता नहीं लगा सकता, और मेरी अपनी स्क्रिप्ट कमांड लाइन पर बस सेक करने के लिए लंबी है।

सबसे छोटे पात्र पसंद किए गए। इनपुट आवश्यक रूप से सॉर्ट नहीं किया गया है, लेकिन हम केवल पहली फ़ील्ड के मिलान के साथ लगातार लाइनों को मर्ज करने में रुचि रखते हैं। पहले फ़ील्ड के मिलान के साथ असीमित लाइनें हैं। फ़ील्ड 1 कुछ भी हो सकता है, जैसे फलों के नाम, उचित नाम आदि।

(मैं मैकओएस पर चलता हूं, इसलिए मैं व्यक्तिगत रूप से मैक पर चलने वाले कार्यान्वयन में सबसे अधिक दिलचस्पी रखता हूं)।


यहाँ एक दूसरा उदाहरण / परीक्षण है। सूचना "|" सीमांकक है। "" से पहले का स्थान अप्रासंगिक है, और यदि नाराजगी को कुंजी का हिस्सा माना जाना चाहिए। मैं आउटपुट में सीमांकित के रूप में "%" का उपयोग कर रहा हूं, लेकिन फिर से, सीमांकक को बदलने के लिए स्वतंत्र महसूस करता हूं (लेकिन स्क्वायर ब्रैकेट का उपयोग नहीं किया जाता है)।

इनपुट:

why|[may express] surprise, reluctance, impatience, annoyance, indignation
whom|[used in] questions, subordination
whom|[possessive] whose
whom|[subjective] who
whoever|[objective] whomever
whoever|[possessive] whosever
who|[possessive] whose
who|[objective] whom

वांछित उत्पादन:

why|[may express] surprise, reluctance, impatience, annoyance, indignation
whom|[used in] questions, subordination%[possessive] whose%[subjective] who
whoever|[objective] whomever%[possessive] whosever
who|[possessive] whose%[objective] whom

क्या आउटपुट की शुरुआत में एक नई रेखा की अनुमति है?
mIllIbyte

मूल प्रश्न में टिप्पणी जोड़ दी। और, @mIllIbyte, एक नई रेखा मेरे लिए अप्रासंगिक है। लेकिन मेरे विचार में, कोई खाली लाइनें नहीं हैं, और कोई त्रुटि जाँच नहीं है। मुझे लगता है कि सभी पंक्तियों में पाठ है, और कम से कम पहला कॉलम और सीमांकक है।
माइकलकोड

परीक्षण के मामलों को देखते हुए, क्या यह मान लिया जाए कि सभी कुंजियाँ समूहीकृत हैं? Ie: ["A|some text", "B|other text", "A|yet some other text"]परीक्षण के लिए एक वांछित इनपुट नहीं है, क्योंकि कीवर्ड Aसूची में एक के बाद एक नहीं हैं।
केविन क्रूज़सेन

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

जवाबों:


7

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

  • 12 बाइट्स ने @MartinEnder को धन्यवाद दिया
  • 1 बाइट @ jimmy23013 की बदौलत बच गई

आईएसओ 8859-1 इनकोडेड बाइट्स में स्कोर किया गया।

इनपुट क्षेत्र विभाजक ;के |रूप में के बजाय का उपयोग करता है ।

(?<=(.+;).+)¶\1
%

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



2
@LeakyNun क्योंकि लुकर परमाणु हैं। पहली बार लुकअराउंड का उपयोग किया जाता है, यह लाइन के पूरे उपसर्ग को पकड़ता है, और बाद में रेगेक्स इंजन इसमें पीछे नहीं हटेगा।
मार्टिन एंडर

5

वी , 16 13 बाइट्स

òí^¨á«©.*úsî±

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

तुमने कहा था

परिसीमन को बदलने के लिए स्वतंत्र महसूस करें

इसलिए मैंने परिसीमनकर्ता के |रूप में चुना । यदि यह अमान्य है, तो मुझे बताएं और मैं इसे बदल दूंगा।

स्पष्टीकरण:

ò                #Recursively:
 í               #Search for the following on any line:
  ^¨á«©          #1 or more alphabetic characters at the beginning of the line
       .*        #Followed by anything
         ús      #Mark everything after this to be removed:
           î±    #A new line, then the first match again (one or more alphabetic characters)

1
आपको बता देंगे???
आउटगोल्फ

@ ΥριΈνσταντόποςλο? हाँ? क्या यही समस्या है?
जेम्स

इस पहेली के लिए, सीमांकक को बदलने के लिए स्वतंत्र महसूस करें, उदाहरण के लिए "%" का परिसीमनक के रूप में उपयोग करें। नहीं है
एरिक आउटगोल्फ

2
"|" सीमांकक ठीक है।
माइकलकोड

@MichaelCodes आप कुछ और परीक्षण मामलों को जोड़ सकते हैं ताकि हम यह सत्यापित कर सकें कि कोई समाधान गिना जाता है या नहीं?
जेम्स

3

पर्ल -0n, 2 + 43 = 45 बाइट्स

s/
.*\|/%/g,print for/(.*\|)((?:
\1|.)*
)/g

डेमो:

$ perl -0ne 's/
> .*\|/%/g,print for/(.*\|)((?:
> \1|.)*
> )/g' <<EOF
> why|[may express] surprise, reluctance, impatience, annoyance, indignation
> whom|[used in] questions, subordination
> whom|[possessive] whose
> whom|[subjective] who
> whoever|[objective] whomever
> whoever|[possessive] whosever
> who|[possessive] whose
> who|[objective] whom
> EOF
why|[may express] surprise, reluctance, impatience, annoyance, indignation
whom|[used in] questions, subordination%[possessive] whose%[subjective] who
whoever|[objective] whomever%[possessive] whosever
who|[possessive] whose%[objective] whom

3

SQL (PostgreSQL), 43 72 बाइट्स

COPY T FROM'T'(DELIMITER'|');SELECT a,string_agg(b,'%')FROM T GROUP BY A

यह PostgreSQL में उपयोगी string_agg समग्र कार्य का लाभ उठाता है। इनपुट एक तालिका से है जिसे T2 कॉलम Aऔर कहा जाता है B। बेहतर प्रश्न का अनुपालन करने के लिए मैंने तालिका में एक फ़ाइल से डेटा लोड करने के लिए कमांड को शामिल किया है। फ़ाइल Tभी है। मैंने टेबल क्रिएट स्टेटमेंट नहीं गिना है।
आउटपुट अनियंत्रित हो जाएगा, लेकिन अगर यह एक समस्या है तो इसे ए के साथ ठीक किया जा सकता हैORDER BY A

SQLFiddle मेरे लिए खेलना नहीं चाहता था, लेकिन यह वही है जो मुझे मेरे सेटअप में मिलता है।

CREATE TABLE T (A VARCHAR(9),B VARCHAR(30));

COPY T FROM'T'(DELIMITER'|');SELECT a,string_agg(b,'%')FROM T GROUP BY A
a   string_agg
--- ----------------------------------------
c   rest of fourth line
b   rest of second line%rest of third line
a   rest of first line
d   rest of fifth line%rest of sixth line

1
निष्पक्ष होने के लिए, मैं आपको तालिका में निर्दिष्ट फ़ाइल प्रारूप की सामग्री को पढ़ने के लिए COPY कमांड सहित सुझाव दूंगा, अन्यथा, आप सभी के समान समस्या का समाधान नहीं कर रहे हैं।
जूल्स

@ जूल्स फेयर काफी, मैं इस डिफॉल्ट i / o कॉन्सेप्ट के बारे में सोच रहा था जब मैंने जवाब दिया। हालांकि मैं उत्तर को संपादित करूंगा, इस प्रश्न को फिर से प्रस्तुत करना।
मिकट

2

सी, 127 बाइट्स

o[99],n[99],p=n;main(i){for(;gets(n);strncmp(o,n,i-p)?printf(*o?"\n%s":"%s",n),strcpy(o,n):printf(" /%s",i))i=1+strchr(n,'|');}

जीसीसी के साथ काम करता है। परिसीमन को बदल दिया /। स्टडिन से इनपुट लेता है और स्टैडआउट में आउटपुट लिखता है, इसलिए इनपुट रिडायरेक्शन के साथ कॉल करें./a.out <filename

Ungolfed:

o[99],n[99] //declare int, to save two bytes for the bounds
,p=n; //p is an int, saves one byte as opposed to applying an (int) cast to n,
//or to declaring o and n as char arrays
main(i){for(;gets(n);strncmp(o,n,i-p //an (int)n cast would be needed;
// -(n-i) does not work either,
//because pointer arithmetics scales to (int*)
)?printf(*o?"\n%s":"%s" //to avoid a newline at the beginning of output
,n),strcpy(o,n):printf(" /%s",i))i=1+strchr(n,'|');}

1

पायथ - 15 बाइट्स

समस्या के बारे में कुछ धारणाएँ बनाना, जब ओपी स्पष्ट करेगा तो बदल जाएगा।

jm+Khhd-sdK.ghk

इसे यहाँ ऑनलाइन आज़माएँ


यदि "कुंजी" एक अक्षर के बजाय एक शब्द है, तो यह काम नहीं करता है। (टिप्पणियों में ओपी ने स्पष्ट किया)
जेम्स

1

पायथन 3 - 146 बाइट्स

इनपुट फ़ाइल का फ़ाइल नाम या फ़ाइल पथ है, आउटपुट stdout है। अगर मैं कमांड लाइन से कच्चे पाठ के रूप में इनपुट ले सकता हूं तो बहुत कम हो सकता है

स्टडिन से इनपुट लेता है और स्टडिन को आउटपुट देता है। विभाजक के साथ सेटअप "|"। पहला उदाहरण इनपुट का परीक्षण करने के लिए विभाजक का उपयोग करें" | "

from itertools import*
for c,b in groupby([x.split("|")for x in input().split("\n")],key=lambda x:x[0]):print(c,"|"," % ".join((a[1]for a in b)))

चुनौती को स्पष्ट रूप से इनपुट को फ़ाइल से पढ़ने की आवश्यकता नहीं है, इसलिए मुझे लगता है कि हमारे डिफ़ॉल्ट I / O तरीके यहां लागू होते हैं। और चूंकि अन्य उत्तर भी एसटीडीआईएन से इनपुट लेते हैं, मुझे लगता है कि ओपी इसके साथ ठीक है।
डेनकर

@DenkerAffe ठीक है मैं इसे संपादित करूँगा, यह पूरी तरह से बेकार हो जाएगा क्योंकि मुझे नहीं लगता कि आप स्टड से वास्तविक मल्टीलाइन इनपुट भी दे सकते हैं।
कीटिंग

जब आप स्क्रिप्ट चलाते हैं तो आप इनपुट पुनर्निर्देशन कर सकते हैं।
mIllIbyte

1

जावा 7, 167 बाइट्स

यह शायद एक अलग दृष्टिकोण का उपयोग करके अधिक गोल्फ हो सकता है ..

import java.util.*;Map c(String[]a){Map m=new HashMap();for(String s:a){String[]x=s.split("=");Object l;m.put(x[0],(l=m.get(x[0]))!=null?l+"%"+x[1]:x[1]);}return m;}

नोट: ऊपर दी गई विधि HashMapवांछित कुंजी-मूल्य जोड़े के साथ बनाता है और लौटता है । हालाँकि, यह इसे सटीक आउटपुट में नहीं छापता है जैसा कि ओपी के प्रश्न |में होता है, कुंजियों और नए मूल्यों के बीच आउटपुट-सीमांकक के रूप में। मिकीट के एसक्यूएल जवाब को देखते हुए जहां उन्होंने एक डेटाबेस तालिका वापस की, मुझे लगा कि यह अनुमति है; यदि प्रिंट फ़ंक्शन के लिए अधिक बाइट्स नहीं जोड़े जाने चाहिए।

Ungolfed और परीक्षण कोड:

import java.util.*;

class Main{

    static Map c(String[] a){
        Map m = new HashMap();
        for(String s : a){
            String[] x = s.split("\\|");
            Object l;
            m.put(x[0], (l = m.get(x[0])) != null
                            ? l + "%" + x[1]
                            : x[1]);
        }
        return m;
    }

    public static void main(String[] a){
        Map m = c(new String[]{
            "why|[may express] surprise, reluctance, impatience, annoyance, indignation",
            "whom|[used in] questions, subordination",
            "whom|[possessive] whose",
            "whom|[subjective] who",
            "whoever|[objective] whomever",
            "whoever|[possessive] whosever",
            "who|[possessive] whose",
            "who|[objective] whom"
        });

        // Object instead of Map.EntrySet because the method returns a generic Map
        for (Object e : m.entrySet()){
            System.out.println(e.toString().replace("=", "|"));
        }
    }
}

आउटपुट:

whoever|[objective] whomever%[possessive] whosever
whom|[used in] questions, subordination%[possessive] whose%[subjective] who
why|[may express] surprise, reluctance, impatience, annoyance, indignation
who|[possessive] whose%[objective] whom

1

पॉवरशेल, 85 बाइट्स

हैशटेबल का उपयोग करके स्ट्रिंग्स को विलय कर दिया जाता है:

%{$h=@{}}{$k,$v=$_-split'\|';$h.$k=($h.$k,$v|?{$_})-join'%'}{$h.Keys|%{$_+'|'+$h.$_}}

उदाहरण

चूंकि PowerShell स्टड पुनर्निर्देशन का समर्थन नहीं करता है <, इसलिए मैं मान रहा हूं कि Get-Content .\Filename.txt |इसे डिफ़ॉल्ट I / O विधि के रूप में उपयोग किया जाएगा।

Get-Content .\Filename.txt | %{$h=@{}}{$k,$v=$_-split'\|';$h.$k=($h.$k,$v|?{$_})-join'%'}{$h.Keys|%{$_+'|'+$h.$_}}

उत्पादन

whoever|[objective] whomever%[possessive] whosever
why|[may express] surprise, reluctance, impatience, annoyance, indignation
whom|[used in] questions, subordination%[possessive] whose%[subjective] who
who|[possessive] whose%[objective] whom

1

एपीएल, 42 वर्ण

{⊃{∊⍺,{⍺'%'⍵}/⍵}⌸/↓[1]↑{(1,¯1↓'|'=⍵)⊂⍵}¨⍵}

APL एन्कोडिंग में एक बाइट नहीं है।
ज़ाचरी

0

सेड, 55 बाइट्स

:a N;:b s/^\([^|]*\)|\([^\n]*\)\n\1|/\1|\2 %/;ta;P;D;tb

परीक्षण चालन :

$ echo """why|[may express] surprise, reluctance, impatience, annoyance, indignation
> whom|[used in] questions, subordination
> whom|[possessive] whose
> whom|[subjective] who
> whoever|[objective] whomever
> whoever|[possessive] whosever
> who|[possessive] whose
> who|[objective] whom""" | sed ':a N;:b s/^\([^|]*\)|\([^\n]*\)\n\1|/\1|\2 %/;ta;P;D;tb'
why|[may express] surprise, reluctance, impatience, annoyance, indignation
whom|[used in] questions, subordination %[possessive] whose %[subjective] who
whoever|[objective] whomever %[possessive] whosever
who|[possessive] whose %[objective] whom

0

क्यू / केडीबी +, ४६ बाइट्स

समाधान:

exec"%"sv v by k from flip`k`v!("s*";"|")0:`:f

उदाहरण:

q)exec"%"sv v by k from flip`k`v!("s*";"|")0:`:f
who    | "[possessive] whose%[objective] whom"
whoever| "[objective] whomever%[possessive] whosever"
whom   | "[used in] questions, subordination%[possessive] whose%[subjective] who"
why    | "[may express] surprise, reluctance, impatience, annoyance, indignation"

स्पष्टीकरण:

`:f            // assumes the file is named 'f'
("s*";"|")0:   // read in file, assume it has two columns delimitered by pipe
flip `k`v      // convert into table with columns k (key) and v (value)
exec .. by k   // group on key
"%"sv v        // join values with "%"
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.