Tìm các cột trong đó tất cả các ký tự giống nhau


18

Tôi đã xem qua câu hỏi này trên SO và nghĩ rằng nó sẽ tạo ra một thử thách golf tuyệt vời. Vì vậy, đây là:

Thử thách:

Viết chương trình đọc một chuỗi các chuỗi ký tự, mỗi chuỗi trên một dòng và xuất ra một danh sách tất cả các vị trí trong đó mỗi chuỗi có cùng một ký tự.

Đầu vào và đầu ra:

Đầu vào bao gồm một hoặc nhiều dòng ký tự ASCII không khoảng trắng có thể in được, mỗi dòng được theo sau bởi một dòng mới. Bạn có thể cho rằng tất cả các dòng đầu vào có cùng độ dài. Dòng mới không được coi là một phần của đầu vào (nghĩa là bạn không nên xuất nó dưới dạng ký tự trùng khớp).

Ví dụ đầu vào (bị đánh cắp một cách đáng xấu hổ từ câu hỏi SO):

abcdefg
avcddeg
acbdeeg

Sau khi đọc đầu vào, chương trình của bạn sẽ in vị trí của từng cột khớp và các ký tự mà chúng chứa. (Chương trình của bạn có thể, nhưng không cần, dừng đọc thêm đầu vào nếu nó có thể xác định sớm rằng không có cột phù hợp.) Bất kỳ định dạng đầu ra hợp lý nào đều được cho phép; cụ thể, bạn có thể sử dụng lập chỉ mục dựa trên 0 hoặc dựa trên 1 cho các vị trí.

Ví dụ đầu ra cho đầu vào trên (sử dụng lập chỉ mục dựa trên 0):

0: a
3: d
6: g

Ghi điểm:

Đây là mã golf, vì vậy câu trả lời ngắn nhất sẽ thắng. Trong trường hợp hòa, các ký tự ngắt kết nối phân đoạn có thể được trao cho các tính năng bổ sung:

  • Ký tự để xử lý chính xác các dòng đầu vào có độ dài không bằng nhau. (Đầu ra không được chứa các vị trí ở cuối dòng đầu vào ngắn nhất.)
  • Ký tự để xử lý chính xác đầu vào bao gồm các ký tự Unicode được mã hóa UTF-8 tùy ý.

Để có cảm hứng, bạn có thể tìm thấy một số giải pháp vô căn cứ tại câu hỏi SO (xem ở trên).

Làm rõ:

  • Đơn giản chỉ cần ghép các vị trí và ký tự, như trong 0a3d6g, không được tính là "đầu ra hợp lý". Bạn nên cung cấp một số loại dấu phân cách (chẳng hạn như khoảng trắng) giữa mỗi phần tử của đầu ra để có thể phân tích cú pháp rõ ràng.

  • Đầu vào sẽ được cung cấp trên luồng đầu vào tiêu chuẩn ( stdin) hoặc sử dụng bất kỳ cơ chế nhập tệp văn bản nào là tự nhiên nhất đối với ngôn ngữ bạn chọn. (Nếu ngôn ngữ bạn chọn không cơ chế tự nhiên để nhập tệp, hãy làm bất cứ điều gì có vẻ gần nhất về mặt tinh thần.)

  • Đầu vào kết thúc khi không còn dữ liệu nào để đọc (tức là khi xảy ra tình trạng cuối tập tin). Nếu bạn muốn, bạn có thể yêu cầu đầu vào bị chấm dứt bởi một dòng trống (rõ ràng sau đó bạn không nên tính là một phần của đầu vào). Nếu bạn làm như vậy, xin vui lòng đề cập đến nó trong câu trả lời của bạn để người khác có thể cung cấp đầu vào chính xác để thử nghiệm.

  • Mỗi dòng đầu vào, bao gồm cả dòng cuối cùng, kết thúc bằng một ký tự dòng mới. Câu trả lời của bạn không được báo cáo dòng mới này dưới dạng cột phù hợp. (Sẽ ổn nếu giải pháp của bạn cũng có thể xử lý đầu vào trong đó dòng cuối cùng không kết thúc ở dòng mới, nhưng điều đó là không bắt buộc.)


