Temukan kolom di mana semua karakter sama

18

Saya menemukan pertanyaan ini pada SO dan berpikir itu akan menjadi tantangan golf yang bagus. Jadi begini:

Tantangan:

Tulis sebuah program yang membaca urutan string karakter, satu per baris, dan menampilkan daftar semua posisi di mana setiap string memiliki karakter yang sama.

Masukan dan keluaran:

Input terdiri dari satu atau lebih baris karakter ASCII non-spasi yang dapat dicetak, masing-masing diikuti oleh baris baru. Anda dapat mengasumsikan bahwa semua jalur input memiliki panjang yang sama. Baris baru tidak dianggap sebagai bagian dari input (yaitu Anda tidak harus menampilkannya sebagai karakter yang cocok).

Input contoh (tanpa malu-malu dicuri dari pertanyaan SO):

abcdefg
avcddeg
acbdeeg

Setelah membaca input, program Anda harus mencetak posisi setiap kolom yang cocok dan karakter yang dikandungnya. (Program Anda mungkin, tetapi tidak perlu, berhenti membaca input lebih lanjut jika dapat menentukan lebih awal bahwa tidak ada kolom yang cocok.) Setiap format output yang masuk akal diizinkan; khususnya, Anda dapat menggunakan pengindeksan berbasis-0 atau berbasis-1 untuk posisi tersebut.

Contoh output untuk input di atas (menggunakan pengindeksan berbasis 0):

0: a
3: d
6: g

Mencetak:

Ini kode golf, jadi jawaban tersingkat menang. Jika terjadi seri, karakter pecahan tie-breaker dapat diberikan untuk fitur tambahan:

  • −½ karakter untuk menangani jalur input dengan panjang yang tidak sama. (Output tidak boleh mengandung posisi melewati ujung jalur input terpendek.)
  • −¼ karakter untuk menangani input dengan benar yang terdiri dari karakter Unicode yang disandikan UTF-8.

Untuk inspirasi, Anda dapat menemukan beberapa solusi tanpa kulit di pertanyaan SO (lihat di atas).

Klarifikasi:

  • Cukup menggabungkan posisi dan karakter, seperti dalam 0a3d6g, tidak dihitung sebagai "output yang masuk akal". Anda harus menyediakan semacam pemisah (seperti spasi) antara masing-masing elemen output sehingga dapat diuraikan secara jelas.

  • Input akan diberikan pada aliran input standar ( stdin), atau menggunakan mekanisme input file teks apa pun yang paling alami untuk bahasa pilihan Anda. (Jika bahasa pilihan Anda tidak memiliki mekanisme alami untuk input file, lakukan apa pun yang tampaknya paling dekat dalam semangat.)

  • Input berakhir ketika tidak ada lagi data untuk dibaca (yaitu ketika kondisi akhir file terjadi). Jika Anda menginginkannya, Anda mungkin mengharuskan input diakhiri oleh baris kosong (yang Anda seharusnya tidak dihitung sebagai bagian dari input, jelas). Jika Anda melakukannya, harap sebutkan di jawaban Anda sehingga orang lain dapat memberikan input yang benar untuk pengujian.

  • Setiap baris input, termasuk yang terakhir, diakhiri dengan karakter baris baru. Jawaban Anda tidak boleh melaporkan baris baru ini sebagai kolom yang cocok. (Tidak masalah jika solusi Anda juga dapat menangani input di mana baris terakhir tidak berakhir pada baris baru, tetapi itu tidak diperlukan.)

Ilmari Karonen
sumber
Jadi, apakah sebuah baris kosong menghentikan input?
Steven Rumbalski
"Anda harus menyediakan semacam pemisah antara masing-masing elemen output sehingga dapat diurai secara ambigu." Apakah spasi dianggap sebagai pemisah?
Steven Rumbalski
@StevenRumbalski: Input berakhir ketika tidak ada lagi data untuk dibaca; Saya kira saya dapat mengizinkan garis kosong yang tertinggal jika bahasa Anda mengalami kesulitan mendeteksi EOF. Dan ya, ruang adalah pemisah yang sangat bagus.
Ilmari Karonen
Bisakah kita memiliki beberapa kode sampel karakter Unicode yang dikodekan UTF-8?
pengguna tidak diketahui

Jawaban:

12

APL, 25 karakter

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

