Tüm karakterlerin aynı olduğu sütunları bulma


18

SO ile ilgili bu soruya rastladım ve güzel bir golf mücadelesi yapacağını düşündüm. İşte burada:

Meydan okuma:

Bir karakter dizisi dizisi, her satırda bir tane okuyan ve her dizenin aynı karaktere sahip olduğu tüm konumların bir listesini veren bir program yazın.

Giriş ve çıkış:

Giriş, her biri bir satırsonu olan bir veya daha fazla yazdırılamayan boşluk olmayan ASCII karakter satırından oluşur. Sen olabilecek tüm giriş hatları aynı uzunlukta olduğunu varsayalım. Satır olduğunu değil girişin parçası olarak kabul edilecek (yani eşleşen bir karakter olarak çıktı o olmamalı).

Örnek girdi (SO sorusundan utanmadan çalınmış):

abcdefg
avcddeg
acbdeeg

Girişi okuduktan sonra, programınız eşleşen her sütunun pozisyonlarını ve içerdikleri karakterleri yazdırmalıdır. (Eşleşen sütun olmadığını erkenden belirleyebiliyorsa, programınız başka girdilerin okunmasını durdurabilir, ancak gerekmeyebilir.) Makul çıktı biçimlerine izin verilir; özellikle, konumlar için 0 veya 1 tabanlı dizine ekleme özelliğini kullanabilirsiniz.

Yukarıdaki giriş için örnek çıktı (0 tabanlı indeksleme kullanarak):

0: a
3: d
6: g

puanlama:

Bu kod golf, çok kısa cevap kazanır. Beraberlik durumunda, ek özellikler için kesirli kravat kesici karakterleri verilebilir:

  • Length eşit olmayan uzunluktaki giriş hatlarını doğru işlemek için grafikler. (Çıktı, en kısa giriş çizgisinin sonunu geçecek konumlar içermemelidir.)
  • Rasgele UTF-8 kodlu Unicode karakterlerden oluşan girişi doğru işlemek için grafikler.

İlham almak için, SO sorusunda bazı çözülmemiş çözümler bulabilirsiniz (yukarıya bakın).

Açıklamalar:

  • Basitçe olduğu gibi pozisyonları ve karakterleri birleştirerek 0a3d6g, yok değil "makul çıktı" olarak sayılır. Çıktının her öğesi arasında açık bir şekilde ayrıştırılabilmesi için bir tür ayırıcı (boşluk gibi) sağlamalısınız.

  • Giriş, standart giriş akışında ( stdin) veya seçtiğiniz dil için en doğal metin dosyası giriş mekanizması kullanılarak sağlanacaktır . (Seçtiğiniz dil etmezse sahip ruhu içinde en yakın görünüyor ne yapmak, dosya girişi için doğal bir mekanizma.)

  • Girilecek daha fazla veri olmadığında (yani bir dosya sonu koşulu oluştuğunda) girdi sona erer. Dilerseniz siz edebilir girişi (besbelli, daha sonra giriş parçası olarak saymak gerekir) boş bir çizgi ile sona erdirilebilir gerektirir. Bunu yaparsanız, başkalarının test için doğru girdi sağlayabilmesi için lütfen yanıtınızda belirtin.

  • Sonuncusu da dahil olmak üzere her giriş satırı yeni satır karakteri ile biter. Yanıtınız bu yeni satırı eşleşen bir sütun olarak bildirmemelidir. (Çözümünüz, son satırın yeni satırda bitmeyen girdileri de işleyebiliyorsa sorun değil, ancak bu gerekli değildir.)


Boş bir satır girdiyi sonlandırır mı?
Steven Rumbalski

Msgstr "Çıktının her bir elemanı arasında açık bir şekilde ayrıştırılabilmesi için bir tür ayırıcı sağlamalısınız." Boşluk ayırıcı olarak sayılır mı?
Steven Rumbalski

@StevenRumbalski: Girilecek daha fazla veri olmadığında giriş sona erer; Diliniz EOF'u tespit etmekte sorun yaşıyorsa sanırım boş bir satır bırakabilirim. Ve evet, bir alan mükemmel derecede iyi bir ayırıcıdır.
Ilmari Karonen

