最長の音楽部分文字列を見つける


9

音楽の文字列は、ピアノの鍵盤で演奏することができます任意の文字列です。

子供の頃にピアノを習得することを余儀なくされた私たちのために、キーボードは次のようになります。

ピアノ

つまり、文字列feed a dead cabbageはすべて1つの文字がこれらのnotの1つに対応するため、音楽的な文字列です。

あなたの課題は、文字列をSTDINから入力として受け取り、最も長い音楽の部分文字列を見つけるプログラムを作成することです。次に、プログラムは部分文字列とその長さを出力する必要があります。以下に入力/出力の例をいくつか示します。

入力:「FEED ME!お腹がすいている!」

出力:フィード4


入力:いいえ、いいえ、いいえ、ムシストリンなし!

出力:0


入力: "A **bad** !!!fAd82342"

出力:abadfad 7


入力:「ゴルフが上手です!」

出力:dg 2

ルール

  • 出力は大文字でも小文字でもかまいませんが、句読点やスペースがあってはなりません。

  • 入力文字列には大文字と句読点がありますが、これは部分文字列が「音楽的」と見なされるかどうかに影響しません。

  • 音楽の部分文字列と数字の間にスペースが必要です。


1
完全なプログラムのみ、機能なし?
Alex A.

@AlexAはい、完全なプログラム。
ジェームズ

出力は大文字と小文字を混在させることができますか?
nderscore

@nderscoreはい、できます。
James

回答:


4

Pyth、25 23バイト

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

@Jakubeのおかげで2バイト節約されました。

デモンストレーション。 テストハーネス。

説明:

  • 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が正規表現(.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

Perl 5(106)

use List::Util reduce;$_=lc<>;s/[^a-z]//g;$_=reduce{length$a>length$b?$a:$b}m/[a-g]+/g;print"$_ ",0+length

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)

非ゴルフ+説明:

# 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

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

I最初の力小文字、その後、ストリップ、スペース以外の文字の文字を、その後、入力(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.