ค้นหาคอลัมน์ที่มีอักขระทั้งหมดเหมือนกัน


18

ฉันเจอคำถามนี้เกี่ยวกับ SOและคิดว่ามันจะเป็นการท้าทายกอล์ฟที่ดี ดังนั้นนี่คือ:

ท้าทาย:

เขียนโปรแกรมที่อ่านลำดับของสตริงอักขระหนึ่งรายการต่อบรรทัดและส่งรายการของตำแหน่งทั้งหมดที่แต่ละสตริงมีอักขระเหมือนกัน

อินพุตและเอาต์พุต:

อินพุตประกอบด้วยอักขระ ASCII ที่ไม่ใช่แบบ whitespace ที่พิมพ์ได้หนึ่งบรรทัดหรือมากกว่าแต่ละบรรทัดตามด้วยบรรทัดใหม่ คุณอาจสมมติว่าบรรทัดอินพุตทั้งหมดมีความยาวเท่ากัน การขึ้นบรรทัดใหม่นั้นไม่ถือเป็นส่วนหนึ่งของอินพุต (เช่นคุณไม่ควรส่งออกเป็นอักขระที่ตรงกัน)

ตัวอย่างการป้อนข้อมูล (ถูกขโมยลงคอจากคำถาม SO):

abcdefg
avcddeg
acbdeeg

หลังจากอ่านอินพุตแล้วโปรแกรมของคุณควรพิมพ์ตำแหน่งของแต่ละคอลัมน์ที่ตรงกันและอักขระที่อยู่ในนั้น (โปรแกรมของคุณอาจ แต่ไม่จำเป็นต้องหยุดอ่านอินพุตเพิ่มเติมหากสามารถกำหนดได้ตั้งแต่ต้นว่าไม่มีคอลัมน์ที่ตรงกัน) อนุญาตรูปแบบเอาต์พุตที่เหมาะสมใด ๆ โดยเฉพาะอย่างยิ่งคุณสามารถใช้การจัดทำดัชนีตาม 0 หรือ 1 สำหรับตำแหน่ง

ตัวอย่างเอาต์พุตสำหรับอินพุตด้านบน (โดยใช้การทำดัชนีแบบอิง 0):

0: a
3: d
6: g

เกณฑ์การให้คะแนน:

นี่คือรหัสกอล์ฟดังนั้นคำตอบที่สั้นที่สุดจึงชนะ ในกรณีที่มีการเสมอกันอาจจะได้รับรางวัล chars tie-breaker chars สำหรับคุณสมบัติเพิ่มเติม:

  • −½ ตัวอักษรสำหรับการจัดการสายอินพุตที่มีความยาวไม่เท่ากันอย่างถูกต้อง (เอาต์พุตไม่ควรมีตำแหน่งที่ผ่านจุดสิ้นสุดของบรรทัดอินพุตที่สั้นที่สุด)
  • −¼ ตัวอักษรสำหรับการจัดการอินพุตอย่างถูกต้องประกอบด้วยอักขระ Unicode เข้ารหัส UTF-8 ตามอำเภอใจ

สำหรับแรงบันดาลใจคุณอาจพบคำตอบที่ไม่ดีนักที่คำถาม SO (ดูด้านบน)