Bazı keyfi UTF-8 kodlu Unicode karakterleri örnek koduna sahip olabilir miyiz?
kullanıcı bilinmiyor

Yanıtlar:


12

APL, 25 karakter

∩/{0=⍴⍵:⍬⋄(⊂⍵,⍨¨⍳⍴⍵),∇⍞}⍞

Tercüman olarak Dyalog APL'yi (sürüm 13) kullandım. Eşit olmayan uzunluktaki girişleri ve Unicode (UTF-8) karakterlerini işler.

Örnekler:

      ∩/{0=⍴⍵:⍬⋄(⊂⍵,⍨¨⍳⍴⍵),∇⍞}⍞
abcdefg
avcddeg
acbdeeg

  1 a  4 d  7 g  

      ∩/{0=⍴⍵:⍬⋄(⊂⍵,⍨¨⍳⍴⍵),∇⍞}⍞
test日本
blat日本国foo

  4 t  5 日  6 本 

Açıklama, biraz sağdan sola:

  • Bu cevabın ana parçası, kıvırcık parantez içinde tanımlanan doğrudan işlevdir (temel olarak anonim işlev). Doğru argümanı ile belirtilir .
    • 0=⍴⍵:⍬ilk ifademizdir ve boş bir satır alıp almadığımızı kontrol eder (yani, bitti). Kolonun sağındaki ifadeyi koşullu olarak yürütmek için bir koruma (birçok fonksiyonel programcıya tanıdık bir yapı) kullanır. Bu durumda, 0 sağ bağımsız değişkenin şekline / uzunluğuna ( ) eşitse , boş set ( ) değerini döndürürüz .
    • işlev içindeki iki ifadeyi ayırır. Önceki ifade değerlendirilmediyse (ve böylece hiçbir şey döndürmediyse), bir sonraki ifadeye geçeriz.
    • Öz-referans işlevini ( ) . İşlevin bağımsız değişkeni quote-quad ( ) tarafından verilen, değerlendirilmemiş kullanıcı girişi satırıdır .
    • ⊂⍵,⍨¨⍳⍴⍵ dize içindeki her karakter için çiftler oluşturur, burada her çiftin ilk elemanı dizedeki konumu ve ikinci elemanı karakterdir.
    • ⍳⍴⍵ 1'den l'e kadar bir vektör verir ⍴⍵ veya giriş dizesinin uzunluğunu .
    • ⍵,⍨¨değiştirilen birleştirme işlevini ( ,⍨) her bir ( ¨) öğesine soluna ( bu durumda kullanıcının girdisi) ve sağına . Birleştirme işlevinin yerine getirilmesi, sol ve sağ argümanlarının değiştirilmesine neden olur.
    • Son olarak, girdi satırlarını birbirinden ayırabilmemiz için sonucu kullanarak ekliyoruz .
  • Başlangıçta fonksiyonumuzu kullanıcı girişi ile besliyoruz ( ) .
  • Son olarak, tüm alt vektörlerde bulunan çiftleri vererek, /kesişim fonksiyonunu ( ) kullanarak elde ettiğimiz çift vektörleri vektörümüzü azaltırız ( ) .

İyi bir nedenden ötürü, JL veya GolfScript için sahip olmadığım APL'yi her gördüğümde viseral bir negatif yanıtım var. Mükemmel bir çözüm için yine de +1.
Steven Rumbalski

Aslında J'ye geçmeyi düşünüyordum ... Bunu nedenler listemde ele alacağım. :)
Dillon Cower

12

Golfscript (28 karakter)

n/zip:^,,{.^=.&.,1>{;;}*}%n*

Unicode üzerinden geçiş yaparken karakter kümesi sorunları var, bu yüzden çeyrek puan bonusu yok.


1
+1. Bunun cevabımdan daha az upvote olmaması gerekir.
Steven Rumbalski

9

J, 57 51 44 40 karakter

