查找字符串的所有唯一 “子回文” 的最短代码,即:任何长度大于1的子字符串都是回文。
例如1
input: "12131331"
output: "33", "121", "131", "313", "1331"
例如2
input: "3333"
output: "33", "333", "3333"
333
be 的输出必须是什么?天真地,您最终要打印33
两次
查找字符串的所有唯一 “子回文” 的最短代码,即:任何长度大于1的子字符串都是回文。
例如1
input: "12131331"
output: "33", "121", "131", "313", "1331"
例如2
input: "3333"
output: "33", "333", "3333"
333
be 的输出必须是什么?天真地,您最终要打印33
两次
Answers:
~.(#~(1<#*]-:|.)&>),<\\.
样品使用:
~.(#~(1<#*]-:|.)&>),<\\. '12131331'
┌───┬───┬───┬────┬──┐
│121│131│313│1331│33│
└───┴───┴───┴────┴──┘
~.(#~(1<#*]-:|.)&>),<\\. '3333'
┌──┬───┬────┐
│33│333│3333│
└──┴───┴────┘
接受,GolfScript!
/dev/random
这里放了一个垃圾场来骗我们;-)
~.(#~(1<#*]-:|.)&>),<\\.
24个字符吗?
下回文
{,}{(;}/{{,}{);}/}%{+}*{.,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上每行抛出所有发现的回文数:
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)–通过加入char数组(而不是调用)来重做子字符串查找,.Substring()
并内联了更多内容。
{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›
到≠
。:)
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
最后是a 来实际打印输出。)
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
有人更清楚为什么会这样,并且可以更好地解释这一点,而无需对此进行任何更改...我不太确定这段代码,如果测试示例更多,可能会出问题...
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