Vì vậy, một dòng trống chấm dứt đầu vào?
Steven Rumbalski

"Bạn nên cung cấp một số loại dấu tách giữa mỗi phần tử của đầu ra để có thể phân tích cú pháp rõ ràng." Có một không gian được tính là một ngăn cách?
Steven Rumbalski

@StevenRumbalski: Đầu vào kết thúc khi không còn dữ liệu để đọc; Tôi đoán tôi có thể cho phép một dòng trống ở cuối nếu ngôn ngữ của bạn gặp sự cố khi phát hiện EOF. Và vâng, một không gian là một phân cách hoàn toàn tốt.
Ilmari Karonen

Chúng ta có thể có một số mã mẫu ký tự Unicode được mã hóa UTF-8 tùy ý không?
người dùng không xác định

Câu trả lời:


12

APL, 25 ký tự

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

Tôi đã sử dụng Dyalog APL (phiên bản 13) làm thông dịch viên. Nó xử lý cả hai đầu vào có độ dài không bằng nhau và các ký tự Unicode (UTF-8).

Ví dụ:

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

  1 a  4 d  7 g  

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

  4 t  5 日  6 本 

Giải thích, phần nào từ phải sang trái:

  • Đoạn chính của câu trả lời này là hàm trực tiếp (về cơ bản, hàm ẩn danh), được xác định trong dấu ngoặc nhọn. Đối số đúng của nó được chỉ định bởi .
    • 0=⍴⍵:⍬là biểu thức đầu tiên của chúng tôi và nó kiểm tra xem chúng tôi đã nhận được một dòng trống chưa (nghĩa là chúng tôi đã hoàn thành). Nó sử dụng một bộ bảo vệ (một cấu trúc quen thuộc với nhiều lập trình viên chức năng) để thực hiện một cách có điều kiện biểu thức ở bên phải của dấu hai chấm. Trong trường hợp này, nếu 0 bằng với hình dạng / chiều dài ( ) của đối số đúng, chúng ta trả về tập hợp trống ( ).
    • tách hai biểu thức trong hàm. Nếu biểu thức trước không được đánh giá (và do đó không trả về bất cứ điều gì), chúng tôi sẽ chuyển sang biểu thức tiếp theo.
    • Chúng tôi gọi đệ quy hàm bằng hàm tự tham chiếu ( ). Đối số của hàm là một dòng đầu vào của người dùng không được đánh giá, được đưa ra bởi quote-quad ( ).
    • ⊂⍵,⍨¨⍳⍴⍵ tạo các cặp cho mỗi ký tự trong chuỗi, trong đó phần tử đầu tiên của mỗi cặp là vị trí của nó trong chuỗi và phần tử thứ hai của nó là ký tự.
    • ⍳⍴⍵đưa ra một vectơ từ 1 đến ⍴⍵hoặc độ dài của chuỗi đầu vào.
    • ⍵,⍨¨áp dụng hàm ghép nối ( ,⍨) cho mỗi ¨phần tử ( ) bên trái ( trong trường hợp này là đầu vào của người dùng) và bên phải. Việc chuyển đổi hàm ghép nối làm cho các đối số bên trái và bên phải của nó bị tráo đổi.
    • Cuối cùng, chúng tôi gửi kèm kết quả bằng cách sử dụng , để chúng tôi có thể phân biệt giữa các dòng đầu vào.
  • Chúng tôi ban đầu cung cấp chức năng của chúng tôi với đầu vào của người dùng ( ).
  • Cuối cùng, chúng ta giảm ( /) vectơ kết quả của các vectơ của cặp bằng cách sử dụng hàm giao nhau ( ), mang lại các cặp được tìm thấy trong tất cả các vectơ phụ.

