Aynı ilk alana sahip satırları birleştirmek için Oneliner


15

Bu benim ilk codegolf sorum, bu yüzden uygun değilse önceden özür dilerim ve herhangi bir geri bildirim hoş geldiniz.

Bu biçimde bir dosya var:

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

Gerçek içerik, sınırlayıcı gibi değişir. İçeriği sadece metindir. Sınırlayıcı, her satırda yalnızca bir kez görünür. Bu bulmaca için, sınırlayıcıyı değiştirmekten çekinmeyin, örneğin sınırlayıcı olarak "%" kullanın.

Istenilen çıktı:

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

Bunu birleştirmek için hem yakut hem de awk betiklerim var, ancak kısa bir oneliner'e sahip olmanın mümkün olduğundan şüpheleniyorum. yani komut satırındaki borular ve diğer komutlarla birlikte kullanılabilen bir astar. Bunu anlayamıyorum ve kendi komut dosyam sadece komut satırında sıkıştırmak.

En kısa karakterler tercih edilir. Girdi zorunlu olarak sıralanmaz, ancak yalnızca birbirini izleyen satırları eşleşen ilk alanlarla birleştirmekle ilgileniriz. Eşleşen ilk alanlarla sınırsız satır var. Alan 1 herhangi bir şey olabilir, örneğin meyve isimleri, özel isimler, vb.

(MacOS üzerinde çalışıyorum, bu yüzden kişisel olarak en çok mac üzerinde çalışan uygulamalarla ilgileniyorum).


İşte ikinci bir örnek / test. Uyarı "|" sınırlayıcıdır. "|" Den önceki boşluk önemsizdir ve yeniden gönderilmesinin anahtarın bir parçası olarak görülmesi gerekir. Çıktıda sınırlandırılmış olarak "%" kullanıyorum, ancak yine sınırlayıcıyı değiştirmekten çekinmeyin (ancak köşeli parantez kullanmayın).

Giriş:

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

Istenilen çıktı:

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

Çıktının başında yeni bir satıra izin veriliyor mu?
llIbyIte

orijinal soruya yorum ekledi. Ve mIllIbyte, yeni bir satır benim için alakasız. Ama benim düşünceme göre, boş satırlar ve hata kontrolü yok. Tüm satırların metin ve en azından ilk sütun ve sınırlayıcıya sahip olduğunu varsayıyorum.
MichaelCodes

Test senaryolarına bakılırsa, tüm anahtarların gruplandırılmış olduğunu varsaymak saklı mıdır? Yani: ["A|some text", "B|other text", "A|yet some other text"]test etmek için istenen bir girdi değil, çünkü için anahtar kelimeler Alistede birbiri ardına değil.
Kevin Cruijssen

Tüm anahtarların gruplandığını varsaydım. Teorik olarak, benzersiz anahtarlar gibi davranılmayacaklarsa da, olmadıkları durumla ilgilenmiyorum.
MichaelCodes

Yanıtlar:



5

V , 16 13 bayt

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

Çevrimiçi deneyin!

Dedin

Sınırlayıcıyı değiştirmekten çekinmeyin

Ben de seçtim | sınırlayıcı olarak . Bu geçersizse, bana bildirin, değiştireceğim.

Açıklama:

ò                #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
Bilmelisin ???
Outgolfer Erik

@ ΈρικΚωνσταντόπουλος Evet? Bu bir problem mi?
James

Bu bulmaca için, sınırlayıcıyı değiştirmekten çekinmeyin, örneğin sınırlayıcı olarak "%" kullanın. değil yani
Erik Outgolfer

2
"|" sınırlayıcı iyidir.
MichaelCodes

@MichaelCodes Bir çözümün önemli olup olmadığını doğrulayabilmemiz için birkaç test örneği daha ekleyebilir misiniz?
James

3

Perl -0n, 2 + 43 = 45 bayt

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

Demo:

$ 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 bayt

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

