文字列のすべての一意の「サブパリンドローム」、つまり、パリンドロームである長さ> 1のサブストリングを見つける最短コード。
例1
input: "12131331"
output: "33", "121", "131", "313", "1331"
例2
input: "3333"
output: "33", "333", "3333"
333
あるかということです。単純に33
2回印刷することになります
文字列のすべての一意の「サブパリンドローム」、つまり、パリンドロームである長さ> 1のサブストリングを見つける最短コード。
例1
input: "12131331"
output: "33", "121", "131", "313", "1331"
例2
input: "3333"
output: "33", "333", "3333"
333
あるかということです。単純に33
2回印刷することになります
回答:
~.(#~(1<#*]-:|.)&>),<\\.
使用例:
~.(#~(1<#*]-:|.)&>),<\\. '12131331'
┌───┬───┬───┬────┬──┐
│121│131│313│1331│33│
└───┴───┴───┴────┴──┘
~.(#~(1<#*]-:|.)&>),<\\. '3333'
┌──┬───┬────┐
│33│333│3333│
└──┴───┴────┘
どうぞ、GolfScript!
/dev/random
私たちを欺くためにここからダンプを置くだけです;
~.(#~(1<#*]-:|.)&>),<\\.
(24文字)に短縮できませんか?
subpalindrome.gs
{,}{(;}/{{,}{);}/}%{+}*{.,1>\.-1%=*},.&{`}%", "*
使用法:
echo "12131331" | ruby golfscript.rb subpalindrome.gs
最初の操作{,}{(;}/
は、文字列を後続部分文字列のリストに変換します。次に、同様の先行部分文字列変換が結果にマッピングされます。次に、で平坦化し{+}*
、述語を使用して回文をフィルターし、で.,1>\.-1%=*
一意の値を取得し.&
、きれいに印刷します。
末尾の部分文字列の変換をブロックとして抽出し、各末尾の部分文字列を逆にした後、先頭の部分文字列の置換として再利用する方が適切ですが、それを行う簡単な方法はわかりません。
import Data.List
import Data.Set
p a=fromList$[show x|x<-subsequences a,x==reverse x,length x>1]
main=getLine>>=(\x->putStrLn$intercalate", "$toList$p x)
main=getLine>>=(\x->putStrLn$intercalate", "$toList$p x)
とmain=getLine>>=putStrLn.intercalate", ".toList.p
。呼び出しをp
そのボディに置き換えます。
subsequences
!プログラムは、例1の参照出力よりも多くのサブパリンドロームを報告します(たとえば、「1111」)
0..($l=($s="$input").length-1)|%{($a=$_)..$l|%{-join$s[$a..$_]}}|sort -u|?{$_[1]-and$_-eq-join$_[$l..0]}
これは、stdinでの入力を想定し、見つかったすべての回文をstdoutで1行に1つずつスローします。
PS Home:\SVN\Joey\Public\SO\CG183> '12131331'| .\subp.ps1
33
121
131
313
1331
(から実行するとcmd
、それになりecho 12131331|powershell -file subp.ps1
-それはちょうどそれだ$input
スクリプトが呼び出されたかによって若干異なる意味がかかりますが、それだけではない対話的に、標準入力することができます。)
2011-01-30 13:57(111)–最初の試行。
2011-01-30 13:59(109)–インライン変数宣言。
2011-06-02 13:18(104)–呼び出し.Substring()
やインライン化を行う代わりに、char配列を結合して部分文字列の検索をやり直します。
{a::x;(?)(,/)b@'(&:')({x~(|:)x}'')b:-1_1_'({(sublist[;a]')x,'1+c}')c::(!)(#)a}
使用法
q){a::x;(?)(,/)b@'(&:')({x~(|:)x}'')b:-1_1_'({(sublist[;a]')x,'1+c}')c::(!)(#)a}"12131331"
"121"
"131"
"313"
"1331"
"33"
q){a::x;(?)(,/)b@'(&:')({x~(|:)x}'')b:-1_1_'({(sublist[;a]')x,'1+c}')c::(!)(#)a}"3333"
"33"
"333"
"3333"
&@!`(.)+.?(?<-1>\1)+(?(1)^)
テストスイートのM
後には、テストケースの間に空の行を挿入する別の段階が続くため、必要です。
&@!`(.)+.?(?<-1>\1)+(?(1)^)
正規表現の!
一意(@
)、重複(&
)の一致をすべて印刷()します(.)+.?(?<-1>\1)+(?(1)^)
。これは、バランスグループを使用して長さ2以上の回文と一致します。「すべての重複一致」部分には注意事項があります。開始位置ごとに最大1つの一致を取得できます。ただし、長さが異なる2つのパリンドロームが同じ位置から始まる場合、長いパリンドロームの終わりに短いパリンドロームが再び現れます。そして、+
優先順位の貪欲さはより長くマッチするので、とにかくすべての回文を取得しています。
#(set(for[i(range 2(+(count %)1))p(partition i 1 %):when(=(reverse p)(seq p))]p))
for
ここで完璧にマッチが:)使用することができた:when(=(reverse p)p)
入力が回文としてカウントされませんでした文字または完全な文字列のリストであった場合、その場合には、実際の最大範囲i
可能性があり(count %)
、同様に。
参考のための最もコンパクトなケース:
#(set(for[i(range 2(count %))p(partition i 1 %):when(=(reverse p)p)]p))
s=lambda t:(t[1:]or())and(t,)*(t==t[::-1])+s(t[1:])+s(t[:-1])
print set(s(input()))
フレーズ(t[1:]or())and...
は次と同等です(...)if t[1:]else()
1文字に、1文字を節約します!節約を考えると、私はこれを非常に誇りに思っています。
例:
python x
"51112232211161"
set(['11', '22', '11122322111', '161', '111', '112232211', '1223221', '22322', '232'])
object o extends App{val l=args(0).length-2;val r=for(i<-0 to l;j<-i to l;c=args(0).substring(i,j+2);if(c==c.reverse))yield c;print(r.toSet.mkString(" "))}
object o{def main(s:Array[String]){val l=s(0).length-2;val r=for(i<-0 to l;j<-i to l;c=s(0).substring(i,j+2);if(c==c.reverse)) yield c;println(r.distinct.mkString(" "))}}
{unique ~«m:ex/(.+).?<{$0.flip}>/}
{set ~«m:ex/(.+).?<{$0.flip}>/}
{ # bare block lambda with implicit parameter 「$_」
set # turn into a Set object (ignores duplicates)
~«\ # stringify 「~」 all of these 「«」 (possibly in parrallel)
# otherwise it would be a sequence of Match objects
m # match
:exhaustive # in every way possible
/
( .+ ) # at least one character 「$0」
.? # possibly another character (for odd sized sub-palindromes)
<{ $0.flip }> # match the reverse of the first grouping
/
}
{∪⍵/⍨≡∘⌽¨⍨⍵}∘⊃(,/1↓⍳∘≢,/¨⊂)
{∪⍵/⍨≡∘⌽¨⍨⍵}∘⊃(,/1↓⍳∘≢,/¨⊂) Monadic train:
⊂ Enclose the input, ⊂'12131331'
⍳∘≢ Range from 1 to length of input
⍳∘≢,/¨⊂ List of list of substrings of each length
1↓ Remove the first list (length-1 substrings)
⊃ ,/ Put the rest of the substrings into a single list.
{∪⍵/⍨≡∘⌽¨⍨⍵} To the result, apply this function which
keeps all palindromes from a list:
≡∘⌽¨⍨⍵ Boolean value of whether each (¨) string in argument
≡∘⌽ ⍨ is equal to its own reverse
⍵/⍨ Replicate (filter) argument by those values.
This yields the length >1 palindromes.
∪ Remove duplicates from the list of palindromes.
∪w/⍨≡∘⌽¨⍨w←⊃,/1↓(⍳∘≢,/¨⊂)
は有効です。
Êò2@ãX fêSÃc â
説明:
Êò2 #Get the range [2...length(input)]
@ Ã #For each number in that range:
ãX # Get the substrings of the input with that length
fêS # Keep only the palindromes
c #Flatten
â #Keep unique results
$args|% t*y|%{$s+=$_
0..$n|%{if($n-$_-and($t=-join$s[$_..$n])-eq-join$s[$n..$_]){$t}}
$n++}|sort -u
少ないゴルフ:
$args|% toCharArray|%{
$substring+=$_
0..$n|%{
if( $n-$_ -and ($temp=-join$substring[$_..$n]) -eq -join$substring[$n..$_] ){
$temp
}
}
$n++
}|sort -Unique
{s.l>1∧.↔}ᵘ
(リンクにおいてヘッダが転記時に破壊されるので、ここでだ述語(機能的に等価Brachylog中)を、最初のテストケース、上にw
実際に出力を印刷するために端部で)。
The output is
{ }ᵘ a list containing every possible unique
s. substring of
the input
l the length of which
> is greater than
1 one
∧ and
. which
↔ reversed
is itself. (implicit output within the inline sub-predicate)
長さが1より大きいことを確認する方法がもっと短いように感じます(些細なパリンドロームを除外しなかった場合、それは単に{s.↔}ᵘ
。)
{0=≢m←∪b/⍨{1≥≢⍵:0⋄∧/⍵=⌽⍵}¨b←↑∪/{x[⍵;]⊂y}¨⍳≢x←11 1‼k k⊢k←≢y←⍵:⍬⋄m}
テスト:
r←{0=≢m←∪b/⍨{1≥≢⍵:0⋄∧/⍵=⌽⍵}¨b←↑∪/{x[⍵;]⊂y}¨⍳≢x←11 1‼k k⊢k←≢y←⍵:⍬⋄m}
o←⎕fmt
o r '1234442'
┌2───────────┐
│┌2──┐ ┌3───┐│
││ 44│ │ 444││
│└───┘ └────┘2
└∊───────────┘
o r '3333'
┌3───────────────────┐
│┌4────┐ ┌3───┐ ┌2──┐│
││ 3333│ │ 333│ │ 33││
│└─────┘ └────┘ └───┘2
└∊───────────────────┘
o r "12131331"
┌5─────────────────────────────────┐
│┌4────┐ ┌3───┐ ┌2──┐ ┌3───┐ ┌3───┐│
││ 1331│ │ 121│ │ 33│ │ 313│ │ 131││
│└─────┘ └────┘ └───┘ └────┘ └────┘2
└∊─────────────────────────────────┘
o r '1234'
┌0─┐
│ 0│
└~─┘
{0=≢m←∪b/⍨{1≥≢⍵:0⋄∧/⍵=⌽⍵}¨b←↑∪/{x[⍵;]⊂y}¨⍳≢x←11 1‼k k⊢k←≢y←⍵:⍬⋄m}
y←⍵ assign the argument to y (because it has to be used inside other function)
x←11 1‼k k⊢k←≢y assign the lenght of y to k, call the function 11 1‼k k
that seems here find all partition of 1 2 ..k
{x[⍵;]⊂y}¨⍳≢ make partition of arg ⍵ using that set x
∪/ set union with precedent to each element of partition y (i don't know if this is ok)
b←↑ get first assign to b
{1≥≢⍵:0⋄∧/⍵=⌽⍵}¨ for each element of b return 1 only if the argument ⍵ is such that
"∧/⍵=⌽⍵" ⍵ has all subset palindrome, else return 0
b/⍨ get the elements in b for with {1≥≢⍵:0⋄∧/⍵=⌽⍵} return 1
m←∪ make the set return without ripetition element, and assign to m
0=≢ if lenght of m is 0 (void set) than
:⍬⋄m return ⍬ else return m
誰かが理由をよく知っており、これをすべて変更することなく、より良く説明することができます...私はこのコードには確信がありません、テスト例がもっと多い場合、可能性があります...
ã â fÅfêU
ã â fÅfêU :Implicit input of string
ã :Substrings
â :Deduplicate
f :Filter elements that return truthy
Å : Slice off first character
f :Filter elements that return true
êU : Test for palindrome
import java.util.*;s->{Set r=new HashSet();String x;for(int l=s.length(),i=0,j;i<l;i++)for(j=i;++j<=l;)if((x=s.substring(i,j)).contains(new StringBuffer(x).reverse())&x.length()>1)r.add(x);return r;}
関数が許可されておらず、完全なプログラムが必要な場合、代わりに256 255 253バイトです。
import java.util.*;interface M{static void main(String[]a){Set r=new HashSet();String x;for(int l=a[0].length(),i=0,j;i<l;i++)for(j=i;++j<=l;)if((x=a[0].substring(i,j)).contains(new StringBuffer(x).reverse())&x.length()>1)r.add(x);System.out.print(r);}}
説明:
import java.util.*; // Required import for Set and HashSet
s->{ // Method with String parameter and Set return-type
Set r=new HashSet(); // Return-Set
String t; // Temp-String
for(int l=s.length(), // Length of the input-String
i=0,j; // Index-integers (start `i` at 0)
i<l;i++) // Loop (1) from `0` to `l` (exclusive)
for(j=i;++j<=l;) // Inner loop (2) from `i+1` to `l` (inclusive)
if((t=s.substring(i,j)
// Set `t` to the substring from `i` to `j` (exclusive)
).contains(new StringBuffer(t).reverse())
// If this substring is a palindrome,
&t.length()>1) // and it's length is larger than 1:
r.add(t); // Add the String to the Set
// End of inner loop (2) (implicit / single-line body)
// End of loop (1) (implicit / single-line body)
return r; // Return the result-Set
} // End of method
Setを返します。
s=>new Set((g=(s,r=[...s].reverse().join``)=>s[1]?(r==s?[s]:[]).concat(g(s.slice(1)),g(r.slice(1))):[])(s))