ชี้แจง:

  • เพียงแค่เชื่อมตำแหน่งและตัวอักษรเข้าด้วยกันเช่นเดียวกับใน0a3d6gจะไม่นับเป็น "เอาท์พุทที่สมเหตุสมผล" คุณควรจัดให้มีตัวคั่นบางตัว (เช่นช่องว่าง) ระหว่างแต่ละองค์ประกอบของเอาต์พุตเพื่อให้สามารถแยกวิเคราะห์ได้อย่างชัดเจน

  • อินพุตจะถูกจัดเตรียมไว้ในอินพุตสตรีมมาตรฐาน ( stdin) หรือใช้กลไกป้อนข้อความแบบใดก็ตามที่เป็นธรรมชาติที่สุดสำหรับภาษาที่คุณเลือก (ถ้าภาษาที่คุณเลือกไม่ได้มีกลไกธรรมชาติสำหรับการป้อนข้อมูลไฟล์ทำสิ่งที่ดูเหมือนว่าใกล้เคียงที่สุดในจิตวิญญาณ.)

  • อินพุตสิ้นสุดลงเมื่อไม่มีข้อมูลที่จะอ่านอีกต่อไป (เช่นเมื่อเงื่อนไขสิ้นสุดไฟล์เกิดขึ้น) หากคุณต้องการคุณอาจต้องการให้อินพุตถูกยกเลิกโดยบรรทัดว่าง (ซึ่งคุณไม่ควรนับรวมเป็นส่วนหนึ่งของอินพุต) ถ้าคุณทำเช่นนั้นโปรดพูดถึงมันในคำตอบของคุณเพื่อให้ผู้อื่นสามารถให้ข้อมูลที่ถูกต้องสำหรับการทดสอบ

  • บรรทัดอินพุตทุกบรรทัดรวมถึงบรรทัดสุดท้ายจะลงท้ายด้วยอักขระบรรทัดใหม่ คำตอบของคุณต้องไม่รายงาน newline นี้เป็นคอลัมน์ที่ตรงกัน (ไม่เป็นไรถ้าโซลูชันของคุณสามารถจัดการอินพุตได้โดยที่บรรทัดสุดท้ายไม่ได้ขึ้นบรรทัดใหม่ แต่ไม่จำเป็น)


ดังนั้นบรรทัดว่างจะยุติการป้อนข้อมูลหรือไม่
Steven Rumbalski

คุณควรให้ตัวคั่นบางอย่างระหว่างองค์ประกอบแต่ละส่วนของเอาต์พุตเพื่อให้สามารถแยกวิเคราะห์ได้อย่างไม่คลุมเครือ " พื้นที่นับเป็นตัวคั่นหรือไม่?
Steven Rumbalski

@StevenRumbalski: อินพุตสิ้นสุดลงเมื่อไม่มีข้อมูลเพิ่มเติมให้อ่าน ฉันเดาว่าฉันสามารถอนุญาตบรรทัดว่างเปล่าต่อท้ายหากภาษาของคุณมีปัญหาในการตรวจจับ EOF และใช่ช่องว่างเป็นตัวคั่นที่ดีอย่างสมบูรณ์
Ilmari Karonen

เราสามารถมีโค้ดตัวอย่างอักขระ Unicode ที่เข้ารหัส UTF-8 ได้หรือไม่
ผู้ใช้ที่ไม่รู้จัก

คำตอบ:


12

APL, 25 อักขระ

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

ฉันใช้ Dyalog APL (เวอร์ชั่น 13) เป็นล่ามของฉัน มันจัดการทั้งอินพุตของความยาวไม่เท่ากันและอักขระ Unicode (UTF-8)

ตัวอย่าง:

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

  1 a  4 d  7 g  

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

  4 t  5 日  6 本 