Saya menggunakan Dyalog APL (versi 13) sebagai juru bahasa saya. Ini menangani kedua input dengan panjang yang tidak sama dan karakter Unicode (UTF-8).

Contoh:

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

  1 a  4 d  7 g  

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

  4 t  5 日  6 本 

Penjelasan, agak dari kanan ke kiri:

  • Bagian utama dari jawaban ini adalah fungsi langsung (pada dasarnya, fungsi anonim), didefinisikan dalam kurung kurawal. Argumen yang benar ditentukan oleh .
    • 0=⍴⍵:⍬adalah ekspresi pertama kami, dan memeriksa apakah kami mendapat baris kosong (yaitu, kami selesai). Ini menggunakan penjaga (konstruksi yang umum bagi banyak programmer fungsional) untuk mengeksekusi ekspresi di sebelah kanan titik dua. Dalam kasus ini, jika 0 sama dengan bentuk / panjang ( ) dari argumen kanan, kita mengembalikan set kosong ( ).
    • memisahkan dua ekspresi di dalam fungsi. Jika ekspresi sebelumnya tidak dievaluasi (dan dengan demikian tidak mengembalikan apa pun), kami pindah ke ekspresi berikutnya.
    • Kami secara rekursif memanggil fungsi menggunakan fungsi referensi-sendiri ( ). Argumen ke fungsi adalah garis input pengguna yang tidak dievaluasi, diberikan oleh quote-quad ( ).
    • ⊂⍵,⍨¨⍳⍴⍵ membuat pasangan untuk setiap karakter dalam string, di mana elemen pertama setiap pasangan adalah posisinya di string, dan elemen kedua adalah karakter.
    • ⍳⍴⍵memberikan vektor dari 1 ke ⍴⍵, atau panjang dari string input.
    • ⍵,⍨¨menerapkan fungsi gabungan komutasi ( ,⍨) ke setiap ¨elemen ( ) di sebelah kirinya ( , dalam hal ini input pengguna) dan kanan. Komuter fungsi gabungan menyebabkan argumen kiri dan kanannya ditukar.
    • Akhirnya, kami menyertakan hasil menggunakan , sehingga kami dapat membedakan antara garis input.
  • Kami awalnya memberi makan fungsi kami dengan input pengguna ( ).
  • Akhirnya, kita mengurangi ( /) vektor yang dihasilkan dari vektor pasangan menggunakan fungsi persimpangan ( ), menghasilkan pasangan yang ditemukan di semua sub-vektor.
Dillon Cower
sumber
Tanpa alasan yang baik saya memiliki respon negatif mendalam setiap kali saya melihat APL yang tidak saya miliki untuk J atau GolfScript. Tapi bagaimanapun, +1 untuk solusi yang sangat baik.
Steven Rumbalski
Sebenarnya saya sudah berpikir untuk beralih ke J. Saya akan memasukkan itu pada daftar alasan saya. :)
Dillon Cower
12

Golfscript (28 karakter)

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

Ada masalah set karakter saat mem-pipkan Unicode, jadi tidak ada bonus seperempat poin.

Peter Taylor
sumber
1
+1. Ini seharusnya tidak memiliki upvotes yang kurang dari jawaban saya.
Steven Rumbalski
9

J, 57 51 44 40 karakter

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

Saya sampai di sana perlahan tapi pasti. Ini masih jauh dari ideal menurut saya.

Saya merasa yakin bahwa menggunakan kail akan menjadi jawabannya tetapi sayangnya tidak (44 karakter):

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

Saya mungkin memerlukan metode yang sama sekali berbeda untuk mendapatkan yang lebih pendek.

Gareth
sumber
1
+1. Tapi ya, saya berharap lebih baik dari J.
Steven Rumbalski
Ini seharusnya tidak memiliki upvotes yang kurang dari jawaban saya.
Steven Rumbalski
1
@StevenRumbalski Upvotes tidak selalu mencerminkan ukuran relatif kode. Terkadang ini menjadi kontes popularitas bahasa. Saya setuju bahwa jawaban skrip golf harus ada di sana dengan APL, sayangnya saya sudah memberikannya upvote saya dan tidak dapat membantu mendorongnya lebih jauh.
Gareth
8

Haskell, 64 karakter

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

Menangani garis dengan panjang yang tidak sama. Dukungan Unicode tergantung pada pengaturan lokal saat ini.

Contoh output:

