Oneliner เพื่อรวมบรรทัดที่มีเขตข้อมูลแรกเหมือนกัน


15

นี่คือคำถาม codegolf แรกของฉันดังนั้นฉันจึงขออภัยล่วงหน้าหากไม่เหมาะสมและฉันยินดีรับข้อเสนอแนะ

ฉันมีไฟล์ที่มีรูปแบบนี้:

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

ฉันมีทั้งสคริปต์ ruby ​​และ awk ที่จะรวมสิ่งนี้ แต่ฉันคิดว่าเป็นไปได้ที่จะมีผู้เข้าชมสั้น ๆ ie หนึ่งซับที่สามารถใช้พร้อมกับท่อและคำสั่งอื่น ๆ ในบรรทัดคำสั่ง ฉันไม่สามารถหามันได้และสคริปต์ของฉันเองก็คือการบีบอัดบรรทัดคำสั่ง

แนะนำให้ใช้อักขระที่สั้นที่สุด อินพุตไม่จำเป็นต้องเรียงลำดับ แต่เราสนใจเพียงการผสานบรรทัดต่อเนื่องเข้ากับฟิลด์แรกที่ตรงกัน มีบรรทัดไม่ จำกัด ด้วยการจับคู่เขตข้อมูลแรก ฟิลด์ 1 อาจเป็นอะไรก็ได้เช่นชื่อผลไม้ชื่อที่ถูกต้องเป็นต้น

(ฉันทำงานบน MacOS ดังนั้นฉันจึงสนใจใช้งานส่วนใหญ่ที่ทำงานบน mac)


นี่คือตัวอย่างที่สอง / ทดสอบ ประกาศ "|" เป็นตัวคั่น ช่องว่างก่อน "|" ไม่เกี่ยวข้องและถ้าไม่พอใจควรได้รับการพิจารณาเป็นส่วนหนึ่งของคีย์ ฉันใช้ "%" เป็นตัวคั่นในผลลัพธ์ แต่อีกครั้งคุณสามารถเปลี่ยนตัวคั่นได้ (แต่ไม่ได้ใช้วงเล็บเหลี่ยม)

การป้อนข้อมูล:

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 การขึ้นบรรทัดใหม่ไม่เกี่ยวข้องกับฉัน แต่ในความคิดของฉันไม่มีบรรทัดว่างและไม่มีการตรวจสอบข้อผิดพลาด ฉันถือว่าทุกบรรทัดมีข้อความและอย่างน้อยคอลัมน์แรกและตัวคั่น
MichaelCodes

ตัดสินโดยกรณีทดสอบมันจะบันทึกเพื่อสมมติว่าคีย์ทั้งหมดจะถูกจัดกลุ่ม? เช่น: ["A|some text", "B|other text", "A|yet some other text"]ไม่ใช่อินพุตที่ต้องการทดสอบเนื่องจากคำหลักAไม่ใช่หนึ่งในอีกรายการหนึ่งในรายการ
Kevin Cruijssen

ฉันคิดว่าทุกคีย์ถูกจัดกลุ่ม ฉันไม่ได้กังวลเกี่ยวกับกรณีที่พวกเขาไม่ได้ แต่ในทางทฤษฎีแล้วพวกเขาจะไม่ได้รับการปฏิบัติเหมือนเป็นกุญแจสำคัญ
MichaelCodes

คำตอบ:


7

เรติน่า 17 ไบต์

  • บันทึก 12 ไบต์ด้วย @MartinEnder
  • บันทึก 1 ไบต์ขอบคุณ @ jimmy23013

ทำคะแนนในไบต์ที่เข้ารหัส ISO 8859-1

ใช้;แทน|ตัวคั่นฟิลด์อินพุต

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

ลองออนไลน์



2
@LeakyNun เพราะ lookarounds เป็นอะตอม ครั้งแรกที่ใช้การค้นหาด้วยภาพจะรวบรวมคำนำหน้าทั้งหมดของบรรทัดและหลังจากนั้นโปรแกรม regex จะไม่ย้อนกลับไปใช้อีกต่อไป
Martin Ender

5

V , 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
แจ้งให้คุณทราบ ???
Erik the Outgolfer

@ ΈρικΚωνσταντόπουλοςใช่ไหม นั่นเป็นปัญหาหรือไม่?
DJMcMayhem

สำหรับปริศนานี้คุณสามารถเปลี่ยนตัวคั่นได้เช่นใช้ "%" เป็นตัวคั่น ไม่เช่น
Erik the Outgolfer