คำอธิบายค่อนข้างจากขวาไปซ้าย:

  • ก้อนหลักของคำตอบนี้คือฟังก์ชั่นโดยตรง (โดยทั่วไปฟังก์ชั่นที่ไม่ระบุชื่อ) ที่กำหนดไว้ในวงเล็บปีกกา การโต้แย้งสิทธิของถูกระบุโดย
    • 0=⍴⍵:⍬คือการแสดงออกครั้งแรกของเราและตรวจสอบว่าเราได้รับบรรทัดว่างเปล่า (เช่นเราเสร็จแล้ว) มันใช้ยาม (โครงสร้างที่คุ้นเคยกับโปรแกรมเมอร์ที่ใช้งานได้หลายคน) เพื่อดำเนินการแสดงออกทางด้านขวาของลำไส้ใหญ่ ในกรณีนี้ถ้า 0 เท่ากับรูปร่าง / ความยาว ( ) ของการโต้แย้งที่ถูกต้องเราจะส่งกลับชุดที่ว่างเปล่า ( )
    • แยกนิพจน์ทั้งสองภายในฟังก์ชัน หากการแสดงออกก่อนหน้านี้ไม่ได้รับการประเมิน (และดังนั้นจึงไม่ได้กลับอะไร) เราย้ายไปที่การแสดงออกต่อไป
    • เราเรียกฟังก์ชันนี้ซ้ำโดยใช้ฟังก์ชั่นอ้างอิงตนเอง ( ) อาร์กิวเมนต์ของฟังก์ชันคือบรรทัดของอินพุตผู้ใช้ที่ไม่ได้รับการประเมินซึ่งกำหนดโดย quote-quad ( )
    • ⊂⍵,⍨¨⍳⍴⍵ สร้างคู่สำหรับอักขระแต่ละตัวในสตริงที่องค์ประกอบแรกของแต่ละคู่อยู่ในตำแหน่งในสตริงและองค์ประกอบที่สองคืออักขระ
    • ⍳⍴⍵ให้เวกเตอร์ตั้งแต่ 1 ถึง⍴⍵หรือความยาวของสตริงอินพุต
    • ⍵,⍨¨ใช้ฟังก์ชั่นการต่อข้อมูลคอมมิชชัน ( ,⍨) กับแต่ละ¨องค์ประกอบ( ) องค์ประกอบทางด้านซ้าย ( ในกรณีนี้อินพุตของผู้ใช้) และขวา การแปลงค่าฟังก์ชันการต่อข้อมูลทำให้อาร์กิวเมนต์ซ้ายและขวาถูกสลับ
    • ในที่สุดเราใส่ผลลัพธ์โดยใช้เพื่อให้เราสามารถแยกความแตกต่างระหว่างบรรทัดของอินพุต
  • ตอนแรกเราฟีดฟังก์ชั่นของเราด้วยการป้อนข้อมูลผู้ใช้ ( )
  • ในที่สุดเราก็ลด ( /) เวกเตอร์ที่เป็นผลลัพธ์ของเวกเตอร์ของคู่โดยใช้ฟังก์ชันจุดตัด ( ) เพื่อให้ได้ผลลัพธ์ของคู่ที่พบในเวกเตอร์ย่อยทั้งหมด

ไม่มีเหตุผลที่ดีที่ฉันมีการตอบสนองเชิงลบต่ออวัยวะภายในเมื่อใดก็ตามที่ฉันเห็น APL ที่ฉันไม่มีสำหรับ J หรือ GolfScript แต่ +1 ต่อไปสำหรับวิธีแก้ปัญหาที่ยอดเยี่ยม
Steven Rumbalski

ที่จริงฉันคิดจะเปลี่ยนไปใช้เจ ... ฉันจะแก้ไขมันในรายการเหตุผลของฉัน :)
Dillon Cower

12

Golfscript (28 ตัวอักษร)

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

มีปัญหาเกี่ยวกับชุดอักขระเมื่อทำการไพพ์ Unicode ผ่านดังนั้นจึงไม่มีโบนัสประจำไตรมาส


1
+1 นี่ไม่ควรมี upvotes น้อยกว่าคำตอบของฉัน
Steven Rumbalski

9

J, 57 51 44 40 ตัวอักษร

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

ฉันไปถึงที่นั่นอย่างช้าๆ แต่แน่นอน ยังคงห่างไกลจากอุดมคติแม้ว่าฉันคิดว่า

ฉันรู้สึกว่าการใช้เบ็ดจะเป็นคำตอบ แต่น่าเสียดายที่ไม่ใช่ (44 ตัวอักษร):

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

ฉันอาจต้องใช้วิธีที่แตกต่างอย่างสิ้นเชิงเพื่อให้สั้นลง


1
+1 แต่ใช่ฉันคาดหวังได้ดีกว่าจาก J.
Steven Rumbalski

นี่ไม่ควรมี upvotes น้อยกว่าคำตอบของฉัน
Steven Rumbalski

1
@StevenRumbalski upvotes ไม่ได้สะท้อนขนาดที่สัมพันธ์กันของรหัสเสมอไป บางครั้งมันกลายเป็นการประกวดภาษายอดนิยม ฉันยอมรับว่าคำตอบ golfscript ควรจะอยู่ที่นั่นกับ APL โชคไม่ดีที่ฉันให้ upvote แล้วและไม่สามารถช่วยผลักดันมันต่อไปได้
Gareth

8

Haskell, 64 ตัวอักษร

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

จับเส้นที่มีความยาวไม่เท่ากัน การสนับสนุน Unicode ขึ้นอยู่กับการตั้งค่าตำแหน่งที่ตั้งปัจจุบัน