[(0,'a'),(3,'d'),(6,'g')]
hammar
sumber
+1. Ini seharusnya tidak memiliki upvotes yang kurang dari jawaban saya.
Steven Rumbalski
7

Python 2, skor 81,5 ( 116 94 86 83 82 byte dikurangi bonus)

import sys
i=0
for x in zip(*sys.stdin)[:-1]:
 i+=1
 if len(set(x))<2:print i,x[0]
Steven Rumbalski
sumber
Memberi +1 untuk golf Python yang bagus tetapi Anda dapat kehilangan seluruh EMPAT karakter: [:-1]tidak perlu kecuali untuk menghapus baris baru di bagian akhir input (yang tampaknya tidak ada dalam pertanyaan).
ChristopheD
@ChristopheD: Sebenarnya, hasilnya zip(*sys.stdin)adalah [('a', 'a', 'a'), ('b', 'v', 'c'), ('c', 'c', 'b'), ('d', 'd', 'd'), ('e', 'd', 'e'), ('f', 'e', 'e'), ('g', 'g', 'g'), ('\n', '\n', '\n')]. Saya tidak melihat cara untuk menghindari pengupasan tupel baris baru. Harap perbaiki saya jika saya salah paham. Terima kasih atas upvotenya.
Steven Rumbalski
Jika Anda menghapus baris baru terakhir dalam file data Anda, tuple untuk baris itu tidak lengkap (meleset satu '\ n' jadi zip hanya mempertimbangkan dan mengembalikan data yang kami cari, memungkinkan penghapusan [:-1]. Egzip([1,2,3,4],[1,2,3])=> [(1, 1), (2, 2), (3, 3)]
ChristopheD
@ChristopheD: Per spec, "input terdiri dari [...] baris [...], masing-masing diikuti oleh baris baru."
Ilmari Karonen
1
Apakah orang yang menurunkan jawaban ini menjelaskan mengapa?
Steven Rumbalski
5

(Bash) Shell Scripting, 105 karakter

Jika ada yang punya trik lain untuk ini, silakan beri komentar gratis!

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

Hasil:

1 a
4 d
7 g
ChristopheD
sumber
Saya mengalami masalah dalam menjalankan ini; menjalankan ini pada input sampel mencetak serangkaian kesalahan suka /tmp/cols.sh: line 2: [1: command not founddan tidak ada yang lain.
Ilmari Karonen
@Ilmari Karonen: ini diuji pada Mac (macan tutul salju, 10.6.2) tetapi harus bekerja di tempat lain. Saya akan memperbaikinya di Linux besok (harus diperbaiki kecil)
ChristopheD
2
ormaaj tidak memiliki perwakilan tetapi ingin berkomentar: Ilmari rusak karena ruang yang hilang setelah [; dan $ {y: 3} akan membuatnya berfungsi hanya dengan 3 baris input. Memperbaiki dan mengoptimalkan hasil (100 karakter) while((++i%`tail -1 $1|wc -c`));do x=`cut -c$i $1`;((`uniq|wc -l`==1))<<<"$x"&&echo $i ${x: -1};donedan menggunakan nilai default harus memungkinkan menyimpan satu lagi dengan for((;++i<`tail -1 $1|wc -c`;))dotetapi ada bug yang belum diperbaiki dalam bash.
Peter Taylor
4

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

Berikut adalah versi golf dari solusi saya sendiri dari utas SO :

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

Berbeda dengan versi SO, yang ini menggunakan indeks berbasis 1 untuk output. Ini menggunakan fitur Perl 5.10 say, jadi perlu dijalankan dengan perl -M5.010(atau dengan perl -E).

Seperti versi SO, kode ini menangani garis panjang variabel, dan akan menangani input Unicode sewenang-wenang jika input dan output standar dalam mode UTF-8. Sayangnya, secara default tidak, kecuali seseorang menentukan saklar baris perintah tidak bebas -CS . Dengan demikian, ia mendapatkan bonus −½ char, tetapi bukan char yang.

Sunting: +1 char untuk memperbaiki bug: hanya karena string input tidak mengandung umpan baris tidak berarti mereka tidak dapat berakhir di $a(mis "+" & "J" eq "\n".).

Ilmari Karonen
sumber
1
Anda dapat menyimpan 1 char dengan menggunakan chopalih-alih chomp.
Toto
@ M42: Poin bagus, meskipun saya lebih suka kekokohan versi saat ini. Saya pikir saya akan menyimpan muntuk saat ini, tidak seperti itu membuat perbedaan pada peringkat saat ini. :)
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
Anthony Faull
sumber
2

Scala 115 107: (−¼ untuk menangani UTF-8)

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

ungolfed, dan Source.fromFile ("f")bukannya stdinuntuk testability yang lebih baik:

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

Hasil:

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

Terima kasih kepada Gareth untuk pengurangan ukuran 8 untuk menggunakan stdin.

Pengguna tidak diketahui
sumber
Tidak bisakah Anda menggunakan stdinselain fromFile("f")menyimpan 8 karakter?
Gareth
2

VBA ( 307,25 284 - 0,75 bonus = 283,25)

Saya tahu ini sudah dimenangkan, tetapi inilah kesempatan saya (tidak membaca file, hanya sebuah string - perlu io ditambahkan). Saya suka bahwa saya harus menggunakan l()secara rekursif. Saya biasanya tidak memiliki kebutuhan untuk rekursi pemrograman kehidupan nyata saya. Saya hanya melakukan begitu banyak pengujian, tetapi saya percaya ini mencakup ketentuan poin bonus unicode. Itu juga mengasumsikan vbCradalah terminator garis. Ini mungkin tidak diterjemahkan ke semua sistem karena itu.

Kode:

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

Contoh input / output:

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

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

Q, 32

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

pemakaian

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

K, 22

Solusi di atas dapat dikurangi menjadi 22 dengan menuliskannya sepenuhnya dalam K daripada meneruskan fungsi K ke juru bahasa Q, mengurangi jumlah tanda kurung yang diperlukan.

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

PHP, 123 127 :(

Saya tidak senang dengan itu (pasti ada perbaikan yang bisa didapat), tapi begini:

<?$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";}

Buktinya berhasil.

Jika ada yang bisa memikirkan cara yang lebih pintar untuk menginisialisasi $ a dan $ b, beri tahu saya. Awalnya saya punya $a=$b=$n=''dan $ b akhirnya benar, tetapi [empty] & [anything] == [empty], $ begitu tidak pernah punya konten.


Sunting: Harus memperbaiki penanganan baris baru (+6) tetapi menjatuhkan tag penutup (-2).

GigaWatt
sumber
Saya ingin tahu, mengapa Anda membuat sebagian besar wiki komunitas jawaban Anda?
Gareth
Saya tidak bermaksud untuk yang ini. Dahulu kala ketika saya pertama kali bergabung dengan CodeGolf seseorang mengatakan kepada saya bahwa itu adalah standar. Harus hentikan kebiasaan itu. Bisa menghapus wiki sekarang. codegolf.stackexchange.com/a/2249/1419 (lihat komentar)
Mr. Llama
Saya pikir itu adalah cara standar melakukan hal-hal pada SO untuk pertanyaan kode golf, tetapi tidak di sini kalau tidak, tidak ada yang akan memiliki reputasi sama sekali. :-)
Gareth
Anda mungkin dapat menandai mereka dan meminta moderator untuk membatalkan CW mereka . Cukup jelaskan bahwa itu adalah kesalahan.
Ilmari Karonen
Anda dapat menyimpan dua karakter dengan meninggalkan ?>. Namun, saya baru memperhatikan bahwa kode Anda memiliki bug: ia mencetak kecocokan tambahan jika semua baris berisi baris tambahan sesuai yang ditentukan.
Ilmari Karonen
1

JavaScript (125 134 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/

Sunting 1 : Atur ulang loop untuk menghindari kawat gigi. Inisialisasi dengan saya []untuk digabungkan s. Pindahkan wkenaikan ke ekspresi.

Sunting 2 : Setel S=Iuntuk mengambil kata yang dimasukkan terakhir dan simpan menggunakan s[1]. Menggabungkanr=1 dan ++c<S.length. Atur C=s[c]di lingkaran dalam dan bandingkan dengan Ckata-kata sebelumnya dan berikutnya untuk mempersingkat ekspresi s[w][c]==s[w++][c]menjadi adil s[w++][c]==C. Menyimpan total 9 karakter. Juga diatur w=r=...karena ketika itu benar w=1yang perlu kita inisialisasi w.

mellamokb
sumber
1

Ruby (71)

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

keluaran:

[0, "a"]
[3, "d"]
[6, "g"]
jsvnm
sumber
Catatan: tampaknya membutuhkan Ruby 1.9; untuk kompatibilitas Ruby 1.8, ganti t[i]dengan t[i,1].
Ilmari Karonen
1

Gangguan umum, 183 165 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)))