2
"|" ตัวคั่นใช้ได้ดี
MichaelCodes

@MichaelCodes คุณสามารถเพิ่มกรณีทดสอบเพิ่มเติมอีกหลายรายการเพื่อให้เราสามารถตรวจสอบว่าโซลูชันมีจำนวนหรือไม่?
DJMcMayhem

3

Perl -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

สิ่งนี้ใช้ประโยชน์จากฟังก์ชันการรวม string_agg ที่มีประโยชน์ใน PostgreSQL การป้อนข้อมูลจากตารางที่เรียกว่าTมี 2 คอลัมน์และ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 เพื่ออ่านเนื้อหาของรูปแบบไฟล์ที่ระบุไว้ในตารางด้วยมิฉะนั้นคุณจะไม่แก้ไขปัญหาเดียวกับคนอื่น
จูลส์

@Jules ยุติธรรมเพียงพอผมคิดว่านี้เริ่มต้น I / O concensus เมื่อฉันตอบ อ่านคำถามอีกครั้งแม้ว่าฉันจะแก้ไขคำตอบ
MickyT

2

C, 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,'|');}

ทำงานร่วมกับ gcc /การเปลี่ยนแปลงที่จะคั่น รับอินพุตจาก stdin และเขียนเอาต์พุตไปยัง stdout ดังนั้นโทรด้วยการเปลี่ยนเส้นทางอินพุต./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

Pyth - 15 ไบต์

การตั้งสมมติฐานบางอย่างเกี่ยวกับปัญหาจะเปลี่ยนเมื่อ OP ชี้แจง

jm+Khhd-sdK.ghk

ลองมันออนไลน์ได้ที่นี่


วิธีนี้ใช้ไม่ได้หาก "คีย์" เป็นคำแทนที่จะเป็นตัวอักษรเดียว (OP ชี้แจงในความคิดเห็น)
DJMcMayhem

1

Python 3 - 146 Bytes

อินพุตคือชื่อไฟล์หรือพา ธ ไฟล์ของไฟล์เอาต์พุตคือ stdout อาจจะสั้นกว่านี้มากถ้าฉันสามารถป้อนข้อความแบบดิบจากบรรทัดคำสั่ง

รับอินพุตจาก stdin และเอาต์พุตไปยัง stdin "|"ติดตั้งกับตัวคั่น ในการทดสอบอินพุตตัวอย่างแรกให้ใช้ตัวคั่น" | "

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 เริ่มต้นของเราที่นี่ และเนื่องจากคำตอบอื่น ๆ ก็รับอินพุตจาก STDIN ด้วยฉันคิดว่า OP นั้นใช้ได้กับมัน
Denker

@DenkerAffe เอาล่ะฉันจะแก้ไขมันจะไร้ประโยชน์อย่างสมบูรณ์เพราะฉันไม่คิดว่าคุณจะสามารถป้อนข้อมูลหลายบรรทัดจาก stdin ได้
Keatinge

แต่คุณสามารถเปลี่ยนเส้นทางการป้อนข้อมูลเมื่อคุณเรียกใช้สคริปต์
mIllIbyte

1

Java 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;}

หมายเหตุ:วิธีการด้านบนสร้างและส่งคืน a HashMapด้วยคู่ของคีย์ - ค่าที่ต้องการ อย่างไรก็ตามมันไม่ได้พิมพ์ออกมาในผลลัพธ์ที่ถูกต้องเหมือนในคำถามของ OP พร้อมกับ|ตัวคั่นเอาต์พุตระหว่างคีย์และค่าใหม่ ตัดสินโดยคำตอบ SQL ของ MickeyTที่เขาส่งคืนตารางฐานข้อมูลที่ฉันคิดว่านี่เป็นสิ่งที่อนุญาต ถ้าไม่ควรเพิ่มจำนวนไบต์สำหรับฟังก์ชั่นการพิมพ์

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

PowerShell ขนาด 85 ไบต์

มีการรวมสตริงโดยใช้ hashtable:

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

ตัวอย่าง

เนื่องจาก PowerShell ไม่สนับสนุนการเปลี่ยนเส้นทาง stdin ผ่าน<ฉันจึงสันนิษฐานว่า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

APL, 42 ตัวอักษร

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

ไม่ใช่หนึ่งไบต์ในการเข้ารหัส APL
Zacharý

0

Sed, 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

q / kdb +, 46 ไบต์

วิธีการแก้:

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 "%"
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.