ตัวอย่างผลลัพธ์:

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

+1 นี่ไม่ควรมี upvotes น้อยกว่าคำตอบของฉัน
Steven Rumbalski

7

Python 2 คะแนน 81.5 ( 116 94 86 83 82 ไบต์ลบด้วยโบนัส)

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

+1 สำหรับ Python Golf ที่ดี แต่คุณอาจเสียอักขระสี่ตัวทั้งหมด: [:-1]ไม่จำเป็นเว้นแต่จะตัดการขึ้นบรรทัดใหม่ที่ไม่เกี่ยวข้องในตอนท้ายของการป้อนข้อมูล (ซึ่งดูเหมือนจะไม่มีอยู่ในคำถาม)
ChristopheD

@ChristopheD: ที่จริงผลมาจากการมี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')]ฉันไม่เห็นวิธีหลีกเลี่ยงการลอกบรรทัดใหม่ที่ขึ้นบรรทัดสุดท้าย โปรดแก้ไขฉันหากฉันเข้าใจผิด ขอบคุณสำหรับการโหวต
Steven Rumbalski

หากคุณลบ newline สุดท้ายในไฟล์ข้อมูลของคุณ tuple สำหรับบรรทัดนั้นไม่สมบูรณ์ (ขาดหายไปหนึ่ง '\ n' ดังนั้น zip จะพิจารณาและส่งคืนข้อมูลที่เรากำลังมองหาอยู่เท่านั้นซึ่งอนุญาตให้ลบออก[:-1]ได้เช่นกันzip([1,2,3,4],[1,2,3])=> [(1, 1), (2, 2), (3, 3)]
ChristopheD

@ChristopheD: ต่อข้อมูลจำเพาะ "อินพุตประกอบด้วย [... ] บรรทัด [... ] แต่ละบรรทัดตามด้วยบรรทัดใหม่"
Ilmari Karonen

1
คนที่ลงคะแนนคำตอบนี้จะอธิบายว่าทำไม
Steven Rumbalski

5

(Bash) Shell Scripting, 105 ตัวอักษร

หากใครมีเคล็ดลับเพิ่มเติมสำหรับเรื่องนี้โปรดกรอกความคิดเห็นฟรี!

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

ผลลัพธ์:

1 ก
4 วัน
7 กรัม

ฉันมีปัญหาในการทำให้สิ่งนี้ทำงานได้; การรันสิ่งนี้บนอินพุตตัวอย่างจะพิมพ์ชุดของข้อผิดพลาดที่เหมือน/tmp/cols.sh: line 2: [1: command not foundและไม่มีอะไรอื่น
Ilmari Karonen

@Ilmari Karonen: นี่เป็นการทดสอบบน Mac (เสือดาวหิมะ, 10.6.2) แต่ควรทำงานที่อื่น I'see จะมีมันคงบนลินุกซ์ในวันพรุ่งนี้ (ควรจะแก้ไขเล็ก)
ChristopheD

2
ormaajขาดตัวแทน แต่ต้องการแสดงความคิดเห็น: มันแบ่งให้ Ilmari เพราะพื้นที่ที่ขาดหายไปหลังจาก[; และ $ {y: 3} จะทำให้มันทำงานได้กับอินพุต 3 บรรทัดเท่านั้น แก้ไขและเพิ่มประสิทธิภาพอัตราผลตอบแทน (100 ตัวอักษร) while((++i%`tail -1 $1|wc -c`));do x=`cut -c$i $1`;((`uniq|wc -l`==1))<<<"$x"&&echo $i ${x: -1};doneและการใช้ค่าเริ่มต้นจะช่วยให้ประหยัดมากขึ้นด้วยหนึ่งfor((;++i<`tail -1 $1|wc -c`;))doแต่มีข้อผิดพลาดที่ไม่เจาะจงในการทุบตี
Peter Taylor

4

Perl, 87 ตัวอักษร (−½ โบนัสไทเบรก)

นี่เป็นเวอร์ชั่น golfed ของโซลูชันของฉันเองจากเธรด SO :

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

ซึ่งแตกต่างจากรุ่น SO หนึ่งนี้ใช้ดัชนีที่ใช้ 1 สำหรับการส่งออก มันใช้คุณสมบัติ Perl 5.10 sayดังนั้นจำเป็นต้องเรียกใช้ด้วยperl -M5.010(หรือกับperl -E)

เช่นเดียวกับเวอร์ชั่น SO รหัสนี้จะจัดการกับบรรทัดที่มีความยาวผันแปรได้และจะจัดการกับอินพุต Unicode โดยพลการหากอินพุตและเอาต์พุตมาตรฐานอยู่ในโหมด UTF-8 อนิจจาโดยค่าเริ่มต้นพวกเขาจะไม่ยกเว้นว่ามีการระบุสวิตช์บรรทัดคำสั่งฟรี -CSดังนั้นจึงได้รับโบนัสถ่าน แต่ไม่ใช่โบนัส

แก้ไข: +1 char เพื่อแก้ไขข้อบกพร่อง: เพียงเพราะสตริงอินพุตไม่มีการป้อนบรรทัดไม่ได้หมายความว่าพวกเขาไม่สามารถลงเอยด้วย$a(เช่น"+" & "J" eq "\n")


1
คุณสามารถประหยัด 1 ถ่านโดยใช้แทนchop chomp
โตโต้

@ M42: จุดดีแม้ว่าฉันจะชอบความแข็งแกร่งของรุ่นปัจจุบัน ฉันคิดว่าฉันจะรักษามันไว้mตอนนี้มันไม่เหมือนที่มันสร้างความแตกต่างให้กับการจัดอันดับในขณะนี้ :)
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)

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

ungolfed และSource.fromFile ("f")แทนที่จะstdinทดสอบได้ดีกว่า:

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

ผลลัพธ์:

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

ขอขอบคุณที่แกเร็ ธ สำหรับการลดลงของขนาด 8 stdinสำหรับการใช้


คุณไม่สามารถใช้stdinแทนที่จะfromFile("f")บันทึก 8 อักขระได้หรือไม่
Gareth

2

VBA ( 307.25 284 - 0.75 โบนัส = 283.25)

ฉันรู้ว่าสิ่งนี้ได้รับรางวัลมาแล้ว แต่นี่คือภาพของฉัน (ไม่อ่านไฟล์เพียงแค่สตริง - ต้องมี io เพิ่ม) ฉันชอบที่ฉันต้องใช้l()ซ้ำ ฉันมักจะไม่จำเป็นต้องเขียนโปรแกรมซ้ำในชีวิตจริงของฉัน ฉันทำการทดสอบมากมาย แต่ฉันเชื่อว่าสิ่งนี้ครอบคลุมถึงการกำหนดแต้มโบนัส Unicode นอกจากนี้ยังถือว่าvbCrเป็นตัวยุติบรรทัด สิ่งนี้อาจไม่แปลเป็นระบบทั้งหมดเนื่องจากสิ่งนั้น

รหัส:

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

ตัวอย่างอินพุต / เอาต์พุต:

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}