Không có lý do chính đáng nào tôi có phản hồi tiêu cực nội tạng bất cứ khi nào tôi thấy APL mà tôi không có cho J hoặc GolfScript. Nhưng +1 dù sao cho một giải pháp tuyệt vời.
Steven Rumbalski

Tôi thực sự đã suy nghĩ về việc chuyển sang J ... Tôi sẽ giải thích điều đó trong danh sách lý do của mình. :)
Dillon Cower

12

Golfscript (28 ký tự)

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

Có các vấn đề về bộ ký tự khi chuyển qua Unicode, do đó không có phần thưởng điểm quý.


1
+1. Điều này không nên có ít upvote hơn câu trả lời của tôi.
Steven Rumbalski

9

J, 57 51 44 40 ký tự

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

Tôi đang đến đó từ từ nhưng chắc chắn. Điều này vẫn còn xa lý tưởng mặc dù tôi nghĩ.

Tôi cảm thấy chắc chắn rằng sử dụng một cái móc sẽ là câu trả lời nhưng thật không may (44 ký tự):

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

Tôi có thể cần một phương pháp hoàn toàn khác để rút ngắn hơn.


1
+1. Nhưng vâng, tôi mong đợi tốt hơn từ J.
Steven Rumbalski

Điều này không nên có ít upvote hơn câu trả lời của tôi.
Steven Rumbalski

1
@StevenRumbalski Các upvote không luôn phản ánh kích thước tương đối của mã. Nó đôi khi trở thành một cuộc thi phổ biến ngôn ngữ. Tôi đồng ý rằng câu trả lời của golf phải được đưa lên đó với APL, thật không may, tôi đã đưa nó lên upvote của mình và không thể giúp đẩy nó lên cao hơn nữa.
Gareth

8

Haskell, 64 ký tự

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

Xử lý các dòng có chiều dài không bằng nhau. Hỗ trợ Unicode phụ thuộc vào cài đặt ngôn ngữ hiện tại.

Ví dụ đầu ra:

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

+1. Điều này không nên có ít upvote hơn câu trả lời của tôi.
Steven Rumbalski

7

Python 2, điểm 81,5 ( 116 94 86 83 82 byte trừ tiền thưởng)

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

+1 cho một sân gôn Python đẹp nhưng Bạn có thể mất toàn bộ BỐN ký tự: [:-1]không cần thiết trừ khi loại bỏ một dòng mới không liên quan ở cuối đầu vào (điều này thậm chí không có trong câu hỏi).
BarsheD

@ChristopheD: Thật ra, kết quả zip(*sys.stdin)[('a', 'a', 'a'), ('b', 'v', 'c'), ('c', 'c', 'b'), ('d', 'd', 'd'), ('e', 'd', 'e'), ('f', 'e', 'e'), ('g', 'g', 'g'), ('\n', '\n', '\n')]. Tôi không thấy một cách nào để tránh tước đi dòng mới này. Xin hãy sửa tôi nếu tôi hiểu lầm. Cảm ơn bạn đã upvote.
Steven Rumbalski