,.&.>y;y{{.z[y=.I.*/2=/\]z=.];._2]1!:1]3

Oraya yavaş ama eminim gidiyorum. Bence bu hala ideal olmaktan uzak.

Bir kanca kullanmanın cevap olacağını ama ne yazık ki olmayacağını hissettim (44 karakter):

,.&.>((];({{.)~)([:I.[:*/2=/\]))];._2]1!:1]3

Kısaltmak için tamamen farklı bir yönteme ihtiyacım olabilir.


1
+1. Ama evet, J'den daha iyisini bekliyorum
Steven Rumbalski

Bunun cevabımdan daha az upvote olmaması gerekir.
Steven Rumbalski

1
@StevenRumbalski Upvotes her zaman kodun göreli boyutlarını yansıtmaz. Bazen dil popülerliği yarışması olur. Golfscript cevabının APL ile orada olması gerektiğini kabul ediyorum, ne yazık ki zaten benim oyumu verdim ve daha fazla itmek yardımcı olamaz.
Gareth

8

Haskell, 64 karakter

main=interact$show.foldl1(filter.flip elem).map(zip[0..]).lines

Eşit uzunluktaki çizgileri işler. Unicode desteği geçerli yerel ayarlara bağlıdır.

Örnek çıktı:

[(0,'a'),(3,'d'),(6,'g')]

+1. Bunun cevabımdan daha az upvote olmaması gerekir.
Steven Rumbalski

7

Python 2, skor 81.5 ( 116 94 86 83 82 bayt eksi bonus)

import sys
i=0
for x in zip(*sys.stdin)[:-1]:
 i+=1
 if len(set(x))<2:print i,x[0]

Güzel bir Python golf için +1 ama tüm DÖRT karakter kaybedebilirsiniz: [:-1]girişin sonunda yabancı bir satırsonu (bu soru bile orada görünmüyor gibi) çıkarmak sürece gerekli değildir.
ChristopheD

@ChristopheD: Aslında sonucudur zip(*sys.stdin)olduğunu [('a', 'a', 'a'), ('b', 'v', 'c'), ('c', 'c', 'b'), ('d', 'd', 'd'), ('e', 'd', 'e'), ('f', 'e', 'e'), ('g', 'g', 'g'), ('\n', '\n', '\n')]. Son satırdaki yeni satırları soymaktan kaçınmanın bir yolunu göremiyorum. Yanlış anladıysam lütfen beni düzeltin. Upvot için teşekkürler.
Steven Rumbalski