Format yang dapat dibaca:

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

Masukkan ini langsung ke REPL dan masukkan baris, mengakhiri dengan baris kosong.

Paul Richter
sumber
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]);}

Saya sudah menatap ini tetapi saya tidak bisa membuatnya lebih kecil. Pendekatan baru mungkin diperlukan.

(Tidak ada poin bonus; itu hanya menangani garis berukuran berbeda jika baris pertama adalah yang lebih pendek.)

kotak roti
sumber
0

C # dengan .NET 4 (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 baris, 280 karakter
  • Termasuk semua pernyataan dan metode Utama yang diperlukan.
  • Program tidak memerlukan baris kosong di akhir, tetapi akan menerimanya
  • Baris kosong diabaikan
  • Menangani string input dengan panjang berapa pun.
  • Cadangan output sampai akhir (sedangkan jawaban asli memberikan output tambahan)

Versi yang mudah dibaca

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

Jawaban asli

menggunakan c = System.Console; kelas P {static void Main () {char [] a; var b = c.ReadLine (); a = b.ToCharArray (); while (b! = "") {for (int i = 0; i

  • 1 baris
  • 207 karakter
  • Termasuk semua pernyataan dan metode Utama yang diperlukan.
  • Program berakhir ketika sebuah baris kosong dimasukkan.
  • Tidak menangani string input yang lebih pendek dari yang pertama.


Versi yang dapat dibaca:

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

Apprentice Dr. Wily
sumber
Ketika saya menjalankan ini pada input tes dalam tantangan, saya mengerti 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. Output yang diharapkan adalah 0: a 3: d 6: g.
Ilmari Karonen
@Ilmari Ok, tetapi menampilkan kolom / karakter yang sama setelah setiap baris input. Jika Anda memasukkan file sebagai input standar, maka output mungkin tampak aneh, tetapi jika Anda input secara manual, saya pikir itu masuk akal. Saya akan mempertimbangkan cara refactor.
Apprentice Dr. Wily
Solusi Anda macet jika ada baris yang lebih panjang dari baris pertama.
Timwi
@Timwi Ah ... terima kasih sudah menunjukkannya!
Apprentice Dr. Wily
0

python 122 karakter :

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]))
Ashwini Chaudhary
sumber
Anda tidak membutuhkan ruang antara )dan for. Jadi alih-alih …str(x[0]) for i,x…, Anda bisa melakukannya …str(x[0])for i,x…. Itu juga muncul di tuple(x) fordan.split()])) if
Cyoce
-1