Nếu bạn tháo xuống dòng cuối cùng trong tập tin dữ liệu của bạn tuple cho dòng đó là không đầy đủ (bỏ lỡ một '\ n' để nén chỉ xem xét và trả về dữ liệu chúng tôi đang tìm kiếm, cho phép loại bỏ các [:-1]Ví dụ.zip([1,2,3,4],[1,2,3])=> [(1, 1), (2, 2), (3, 3)]
ChristopheD

@ChristopheD: Mỗi thông số kỹ thuật, "đầu vào bao gồm [...] dòng [...], mỗi dòng được theo sau bởi một dòng mới."
Ilmari Karonen

1
Người đánh giá thấp câu trả lời này sẽ giải thích tại sao?
Steven Rumbalski

5

(Bash) Shell Scripting, 105 ký tự

Nếu bất cứ ai có thêm một số thủ thuật cho việc này, xin vui lòng điền miễn phí để bình luận!

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

Kết quả:

1 a
4 ngày
7 g

Tôi gặp khó khăn khi làm việc này; chạy này trên đầu vào mẫu in một loạt các lỗi như /tmp/cols.sh: line 2: [1: command not foundvà không có gì khác.
Ilmari Karonen

@Ilmari Karonen: điều này đã được thử nghiệm trên máy Mac (báo tuyết, 10.6.2) nhưng nên hoạt động ở nơi khác. Tôi sẽ sửa nó trên Linux vào ngày mai (nên là một sửa chữa nhỏ)
BarsheD

2
ormaaj thiếu người đại diện nhưng muốn bình luận: nó phá vỡ vì Ilmari vì một khoảng trống bị mất sau [; và $ {y: 3} sẽ khiến nó chỉ hoạt động với chính xác 3 dòng đầu vào. Sửa chữa và tối ưu hóa sản lượng (100 ký tự) while((++i%`tail -1 $1|wc -c`));do x=`cut -c$i $1`;((`uniq|wc -l`==1))<<<"$x"&&echo $i ${x: -1};donevà sử dụng các giá trị mặc định sẽ cho phép lưu thêm một lần nữa for((;++i<`tail -1 $1|wc -c`;))donhưng có một lỗi không thể trộn trong bash.
Peter Taylor

4

Perl, 87 ký tự (phần thưởng tie char tie-break)

Đây là phiên bản đánh gôn của giải pháp của riêng tôi từ luồng SO :

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

Không giống như phiên bản SO, phiên bản này sử dụng các chỉ mục dựa trên 1 cho đầu ra. Nó sử dụng saytính năng Perl 5.10 , vì vậy cần phải được chạy với perl -M5.010(hoặc với perl -E).

Giống như phiên bản SO, mã này xử lý các dòng có độ dài thay đổi và sẽ xử lý đầu vào Unicode tùy ý nếu đầu vào và đầu ra tiêu chuẩn ở chế độ UTF-8. Than ôi, theo mặc định họ không, trừ khi người ta chỉ định chuyển đổi dòng lệnh không miễn phí -CS . Do đó, nó kiếm được tiền thưởng −½ char, nhưng không kiếm được.

Chỉnh sửa: +1 char để sửa lỗi: chỉ vì các chuỗi đầu vào không chứa nguồn cấp dữ liệu không có nghĩa là chúng không thể kết thúc $a(ví dụ "+" & "J" eq "\n").


1
Bạn có thể lưu 1 char bằng cách sử dụng chopthay vì chomp.
Toto

@ M42: Điểm tốt, mặc dù tôi thích sự mạnh mẽ của phiên bản hiện tại. Tôi nghĩ rằng tôi sẽ giữ mcho đến bây giờ, nó không giống như nó làm cho bất kỳ sự khác biệt nào cho bảng xếp hạng vào lúc này. :)
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: (để xử lý UTF-8)

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

vô dụng, và Source.fromFile ("f")thay vì stdinđể kiểm tra tốt hơn:

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

Kết quả:

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

Cảm ơn Gareth vì đã giảm kích thước 8 khi sử dụng stdin.


Bạn không thể sử dụng stdinthay vì fromFile("f")để lưu 8 ký tự?
Gareth

2

VBA ( 307,25 284 - 0,75 tiền thưởng = 283,25)

Tôi biết điều này đã giành được, nhưng đây là cú đánh của tôi (không đọc tệp, chỉ là một chuỗi - cần phải có io được thêm vào). Tôi thích rằng tôi đã sử dụng l()đệ quy. Tôi thường không có nhu cầu đệ quy lập trình thực tế của mình. Tôi chỉ làm rất nhiều thử nghiệm, nhưng tôi tin rằng điều này bao gồm quy định điểm thưởng unicode. Nó cũng giả sử vbCrlà dòng kết thúc. Điều này có thể không dịch cho tất cả các hệ thống vì điều đó.

Mã số:

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

Ví dụ đầu vào / đầu ra:

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}

sử dụng

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

K, 22

Giải pháp trên có thể giảm xuống còn 22 bằng cách viết hoàn toàn bằng K thay vì chuyển các hàm K sang trình thông dịch Q, giảm số lượng dấu ngoặc đơn cần thiết.

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

1

PHP, 123 127 :(

Tôi không hài lòng với nó (chắc chắn sẽ có những cải tiến cần có), nhưng ở đây là:

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

Bằng chứng nó hoạt động.

Nếu bất cứ ai có thể nghĩ ra một cách thông minh hơn để khởi tạo $ a và $ b, xin vui lòng cho tôi biết. Ban đầu tôi có $a=$b=$n=''và $ b cuối cùng là đúng, nhưng [empty] & [anything] == [empty], vì vậy $ a không bao giờ có nội dung.


Chỉnh sửa: Phải sửa xử lý dòng mới (+6) nhưng bỏ thẻ đóng (-2).


Tôi tò mò, tại sao bạn thực hiện hầu hết các câu trả lời của bạn trên cộng đồng wiki?
Gareth

Tôi không có ý này. Cách đây rất lâu khi tôi mới tham gia CodeGolf, có người nói với tôi rằng đó là tiêu chuẩn. Phải bỏ thói quen. Có thể bỏ wiki nó bây giờ mặc dù. codegolf.stackexchange.com/a/2249/1419 (xem bình luận)
Ông Llama

Tôi nghĩ rằng đó là cách tiêu chuẩn để thực hiện mọi thứ trên SO cho các câu hỏi về mã golf, nhưng không phải ở đây nếu không thì không ai có thể có tiếng tăm gì cả. :-)
Gareth

Bạn có thể có thể gắn cờ chúng và yêu cầu người điều hành hủy bỏ CW . Chỉ cần giải thích rằng đó là một sai lầm.
Ilmari Karonen

Bạn có thể lưu hai ký tự bằng cách bỏ đi ?>. Tuy nhiên, tôi chỉ nhận thấy rằng mã của bạn có một lỗi: nó in ra một kết quả khớp thêm nếu tất cả các dòng chứa một dòng mới theo sau như được chỉ định.
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)

