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.)
Jawaban:
APL, 25 karakter
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:
Penjelasan, agak dari kanan ke kiri:
⍵
.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.∇
). 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.⊂
, sehingga kami dapat membedakan antara garis input.⍞
)./
) vektor yang dihasilkan dari vektor pasangan menggunakan fungsi persimpangan (∩
), menghasilkan pasangan yang ditemukan di semua sub-vektor.sumber
Golfscript (28 karakter)
Ada masalah set karakter saat mem-pipkan Unicode, jadi tidak ada bonus seperempat poin.
sumber
J,
57514440 karakterSaya 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):
Saya mungkin memerlukan metode yang sama sekali berbeda untuk mendapatkan yang lebih pendek.
sumber
Haskell, 64 karakter
Menangani garis dengan panjang yang tidak sama. Dukungan Unicode tergantung pada pengaturan lokal saat ini.
Contoh output:
sumber
Python 2, skor 81,5 (
11694868382 byte dikurangi bonus)sumber
[:-1]
tidak perlu kecuali untuk menghapus baris baru di bagian akhir input (yang tampaknya tidak ada dalam pertanyaan).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.[:-1]
. Egzip([1,2,3,4],[1,2,3])=> [(1, 1), (2, 2), (3, 3)]
(Bash) Shell Scripting, 105 karakter
Jika ada yang punya trik lain untuk ini, silakan beri komentar gratis!
Hasil:
sumber
/tmp/cols.sh: line 2: [1: command not found
dan tidak ada yang lain.[
; 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};done
dan menggunakan nilai default harus memungkinkan menyimpan satu lagi denganfor((;++i<`tail -1 $1|wc -c`;))do
tetapi ada bug yang belum diperbaiki dalam bash.Perl, 87 karakter (−½ char tie-break bonus)
Berikut adalah versi golf dari solusi saya sendiri dari utas SO :
Berbeda dengan versi SO, yang ini menggunakan indeks berbasis 1 untuk output. Ini menggunakan fitur Perl 5.10
say
, jadi perlu dijalankan denganperl -M5.010
(atau denganperl -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"
.).sumber
chop
alih-alihchomp
.m
untuk saat ini, tidak seperti itu membuat perbedaan pada peringkat saat ini. :)T-SQL
sumber
Scala
115107: (−¼ untuk menangani UTF-8)ungolfed, dan
Source.fromFile ("f")
bukannyastdin
untuk testability yang lebih baik:Hasil:
Terima kasih kepada Gareth untuk pengurangan ukuran 8 untuk menggunakan
stdin
.sumber
stdin
selainfromFile("f")
menyimpan 8 karakter?VBA (
307,25284 - 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 mengasumsikanvbCr
adalah terminator garis. Ini mungkin tidak diterjemahkan ke semua sistem karena itu.Kode:
Contoh input / output:
sumber
Q, 32
pemakaian
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.
sumber
PHP,
123127 :(Saya tidak senang dengan itu (pasti ada perbaikan yang bisa didapat), tapi begini:
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).
sumber
?>
. Namun, saya baru memperhatikan bahwa kode Anda memiliki bug: ia mencetak kecocokan tambahan jika semua baris berisi baris tambahan sesuai yang ditentukan.JavaScript (125
134140)Demo: http://jsfiddle.net/Fv7kY/4/
Sunting 1 : Atur ulang loop untuk menghindari kawat gigi. Inisialisasi dengan saya
[]
untuk digabungkans
. Pindahkanw
kenaikan ke ekspresi.Sunting 2 : Setel
S=I
untuk mengambil kata yang dimasukkan terakhir dan simpan menggunakans[1]
. Menggabungkanr=1
dan++c<S.length
. AturC=s[c]
di lingkaran dalam dan bandingkan denganC
kata-kata sebelumnya dan berikutnya untuk mempersingkat ekspresis[w][c]==s[w++][c]
menjadi adils[w++][c]==C
. Menyimpan total 9 karakter. Juga diaturw=r=...
karena ketika itu benarw=1
yang perlu kita inisialisasiw
.sumber
Ruby (71)
keluaran:
sumber
t[i]
dengant[i,1]
.Gangguan umum,
183165 karakterFormat yang dapat dibaca:
Masukkan ini langsung ke REPL dan masukkan baris, mengakhiri dengan baris kosong.
sumber
C, 126 karakter
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.)
sumber
C # dengan .NET 4 (280)
Versi yang mudah dibaca
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; iVersi yang dapat dibaca:
sumber
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 adalah0: a 3: d 6: g
.python 122 karakter :
sumber
)
danfor
. Jadi alih-alih…str(x[0]) for i,x…
, Anda bisa melakukannya…str(x[0])for i,x…
. Itu juga muncul dituple(x) for
dan.split()])) if
Ruby (242)
sumber
STDIN
(ARGF
atau hanya sekadargets
).C #
sumber