การใช้

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

K, 22

วิธีการแก้ปัญหาข้างต้นสามารถลดลงได้ถึง 22 โดยเขียนเป็น K อย่างสมบูรณ์แทนที่จะส่งผ่านฟังก์ชั่น K ไปยังล่าม Q ทำให้ลดจำนวนวงเล็บที่ต้องการ

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

1

PHP, 123 127 :(

ฉันไม่พอใจกับมัน (มีข้อผูกพันที่จะต้องมีการปรับปรุงให้ดีขึ้น) แต่นี่จะไป:

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

พิสูจน์การทำงาน

หากใคร ๆ สามารถนึกถึงวิธีการเริ่มต้นที่ฉลาดกว่าได้ $ a และ $ b โปรดแจ้งให้เราทราบ แต่เดิมฉันมี$a=$b=$n=''และ $ b ในที่สุดก็ถูกต้อง แต่[empty] & [anything] == [empty]ดังนั้น $ a ไม่เคยมีเนื้อหา


แก้ไข: ต้องแก้ไขการจัดการบรรทัดใหม่ (+6) แต่วางแท็กปิด (-2)


ฉันอยากรู้ว่าทำไมคุณใช้ประโยชน์สูงสุดจากวิกิชุมชนของคำตอบ
Gareth

ฉันไม่ได้ตั้งใจทำสิ่งนี้ นานมาแล้วเมื่อฉันเข้าร่วม CodeGolf ครั้งแรกมีคนบอกฉันว่ามันเป็นมาตรฐาน ต้องทำลายนิสัย สามารถยกเลิกการวิกิได้เลยตอนนี้ codegolf.stackexchange.com/a/2249/1419 (ดูความคิดเห็น)
นาย Llama

ฉันคิดว่ามันเป็นวิธีมาตรฐานในการทำสิ่งต่าง ๆ บน SO สำหรับคำถามเกี่ยวกับการเล่นกอล์ฟ แต่ไม่ใช่ที่นี่มิฉะนั้นจะไม่มีใครมีชื่อเสียง :-)
Gareth