Ruby (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('|') }
agmcleod
sumber
Maksud dari tantangan itu adalah untuk membaca garis dari input standar. Saya bersedia mengurangi beberapa kelonggaran untuk bahasa (seperti JavaScript dalam peramban) di mana konsep itu tidak benar-benar ada, tetapi Ruby memang memiliki STDIN( ARGFatau hanya sekadar gets).
Ilmari Karonen
ah baiklah. Tetapi mengingat STDIN menerima satu baris, apakah itu mengasumsikan sesuatu seperti: "Masukkan di baris lain, atau 'n' untuk berhenti"? Oleh karena itu buat loop untuk membangun sebuah array.
agmcleod
Saya telah menambahkan beberapa klarifikasi untuk pertanyaan itu. Pada dasarnya, Anda harus terus membaca baris input sampai akhir file Anda.
Ilmari Karonen
Anda memiliki banyak ruang kosong yang tidak perlu.
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++;
}
Arjang
sumber
1
Hai, Arjang, dan selamat datang di codegolf.SE! Beberapa komentar atas jawaban Anda: Pertama, karena ini adalah tantangan kode-golf , Anda diharapkan mencoba membuat solusi Anda sesingkat mungkin; hanya untuk memulainya, Anda memiliki beberapa nama variabel panjang yang dapat dengan mudah disingkat menjadi karakter tunggal, dan beberapa spasi kosong yang dapat Anda hapus. (Tidak apa-apa untuk memposting versi yang dapat dibaca dari kode Anda bersama dengan yang "golf", tetapi Anda harus benar-benar memposting solusi golf juga.) Kedua, jika Anda membaca pertanyaan dengan seksama, saya menetapkan bahwa Anda harus membaca string dari input standar , bukan hardcode mereka.
Ilmari Karonen