문자열의 모든 고유 한 "하위 팔린 드롬" 을 찾는 가장 짧은 코드입니다 .
예. 1
input: "12131331"
output: "33", "121", "131", "313", "1331"
예 .2
input: "3333"
output: "33", "333", "3333"
333
하는가? 순진 당신은 인쇄 끝장 33
두 번
문자열의 모든 고유 한 "하위 팔린 드롬" 을 찾는 가장 짧은 코드입니다 .
예. 1
input: "12131331"
output: "33", "121", "131", "313", "1331"
예 .2
input: "3333"
output: "33", "333", "3333"
333
하는가? 순진 당신은 인쇄 끝장 33
두 번
답변:
~.(#~(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에서 줄 당 하나씩 발견 된 모든 회문을 던질 것입니다.
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›
하면 10 바이트는 9 바이트가 될 수 있습니다 ≠
. :)
#(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()
하나의 문자와 동일하며 하나의 문자를 저장합니다! 저축을 감안할 때 나는 이것을 자랑스럽게 생각합니다.
예:
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
왜 누군가를 더 잘 알고 있으며 이것을 더 잘 설명 할 수 있습니다.이 모든 것을 바꾸지 않아도됩니다 ...이 코드가 확실하지 않습니다. 테스트 예제가 더 많으면 문제가 발생합니다 ...
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
반환 세트 .
s=>new Set((g=(s,r=[...s].reverse().join``)=>s[1]?(r==s?[s]:[]).concat(g(s.slice(1)),g(r.slice(1))):[])(s))