Bản trình diễn: http://jsfiddle.net/Fv7kY/4/

Chỉnh sửa 1 : Sắp xếp lại các vòng để tránh niềng răng. Khởi tạo i với []để kết hợp với s. Di chuyển wgia tăng vào biểu thức.

Chỉnh sửa 2 : Đặt S=Iđể chụp từ đã nhập cuối cùng và lưu bằng cách sử dụng s[1]. Kết hợp r=1++c<S.length. Đặt C=s[c]trong vòng lặp bên trong và so sánh với Cthay vì các từ trước và các từ tiếp theo để rút ngắn biểu thức s[w][c]==s[w++][c]thành chỉ s[w++][c]==C. Lưu tổng cộng 9 ký tự. Cũng được đặt w=r=...vì khi đó là sự thật w=1, đó là những gì chúng ta cần khởi tạo w.


1

Hồng ngọc (71)

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

đầu ra:

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

Lưu ý: dường như yêu cầu Ruby 1.9; để tương thích với Ruby 1.8, hãy thay thế t[i]bằng t[i,1].
Ilmari Karonen

1

Lisp thông thường, 183 165 ký tự

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

Định dạng có thể đọc được:

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

Nhập cái này trực tiếp vào REPL và nhập các dòng, kết thúc bằng một dòng trống.


1

C, 126 ký tự

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

Tôi đã nhìn chằm chằm vào điều này nhưng tôi không thể làm cho nó nhỏ hơn. Một cách tiếp cận mới có thể cần thiết.

(Không có điểm thưởng; nó chỉ xử lý các dòng có kích thước khác nhau nếu dòng đầu tiên là dòng ngắn hơn.)


0