คุณอาจตั้งค่าสถานะพวกเขาและขอให้ผู้ดำเนินรายการยกเลิกการ CWได้ เพียงอธิบายว่ามันเป็นความผิดพลาด
Ilmari Karonen

?>คุณสามารถบันทึกตัวอักษรสองโดยออกออก อย่างไรก็ตามฉันเพิ่งสังเกตเห็นว่ารหัสของคุณมีข้อบกพร่อง: มันพิมพ์การจับคู่พิเศษถ้าทุกบรรทัดมีขึ้นบรรทัดใหม่ตามที่ระบุ
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)

การสาธิต: http://jsfiddle.net/Fv7kY/4/

แก้ไข 1 : จัดเรียงลูปใหม่เพื่อหลีกเลี่ยงการจัดฟัน เริ่มต้นกับฉันที่จะรวมกับ[] sย้ายส่วนwเพิ่มไปยังนิพจน์

แก้ไข 2 : ชุดไปสู่การจับกุมป้อนสุดท้ายคำพูดและการบันทึกการใช้S=I s[1]นวดและr=1 ++c<S.lengthชุดC=s[c]ในวงภายในและเปรียบเทียบกับCแทนคำพูดก่อนหน้านี้และต่อไปในการแสดงออกสั้นลงเหลือเพียงs[w][c]==s[w++][c] s[w++][c]==Cบันทึกทั้งหมด 9 ตัวอักษร นอกจากนี้ยังกำหนดw=r=...เพราะเมื่อมันเป็นความจริงw=1ซึ่งเป็นสิ่งที่เราต้องเริ่มต้นwด้วย


1

ทับทิม (71)

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

เอาท์พุท:

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

หมายเหตุ: ดูเหมือนจะต้องการ Ruby 1.9; สำหรับ Ruby 1.8 ความเข้ากันได้แทนที่ด้วยt[i] t[i,1]
Ilmari Karonen

1

เสียงกระเพื่อมสามัญ, 183 165 ตัวอักษร

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

รูปแบบที่อ่านได้:

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

ป้อนสิ่งนี้โดยตรงใน REPL และป้อนบรรทัดยกเลิกด้วยบรรทัดว่าง


1

C, 126 ตัวอักษร

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

ฉันกำลังจ้องมองที่นี่ แต่ฉันไม่สามารถทำให้เล็กลงได้ อาจจำเป็นต้องใช้วิธีการใหม่

(ไม่มีคะแนนโบนัสมันจัดการสายที่มีขนาดต่างกันก็ต่อเมื่อบรรทัดแรกเป็นเส้นที่สั้นกว่า)


0

C # กับ. 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 บรรทัด 280 อักขระ
  • รวมถึงการใช้คำสั่งที่จำเป็นทั้งหมดและวิธีการหลัก
  • โปรแกรมไม่จำเป็นต้องมีบรรทัดว่างเปล่าในตอนท้าย แต่จะยอมรับได้
  • บรรทัดว่างจะถูกละเว้น
  • จัดการสตริงอินพุตของความยาวใด ๆ
  • สำรองเอาท์พุทจนกว่าจะสิ้นสุด (ในขณะที่คำตอบเดิมให้เอาท์พุทที่เพิ่มขึ้น)