Bu, PostgreSQL'deki kullanışlı string_agg toplama işlevinden yararlanır. Girdi, T2 sütunlu Ave adlı bir tablodan B. Daha iyi soruya uymak için bir dosyadan tabloya veri yüklemek için komut dahil ettim. Dosya Tda öyle. Tablo oluştur ifadesini saymadım.
Çıktı sırasız olacak, ancak bu bir sorunsa birORDER BY A

SQLFiddle benim için oynamak istemedi, ancak bu benim kurulumumda aldım.

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
Adil olmak gerekirse, ben de tabloda belirtilen dosya formatının içeriğini okumak için bir KOPYA komutu eklemenizi öneririm, aksi takdirde herkesle aynı sorunu çözmezsiniz.
Jules

@ Yeterince adil, cevap verdiğimde bu varsayılan i / o konsensüsünü düşünüyordum . Cevabı düzenleyeceğim halde soruyu tekrar okuyorum.
MickyT

2

C, 127 bayt

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 ile çalışır. Sınırlayıcı olarak değiştirildi/ . Stdin'den girdi alır ve çıktıyı stdout'a yazar, bu yüzden girdi yeniden yönlendirmesi ile arayı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

Pyth - 15 bayt

Sorun netleştirildiğinde birkaç varsayımda bulunmak, OP açıklığa kavuştuğunda değişecektir.

jm+Khhd-sdK.ghk

Burada çevrimiçi deneyin .


"Anahtar" tek bir harf yerine bir sözcükse, bu işe yaramaz. (OP yorumlarda açıklığa kavuştu)
James

1

Python 3-146 Bayt

Girdi dosyanın dosya adı veya dosya yoludur, çıktı stdout olur. Komut satırından ham metin olarak girdi alabilirsem çok daha kısa olabilir

Stdin'den girdi alır ve stdin'e çıktı alır. Ayırıcı ile kurulum "|". İlk örnek girişi test etmek için ayırıcıyı kullanın" | "

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

Zorluk açıkça girdinin bir dosyadan okunmasını gerektirmez, bu yüzden varsayılan I / O yöntemlerimizin burada geçerli olduğunu düşünüyorum. Ve diğer cevaplar da STDIN'den girdi aldığından, OP'nin iyi olduğunu düşünüyorum.
Denker

@DenkerAffe Tamam, onu düzenleyeceğim, tamamen işe yaramaz olacak çünkü stdin'den gerçek çok satırlı girdi bile verebileceğinizi sanmıyorum.
Keatinge

Ancak komut dosyasını çalıştırdığınızda giriş yeniden yönlendirmesi yapabilirsiniz.
MissIbyte

1

Java 7, 167 bayt

Muhtemelen farklı bir yaklaşımla daha fazla golf yapılabilir.

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

NOT: Yukarıdaki yöntem HashMap, istenen anahtar / değer çiftleriyle a oluşturur ve döndürür . Ancak, |anahtarlar ve yeni değerler arasında çıkış sınırlayıcı olarak OP'nin sorusundaki gibi tam çıktıda yazdırmaz . Bakılırsa MickeyT SQL cevap o ben bu izin düşündüm bir veritabanı tablosu döndü; değilse, bir yazdırma işlevi için daha fazla bayt eklenmelidir.

Test edilmemiş ve test kodu:

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("=", "|"));
        }
    }
}

Çıktı:

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 bayt

Dizeler hashtable kullanılarak birleştirilir:

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

Misal

PowerShell üzerinden stdin yönlendirmesini desteklemediğinden <, Get-Content .\Filename.txt |varsayılan G / Ç yöntemi olarak kullanılacağını varsayıyorum .

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

Çıktı

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 karakter

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

APL kodlamasında bir bayt değil.
Zacharý

0

Sed, 55 bayt

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

Test sürüşü :

$ 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 bayt

Çözüm:

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

Misal:

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"

Açıklama:

`: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 "%"
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.