ค้นหาสตริงดนตรีที่ยาวที่สุด


9

สตริงดนตรีคือสตริงใด ๆ ที่สามารถเล่นบนแป้นพิมพ์เปียโน

สำหรับพวกเราที่ไม่ได้ถูกบังคับให้เรียนเปียโนในฐานะเด็กนี่คือลักษณะของแป้นพิมพ์

เปียโน

ดังนั้นสตริงfeed a dead cabbageจึงเป็นสตริงดนตรีเพราะตัวอักษรทุกตัวตรงกับข้อความเหล่านี้

ความท้าทายของคุณคือการเขียนโปรแกรมที่ใช้สตริงเป็นอินพุตจาก STDIN และค้นหาสตริงดนตรีที่ยาวที่สุด จากนั้นโปรแกรมของคุณจะต้องพิมพ์สตริงย่อยและความยาว นี่คือตัวอย่างอินพุต / เอาท์พุตบางส่วน

อินพุต: "ฟีดฉัน! ฉันหิว!"

ผลลัพธ์: ฟีด 4


อินพุต: ไม่ไม่ไม่ไม่มีเพลง!

Ouput: 0


การป้อนข้อมูล: "A **bad** !!!fAd82342"

ผลลัพธ์: abadfad 7


อินพุต: "Good golfing!"

ผลลัพธ์: dg 2

กฎระเบียบ

  • เอาต์พุตของคุณอาจเป็นตัวพิมพ์ใหญ่หรือตัวพิมพ์เล็ก แต่ต้องไม่มีเครื่องหมายวรรคตอนหรือช่องว่าง

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

  • จะต้องมีช่องว่างระหว่างสายอักขระดนตรีและหมายเลข


1
โปรแกรมเต็มรูปแบบเท่านั้นไม่มีฟังก์ชั่น?
อเล็กซ์ A.

@AlexA ใช่โปรแกรมเต็มรูปแบบ
James

สามารถส่งออกเป็นกรณีผสม?
nderscore

@ ตัวเลขใช่มันเป็นไปได้
James

คำตอบ:


4

Pyth, 25 23 ไบต์

pdJef!-T<G7+k.:@Grz0)lJ

บันทึก 2 ไบต์ด้วย @Jakube

สาธิต. สายรัดทดสอบ

คำอธิบาย:

  • rz0: อินพุตเป็นตัวพิมพ์เล็ก
  • @Grz0: ตัดอักขระที่ไม่ใช่ตัวอักษรใด ๆ
  • .:@Grz0): สร้างสตริงย่อยทั้งหมด
  • +k.:@Grz0): เพิ่มในสตริงว่าง
  • f ... +k.:@Grz0): กรองสตริงเหล่านี้
  • -T<G7: กรองแต่ละสายอักขระที่ไม่ใช่ดนตรี
  • !-T<G7: ลบล้างผลลัพธ์ นี่คือTrueถ้าและถ้าเป็นสตริงดนตรี
  • f!-T<G7+k.:@Grz0): กรองสตริงดนตรี
  • ef!-T<G7+k.:@Grz0): ใช้สตริงตัวสุดท้าย .:สั่งซื้อสตริงย่อยตามขนาดดังนั้นนี่จึงเป็นสตริงดนตรีที่ยาวที่สุด
  • Jef!-T<G7+k.:@Grz0): Jกำหนดผลให้
  • pdJ: พิมพ์Jด้วยdเว้นวรรคเป็นอักขระสิ้นสุด
  • lJ: Jแล้วพิมพ์ความยาวของ

2

Ruby, 83 75 ตัวอักษร

ค่อนข้างอธิบายตนเอง

puts"#{s=gets.gsub(/[^a-z]/i,'').split(/[^a-g]/i).max_by &:size} #{s.size}"

ใช้ประโยชน์จากความจริงที่ว่า Ruby สามารถแยกสตริงบน regex ( .split(/[^a-g]/))


1

Perl, 58

#!perl -p
$\=0;map{$i++;$\="$& $i"if/[a-g]{$i}/i}(s/\W//gr)x y!!!cd

ใช้:

$ perl ~/mus.pl <<<"FEED ME! I'm hungry!"
FEED 4

หรือ

$ perl -pe'$\=0;map{$i++;$\="$& $i"if/[a-g]{$i}/i}(s/\W//gr)x y!!!cd' <<<"FEED ME! I'm hungry!"
FEED 4

0

Java, 268

class Z{public static void main(String[]a){String s=new java.util.Scanner(System.in).nextLine().toLowerCase().replaceAll("[^a-z]",""),t;for(int i=s.length();i-->0;)if(!(t=s.replaceFirst("^(.*)([a-g]{"+i+"})(.*)$","$2")).equals(s)){System.out.println(t+" "+i);break;}}}

ขยาย:

class Z {
    public static void main(String[] a) {
        String s = new java.util.Scanner(System.in).nextLine().toLowerCase().replaceAll("[^a-z]", ""), t;
        for (int i = s.length(); i-- > 0;) {
            if (!(t = s.replaceFirst("^(.*)([a-f]{" + i + "})(.*)$", "$2")).equals(s)) {
                System.out.println(t + " " + i);
                break;
            }
        }
    }
}


0

R, 98 94 ไบต์

p=strsplit(gsub("[^a-z]","",readline(),T),"[^a-gA-G]+")[[1]];m=max(n<-nchar(p));cat(p[n==m],m)

คำอธิบาย Ungolfed +:

# Read from STDIN and remove all non-alphabetic characters
r <- gsub("[^a-z]", "", readline(), ignore.case = TRUE)

# Split r into a vector of substrings on characters other than a-g
p <- strsplit(r, "[^a-g]+")[[1]]

# Get the number of characters in each substring
n <- nchar(p)

# Get the length of the longest substring
m <- max(n)

# Print the string and length
cat(p[n == m], m)

ข้อเสนอแนะยินดีต้อนรับ!

หมายเหตุ: ตอนนี้เอาต์พุตเป็นแบบผสมตัวพิมพ์ซึ่งได้รับอนุญาตตามการแก้ไขของ OP บันทึกแล้ว 4 ไบต์


0

golflua , 84 85 84 ไบต์

B=I.r():g("%A",""):g("[^a-gA-G]"," ")M=0Q=""~@W B:gm("(%w+)")?#W>M M=#W Q=W$$w(Q,M)

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

รหัส Lua ที่ไม่ร้ายกาจน่าจะเป็น

Line = io.read()                                  -- read stdin
NoSpaced = Line:gsub("%A","")                     -- strip non-letter chars
MusicalLetters = NoSpaced:gsub("[^a-gA-g]", " ")  -- remove non-musical letters
WordLen = 0, LongWord = ""                        -- helpers
for words in MusicalLetters:gmatch("(%w+)") do    -- scan for longest word
   if words:length() > WordLen then 
      WordLen = words:length()
      LongWord = words 
   end
end
print(LongWord, WordLen)                          -- output solution
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.