เวอร์ชันที่อ่านได้

    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 = System.Console; class P {โมฆะหลักคงที่ () {ถ่าน [] a; var b = c.ReadLine (); a = b.ToCharArray (); ในขณะที่ (b! = "") {สำหรับ (int i = 0; ฉัน

  • 1 บรรทัด
  • 207 ตัวอักษร
  • รวมถึงการใช้คำสั่งที่จำเป็นทั้งหมดและวิธีการหลัก
  • โปรแกรมสิ้นสุดลงเมื่อป้อนบรรทัดว่าง
  • ห้ามจัดการกับสตริงอินพุตที่สั้นกว่าสตริงแรก


รุ่นที่อ่านได้:

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


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เมื่อฉันทำงานนี้ในการป้อนข้อมูลการทดสอบในความท้าทายที่ฉันได้รับ 0: a 3: d 6: gการส่งออกคาดว่าจะเป็น
Ilmari Karonen

@Ilmari Ok แต่มันจะแสดงผลคอลัมน์ / อักขระที่เหมือนกันหลังจากแต่ละบรรทัดอินพุต หากคุณกำลังป้อนไฟล์เป็นอินพุตมาตรฐานดังนั้นเอาต์พุตอาจดูแปลก แต่ถ้าคุณป้อนด้วยตนเองฉันคิดว่ามันสมเหตุสมผล ฉันจะพิจารณาวิธีการปรับโครงสร้างอีกครั้ง
ลูกศิษย์ของ Dr. Wily

โซลูชันของคุณขัดข้องหากบรรทัดใดยาวกว่าบรรทัดแรก
Timwi

@ Timwi Ah ... ขอบคุณที่ชี้ให้เห็น!
ศิษย์ของดร. Wily

0

หลาม 122 ตัวอักษร :

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

คุณไม่จำเป็นต้องช่องว่างระหว่างและ) forดังนั้นแทนที่จะ…str(x[0]) for i,x…ทำเช่น…str(x[0])for i,x…นั้น นอกจากนี้ยังมาขึ้นที่tuple(x) forและ.split()])) if
Cyoce

-1

ทับทิม (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('|') }

จุดประสงค์ของการท้าทายคือการอ่านบรรทัดจากอินพุตมาตรฐาน ฉันยินดีที่จะลดความหย่อนคล้อยของภาษา (เช่น JavaScript ในเบราว์เซอร์) ซึ่งแนวคิดนี้ไม่มีอยู่จริง แต่ Ruby มีSTDIN(หรือARGFหรือเรียบง่ายgets)
Ilmari Karonen

อ่าโอเค. แต่การพิจารณา STDIN ยอมรับหนึ่งบรรทัดจะถือว่ามีลักษณะดังนี้: "เข้าสู่อีกบรรทัดหนึ่งหรือ 'n' เพื่อหยุด" ดังนั้นสร้าง loop เพื่อสร้าง array
agmcleod

ฉันได้เพิ่มคำอธิบายคำถาม โดยทั่วไปคุณควรอ่านบรรทัดอินพุตจนกว่าจะถึงจุดสิ้นสุดไฟล์
Ilmari Karonen

คุณมีช่องว่างที่ไม่จำเป็นมากมาย
Cyoce

-1

ค#

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
สวัสดีอาร์จังและยินดีต้อนรับสู่ codegolf.SE! ความเห็นเล็ก ๆ น้อย ๆ เกี่ยวกับคำตอบของคุณ: อันดับแรกเนื่องจากนี่เป็นความท้าทายของนักกอล์ฟคุณคาดว่าจะพยายามทำให้วิธีการแก้ปัญหาของคุณสั้นที่สุดเท่าที่จะทำได้ เพียงแค่เริ่มต้นคุณมีชื่อตัวแปรยาว ๆ ที่คุณสามารถย่อให้เหลือเพียงอักขระเดียวได้อย่างง่ายดายและช่องว่างส่วนเกินที่คุณสามารถลบออกได้ (มันดีที่จะโพสต์โค้ดที่อ่านได้ของคุณพร้อมกับโค้ด "golfed" แต่คุณควรโพสต์โซลูชัน golfed ด้วยเช่นกัน) ประการที่สองถ้าคุณอ่านคำถามอย่างระมัดระวังฉันระบุว่าคุณควรอ่านสตริงจากอินพุตมาตรฐาน ไม่ใช่ hardcode พวกเขา
Ilmari Karonen
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.