Veri dosyanızdaki son satırsonu kaldırırsanız, bu satır için grup tamamlanmamıştır (bir '\ n' karakterini özlüyor, bu nedenle zip yalnızca aradığımız verileri dikkate alıp döndürerek kaldırılmasına izin veriyor [:-1]. Egzip([1,2,3,4],[1,2,3])=> [(1, 1), (2, 2), (3, 3)]
ChristopheD

@ChristopheD: Spesifikasyon başına "girdi, her biri bir satırsonu olan [...] satırdan [...] oluşur."
Ilmari Karonen

1
Bu cevabı reddeden kişi nedenini açıklar mı?
Steven Rumbalski

5

(Bash) Kabuk Betiği, 105 karakter

Herkes bunun için biraz daha hileler varsa, lütfen yorum yapmaktan çekinmeyin!

for((i=1;i<`tail -1 $1|wc -c`;i++))do
x="cut -c$i $1";y=`$x`;[ `$x|uniq|wc -l` = 1 ]&& echo $i ${y:3};done

Sonuç:

1 A
4 gün
7 g

Bunu işe almakta zorlanıyorum; bunu örnek girdi üzerinde çalıştırmak gibi bir dizi hata yazdırır /tmp/cols.sh: line 2: [1: command not foundve başka bir şey yazdırmaz .
Ilmari Karonen

@Ilmari Karonen: Bu bir Mac'te (kar leoparı, 10.6.2) test edildi, ancak başka bir yerde çalışmalı. Yarın Linux'ta düzeltmesini istiyorum (küçük bir düzeltme olmalı)
ChristopheD

2
ormaaj temsilcisi yoktu ama yorum yapmak istedi: Ilmari için aradan sonra eksik bir boşluk nedeniyle tatili [; ve $ {y: 3}, yalnızca tam 3 satır girişle çalışmasına neden olur. Getirileri düzeltmek ve optimize etmek (100 karakter) while((++i%`tail -1 $1|wc -c`));do x=`cut -c$i $1`;((`uniq|wc -l`==1))<<<"$x"&&echo $i ${x: -1};doneve varsayılan değerleri kullanmak for((;++i<`tail -1 $1|wc -c`;))do, bir tane daha kaydetmeye izin vermelidir, ancak bash'da sabit bir hata var.
Peter Taylor

4

Perl, 87 karakter (−½ char tie-break bonusu)

İşte SO iş parçacığının kendi çözümünün golf edilmiş bir versiyonu :

chomp($a=$b=<>);$a&=$_,$b|=$_ for<>;@$_=$$_=~/./sgfor a,b;$b[$i++]eq$_&&say"$i:$_"for@a

SO versiyonundan farklı olarak, çıktı için 1 tabanlı indeksler kullanılır. Perl 5.10 sayözelliğini kullanır , bu nedenle perl -M5.010(veya) ile çalıştırılması gerekir perl -E.

SO sürümü gibi, bu kod da değişken uzunluktaki satırları işler ve standart giriş ve çıkış UTF-8 modunda olsaydı keyfi Unicode girişi işleyebilir. Ne yazık ki, ücretsiz olmayan -CS komut satırı anahtarını belirtmedikçe, varsayılan olarak değildirler . Böylece, −½ char bonusu kazanır, ancak bonus one bonusu kazanmaz.

Edit: +1 char bir hatayı düzeltmek için: sadece giriş dizeleri satır beslemeleri içermiyor çünkü sonunda $a(örneğin "+" & "J" eq "\n") olamaz anlamına gelmez .


1
Bunun chopyerine kullanarak 1 karakter kaydedebilirsiniz chomp.
Toto

@ M42: Geçerli sürümün sağlamlığını sevmeme rağmen iyi bir nokta. Sanırım mşimdilik saklayacağım , şu an sıralamasında herhangi bir fark yaratmış gibi değil. :)
Ilmari Karonen

3

T-SQL

SELECT N.number, letter = MIN(SUBSTRING(L.line, N.number, 1))
FROM Lines AS L
INNER JOIN master.dbo.spt_values AS N ON N.type = 'P'
WHERE N.number BETWEEN 1 AND (SELECT MAX(LEN(L2.line)) FROM Lines AS L2)
GROUP BY N.number
HAVING COUNT(DISTINCT SUBSTRING(L.line, N.number, 1)) = 1
ORDER BY N.number

2

Scala 115 107: (−¼ UTF-8 kullanımı için)

io.Source.stdin.getLines.map(_.zipWithIndex).toList.flatten.groupBy(_._2).map(_._2.toSet).filter(_.size==1)

ve ungolfed Source.fromFile ("f")yerine stdindaha iyi test edilebilir:

io.Source.fromFile ("f").
  getLines.map (_.zipWithIndex).
    toList.flatten.groupBy (_._2). 
      map (_._2.toSet).
        filter (_.size==1)

Sonuç:

List(Set((a,0)), Set((g,6)), Set((d,3)))

Kullanmak için 8 boyutunun küçültülmesi için Gareth'e teşekkürler stdin.


8 karakter kaydetmek stdinyerine kullanamaz fromFile("f")mısınız?
Gareth

2

VBA ( 307.25 284 - 0.75 bonus = 283.25)

Bu zaten kazanılmış biliyorum, ama işte benim çekim (bir dosya okuma, sadece bir dize - io eklenmesi gerekir). Kullanmam gerektiğini beğendiml() tekrar . Genellikle gerçek hayattaki programımı tekrarlama ihtiyacım yoktur. Sadece çok fazla test yaptım, ama bunun unicode bonus puan şartını kapsadığına inanıyorum. Aynı zamanda vbCrhat sonlandırıcı olduğunu varsayar . Bu, bu nedenle tüm sistemlere tercüme edilmeyebilir.

Kod:

Function a(i)
b=Split(Left(i,Len(i)-1),vbCr):c=UBound(b):For q=1 To Len(b(c)):d=Mid(b(c),q,1):If l(b,c,q,d) Then a=a & q & ": " & d & vbCr:Next
End Function
Function l(m, n, o, p)
If n+1 Then l=IIf(o<=Len(m(n)),Mid(m(n),o,1)=p,0) And l(m,n-1,o,p) Else l=Mid(m(n+1),o,1)=p
End Function

Örnek giriş / çıkış:

Debug.Print a("abcdefghijklmnop" & vbCr & "abcdefg" & vbCr & "abcabcghijkl" & vbCr)

1: a
2: b
3: c
7: g

2

Q, 32

{a!((*:)x)a:(&)1=(#:')(?:')(+)x}

kullanım

q){a!((*:)x)a:(&)1=(#:')(?:')(+)x}[("abcdefg";"avcddeg";"acbdeeg")]
0| a
3| d
6| g

K, 22

Yukarıdaki çözüm, K fonksiyonlarını bir Q yorumlayıcısına geçirmek yerine tamamen K ile yazarak 22'ye indirgenebilir ve gerekli parantez sayısını azaltır.

{a!@[*x]a:&1=#:'?:'+x}

1

PHP, 123 127 :(

Bundan memnun değilim (olması gereken iyileştirmeler olmalı), ama işte gidiyor:

<?$a=$b=trim(fgets(STDIN));while($l=fgets(STDIN)){$a&=$l;$b|=$l;}$n=-1;while(@$a[++$n]){echo$a[$n]!=$b[$n]?'':"$n:{$a[$n]}\n";}

Kanıt çalışır.

Herkes $ a ve $ b'yi başlatmanın daha akıllıca bir yolunu düşünebilirse, lütfen bana bildirin. Başlangıçta vardı $a=$b=$n=''ve $ b sonunda doğru, ama [empty] & [anything] == [empty], $ $ hiç içerik yoktu.


Düzenleme: Yeni satır işleme (+6) düzeltildi ama kapanış etiketi (-2) düştü.


Merak ediyorum, neden cevaplarınızın çoğunu topluluk wiki'sine dönüştürüyorsunuz?
Gareth

Bunu kastetmedim. Uzun zaman önce CodeGolf'a ilk katıldığımda birisi bana bunun standart olduğunu söyledi. Alışkanlığı kırmak zorunda. Şimdi wiki un-wiki olabilir. codegolf.stackexchange.com/a/2249/1419 (yorumlara bakın)
Bay Llama

Ben kod golf soruları için SO üzerinde şeyler yapmanın standart yolu olduğunu düşünüyorum, ama burada aksi takdirde kimse hiç bir üne sahip olurdu. :-)
Gareth

Muhtemelen onları işaretleyebilir ve bir moderatörden onları CW'den çıkarmasını isteyebilirsiniz . Sadece bunun bir hata olduğunu açıklayın.
Ilmari Karonen

Dışarıda bırakarak iki karakter kaydedebilirsiniz ?>. Ancak, sadece kodunuzun bir hata olduğunu fark ettim: tüm satırlar belirtildiği gibi bir son satır içeriyorsa ekstra bir eşleşme yazdırır.
Ilmari Karonen

1

JavaScript ( 125134 140 )

for(i=s=[];I=s[++i]=prompt(o='');S=I);for(c=-1;w=r=++c<S.length;o+=r?c+':'+C+'\n':'')for(C=S[c];w<i;)r&=s[w++][c]==C;alert(o)

Demo: http://jsfiddle.net/Fv7kY/4/

Düzenleme 1 : Diş tellerini önlemek için döngüler yeniden düzenlenir. İ'yi ile başlat[] birleştirmek içins . Artışı wifadeye taşıyın .

Edit 2 : S=ISon girilen kelimeyi yakalamak ve kullanarak kaydetmek için ayarlayın s[1]. Birleştir r=1ve ++c<S.length. AyarlamakC=s[c] iç döngüde ve karşılaştırmak Ckısaltın ifadeye yerine önceki ve sonraki kelimelerin s[w][c]==s[w++][c]lazıms[w++][c]==C . Toplam 9 karakter kaydetti. Ayrıca ayarlayın w=r=...çünkü bu doğru w=1olduğunda hangi ile başlatmak gerekir w.


1

Yakut (71)

a,*s=*$<.lines
(a.size-1).times{|i|s.all?{|t|t[i]==a[i]}&&p([i,a[i]])}

çıktı:

[0, "a"]
[3, "d"]
[6, "g"]

Not: Ruby 1.9 gerektirir; Ruby 1.8 uyumluluğu için t[i]ile değiştirin t[i,1].
Ilmari Karonen

1

Ortak Lisp, 183165 karakter

(let((l(loop for m =(read-line)until(equal m "")collect m)))(loop for c across(car l)for i from 0 if(null(remove c(mapcar(lambda(y)(char y i))l)))collect(list i c)))

Okunabilir format:

(let ((l (loop for m = (read-line) until (equal m "") collect m)))
  (loop for c across (car l)
        for i from 0 
        if (null (remove c 
                         (mapcar (lambda(y) (char y i))l)))
        collect(list i c)))

Bunu doğrudan REPL'e girin ve boş bir satırla biten satırları girin.


1

C, 126 karakter

char a[999],b[999];main(i){for(gets(a);gets(b);)for(i=0;b[i];++i)a[i]^b[i]?a[i]=0:0;
while(i--)a[i]&&printf("%d:%c\n",i,a[i]);}

Buna bakıyordum ama daha küçük yapamıyorum. Yeni bir yaklaşım gerekebilir.

(Bonus puan yok; sadece ilk satır daha kısasa farklı boyuttaki satırları işler.)


0

.NET 4 ile C # (280)

using c=System.Console;class P{static void Main(){char[]a=c.ReadLine().ToCharArray();int r,i,l=a.Length;m:i=0;n:r=c.Read();if(r>0&&r!=10&&r!=13){if((int)a[i]!=r)a[i]='\0';i++;goto n;}for(;i>0&&i<l;)a[i++]='\0';if(r>0)goto m;for(i=0;i<l;i++)if(a[i]!='\0')c.WriteLine(i+":"+a[i]);}}
  • 1 satır, 280 karakter
  • Gerekli tüm ifadeleri ve Main yöntemini içerir.
  • Program sonunda boş bir satır gerektirmez , ancak kabul eder
  • Boş satırlar yok sayılır
  • Herhangi bir uzunluktaki giriş dizelerini işler.
  • Çıktıyı sonuna kadar ayırır (orijinal cevap artımlı çıktı sağlar)

Okunabilir versiyon

    char[]a=c.ReadLine().ToCharArray();
    int r,i,l=a.Length;
    m:
    i=0;
    n:
    r=c.Read();
    if(r>0&&r!=10&&r!=13){
        if((int)a[i]!=r)
            a[i]='\0';
        i++;
        goto n;
    }
    for(;i>0&&i<l;)
        a[i++]='\0';
    if(r>0)
        goto m;
    for(i=0;i<l;i++)
        if(a[i]!='\0')
            c.WriteLine(i+":"+a[i]);

Orijinal cevap

c = System.Console; sınıf P {statik void Main () {char [] a; var b = c.ReadLine (); a = b.ToCharArray (); ise (b! = "") {için (int i = 0; i

  • 1 satır
  • 207 karakter
  • Gerekli tüm ifadeleri ve Main yöntemini içerir.
  • Boş bir satır girildiğinde program sona erer.
  • Birinciden daha kısa olan giriş dizelerini işlemez.


Okunabilir sürüm:

    static void Readable()
    {
        char[]a;
        string b=System.Console.ReadLine();
        a=b.ToCharArray();
        while(b.Length>0)
        {
            for (int i = 0; i < a.Length; i++)
            {
                if (a[i] != b[i])
                {
                    a[i] = '\0';
                }
                else
                {
                    System.Console.WriteLine(i+": "+a[i]);
                }
            }
            b=System.Console.ReadLine();
        }
    }


Bunu testteki test girdisinde çalıştırdığımda anladım 0: a 1: b 2: c 3: d 4: e 5: f 6: g 0: a 2: c 3: d 6: g 0: a 3: d 6: g. Beklenen çıktı olurdu 0: a 3: d 6: g.
Ilmari Karonen

@Ilmari Tamam, ancak her giriş satırından sonra aynı olan sütunları / karakterleri çıkarır. Bir dosyayı standart girdi olarak besliyorsanız, çıktı garip görünebilir, ancak manuel olarak girerseniz, mantıklı olduğunu düşünüyorum. Yine de nasıl refactor olacağını düşüneceğim.
Dr.Wily's Apprentice

İlk satırdan daha uzun bir satır varsa çözümünüz çöküyor.
Timwi

@Timwi Ah ... bunu belirttiğin için teşekkürler!
Dr.Wily's Apprentice

0

python 122 karakterleri :

print("\n".join([str(i)+':'+str(x[0]) for i,x in enumerate(zip(*[tuple(x) for x in input().split()])) if len(set(x))<2]))

)ve arasında bir boşluk gerekmez for. Bunun yerine …str(x[0]) for i,x…, yapabilirsiniz …str(x[0])for i,x…. Ayrıca geliyor tuple(x) forve.split()])) if
Cyoce

-1

Yakut (242)

s = %w{ abcdefg avcddeg acbdeeg aejdjeggd }
cols = []
s.sort{ |a, b| b.size <=> a.size }[0].size.times do |i|
  uneq=true
  l = s[0][i]
  s.each { |w| uneq = false if l != w[i] }
  cols << [l, i] if uneq
end
cols.each { |c| puts c.join('|') }

Zorluğun amacı, satırları standart girdiden okumaktı. Bu kavramın gerçekten mevcut olmadığı, ancak Ruby'nin STDIN( ARGFveya sadece düz gets) olduğu diller (tarayıcı içi JavaScript gibi) için biraz gevşeklik yapmaya hazırım .
Ilmari Karonen

Ah tamam. Ancak STDIN'in bir satırı kabul ettiğini düşünmek, "Başka bir satıra girin veya 'n' durdurmak" gibi bir şey mi varsaymaktır? Bu nedenle, bir dizi oluşturmak için bir döngü oluşturun.
agmcleod

Soruya bazı açıklamalar ekledim. Temel olarak, dosya sonuna ulaşana kadar giriş satırlarını okumaya devam etmelisiniz.
Ilmari Karonen

bir ton gereksiz boşluk var.
Cyoce

-1

C #

List<string> strings = new List<string> { "abcdefg", "avcddeg", "acbdeeg", "aejdjeggd" };
var transposes = from index in Enumerable.Range(0, strings.First().Length)
                 select new string((from s in strings select s[index]).ToArray());
int i = 0;
foreach(string transpose in transposes)
{
   if (transpose.Distinct().Count() == 1)
     Console.WriteLine("{0}: {1}", i , transpose[0]);
   i++;
}

1
Merhaba Arjang ve codegolf'a hoş geldiniz.SE! Cevabınız hakkında birkaç yorum: Birincisi, bu bir kod golf mücadelesi olduğu için, çözümünüzü mümkün olduğunca kısa tutmaya çalışmanız bekleniyor; sadece başlangıç ​​olarak, tek karakterlere kolayca kısaltabileceğiniz uzun değişken isimleriniz ve kaldırabileceğiniz fazla boşluk varsa. (Kodunuzun okunabilir bir versiyonunu "golfed" ile birlikte göndermeniz iyi, ancak aslında golfçü bir çözüm de göndermelisiniz.) , onları kodlamayın.
Ilmari Karonen
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.