C # với .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 dòng, 280 ký tự
  • Bao gồm tất cả các câu lệnh cần thiết và phương thức Main.
  • Chương trình không yêu cầu một dòng trống ở cuối, nhưng sẽ chấp nhận nó
  • Các dòng trống được bỏ qua
  • Xử lý các chuỗi đầu vào có độ dài bất kỳ.
  • Dự trữ đầu ra cho đến khi kết thúc (trong khi câu trả lời ban đầu cung cấp đầu ra tăng dần)

Phiên bản dễ đọc

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

Câu trả lời gốc

sử dụng c = System.Console; class P {static void Main () {char [] a; var b = c.ReadLine (); a = b.ToCharArray (); while (b! = "") {for (int i = 0; tôi

  • 1 dòng
  • 207 ký tự
  • Bao gồm tất cả các câu lệnh cần thiết và phương thức Main.
  • Chương trình kết thúc khi một dòng trống được nhập vào.
  • Không xử lý các chuỗi đầu vào ngắn hơn chuỗi đầu tiên.


Phiên bản dễ đọc:

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


Khi tôi chạy cái này trên đầu vào thử nghiệm trong thử thách, tôi nhận được 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. Sản lượng dự kiến ​​sẽ là 0: a 3: d 6: g.
Ilmari Karonen

@Ilmari Ok, nhưng nó xuất ra các cột / ký tự giống nhau sau mỗi dòng đầu vào. Nếu bạn đang cho ăn một tệp làm đầu vào tiêu chuẩn, thì đầu ra có vẻ lạ, nhưng nếu bạn nhập thủ công, tôi nghĩ nó có ý nghĩa. Tôi sẽ xem xét làm thế nào để tái cấu trúc, mặc dù.
Học viên của Tiến sĩ Wily

Giải pháp của bạn gặp sự cố nếu bất kỳ dòng nào dài hơn dòng đầu tiên.
Timwi

@Timwi Ah ... cảm ơn vì đã chỉ ra điều đó!
Học viên của Tiến sĩ Wily

0

trăn 122 ký tự :

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

bạn không cần một khoảng trống giữa )for. Vì vậy, thay vì …str(x[0]) for i,x…, bạn có thể làm …str(x[0])for i,x…. Nó cũng xuất hiện vào lúc tuple(x) for.split()])) if
Cyoce

-1

Hồng ngọc (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('|') }

Mục đích của thử thách là đọc các dòng từ đầu vào tiêu chuẩn. Tôi sẵn sàng cắt giảm một số sự chậm chạp cho các ngôn ngữ (như JavaScript trên trình duyệt) khi khái niệm đó không thực sự tồn tại, nhưng Ruby có STDIN( ARGFhoặc chỉ đơn giản gets).
Ilmari Karonen

à được rồi. Nhưng xem xét STDIN chấp nhận một dòng, liệu nó có giả sử như: "Nhập vào một dòng khác hoặc 'n' để dừng lại"? Do đó tạo một vòng lặp để xây dựng một mảng.
agmcleod

Tôi đã thêm một số làm rõ cho câu hỏi. Về cơ bản, bạn nên tiếp tục đọc các dòng đầu vào cho đến khi đạt đến cuối tập tin.
Ilmari Karonen

bạn có một tấn khoảng trắng không cần thiết.
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
Xin chào, Arjang và chào mừng bạn đến với codegolf.SE! Một vài nhận xét về câu trả lời của bạn: Đầu tiên, vì đây là một thử thách chơi gôn , bạn sẽ cố gắng đưa ra giải pháp của mình càng ngắn càng tốt; chỉ để bắt đầu, bạn có một số tên biến dài mà bạn có thể dễ dàng rút ngắn thành các ký tự đơn và một số khoảng trắng thừa bạn có thể xóa. (Sẽ tốt hơn nếu bạn đăng một phiên bản mã có thể đọc được cùng với mã "được đánh gôn", nhưng bạn thực sự cũng nên đăng một giải pháp đánh gôn.) Thứ hai, nếu bạn đọc kỹ câu hỏi, tôi đã chỉ định rằng bạn nên đọc các chuỗi từ đầu vào tiêu chuẩn , không mã hóa chúng.
Ilmari Karonen
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.