문자열 조합 찾기..
글쓴이: 매그넘 / 작성시간: 월, 2009/03/09 - 3:25오후
char A[][][] = { { "a" , "b" , "c" } , {"1", "2", "3" } , { "A" , "B" , "C" } ... }
a1A
a1B
a1C
a2A
a2B
a2C
a3A
a3B
a3C
b1A
b1B
b1C
b2A
b2B
b2C
b3A
b3B
b3C
c1A
c1B
c1C
c2A
c2B
c2C
c3A
c3B
c3C위와 같은 배열이 있습니다.
{ "a" , "b" , "c" } 이런 문자열이 2개가 있을수도, 3개가 있을수도.. 4개가 있을수도 있습니다.
이러한 문자열을 조합해서.. 아래의 결과를 뿌려주고 싶습니다.
대략 리커시브를 돌리면 될듯한데..
어떻게 해야할지...머리에서 쥐가 나네요. ㅠㅠ.
도움 부탁드려요~
Forums:


http://www.bearcave.com/rando
http://www.bearcave.com/random_hacks/permute.html
--
C FAQ: http://www.eskimo.com/~scs/C-faq/top.html
Korean Ver: http://www.cinsk.org/cfaqs/
C FAQ: http://www.eskimo.com/~scs/C-faq/top.html
Korean Ver: http://cinsk.github.io/cfaqs/
음... 제가 시작 해도 될까요?
Python 버젼입니다.
print '\n'.join((''.join((x, y, z)) for x in ['a', 'b', 'c'] for y in ['1', '2', '3'] for z in ['A', 'B', 'C']))저도 한 번~
Perl codegolf 버젼
map{$a=$_;map{$b=$_;map{print"$a$b$_\n"}qw/A B C/}qw/1 2 3/}qw/a b c/;for$a(qw/a b c/){for$b(qw/1 2 3/){for(qw/A B C/){print"$a$b$_\n"}}}확장성 있는 Recursive 버젼
my @a = ([qw/a b c/],[qw/1 2 3/],[qw/A B C/]); print join('',@$_),"\n" for permute(@a); sub permute { my $last = pop @_; return map [$_], @$last unless @_; return map { my $left = $_; map [@$left, $_], @$last } permute(@_); }Perl 모듈을 사용한 확장성 있는 버젼
use Iterator::Array::Jagged; my @a = ([qw/a b c/],[qw/1 2 3/],[qw/A B C/]); my $iterator = Iterator::Array::Jagged->new( data=>\@a ); while ( my @set = $iterator->next ) { print join('',@set),"\n"; }덩달아 ruby
%w/a b c/.each { |i| %w/1 2 3/.each { |j| %w/A B C/.each { |k| puts "#{i}#{j}#{k}" } } }sub array 갯수 제한 없는 recursive 버전
x =[ %w/a b c/, %w/1 2 3/, %w/A B C/] def rec(arr, n, str) if ( n < (arr.length - 1)) arr[n].each { |c| rec(arr,n+1, "#{str}#{c}")} else arr[n].each { |c| puts " #{str}#{c} "} end end rec(x, 0, "")recursvie 버전 기계적으로 C로 변환
#include <stdio.h> #include <string.h> char arr[][3][2] = {{ "a", "b", "c" }, { "1", "2", "3" }, { "A", "B", "C" }}; int arr_size[] = {3, 3, 2}; /* arr[3][3][2] */ void rec(int n, char* str) { char temp_str[100] = ""; strncpy(temp_str, str, strlen(str)); int i = 0; if ( n < (arr_size[0] - 1)) { for (i = 0; i < arr_size[n]; i++ ) { strncpy(temp_str + strlen(str), arr[n][i], strlen(arr[n][i])); rec(n + 1, temp_str); } } else { for (i = 0; i < arr_size[n]; i++ ) { strncpy(temp_str + strlen(str), arr[n][i], strlen(arr[n][i])); printf("%s\n", temp_str); } } } int main() { rec(0, ""); return 0; }역시 script 언어가 최고심...
안돌려봤지만.. 서너
안돌려봤지만..
서너 줄이면 될거 같은데..
char a[][][]= {........}; for( i = 0; a[i] < a + sizeof(a); i++, printf( "\n" )) for( j = 0; a[i][j] < a[i] + sizeof(a[0]); j++ ) printf( "%c", a[i][j][0] );매그넘님께서char
매그넘님께서
char A[][][] = { { "a" , "b" , "c" } , {"1", "2", "3" } , { "A" , "B" , "C" } ... }이러한 배열안에 {"a", "b", "c"} 또는 {"1", "2", "3"}과 같은
중복되는 문자배열이 여러개 있다고 가정하고
이 형태로의 결과값만 나오게 하려면 중복되는 것을 제거해야 하는 로직이 들어가야 할거 같네요..
**********************
세상의 중심 kucuny.com
**********************
**********************
세상의 중심 kucuny.com
**********************
Haskell
Haskell 버전입니다.
--------------------Signature--------------------
Light a candle before cursing the darkness.
erlang
튜플만 만들어준다는... 출력은 알아서... ㅋㅋㅋ
[{X, Y, Z} || X <- [a, b, c], Y <- [1, 2, 3], Z <- ['A', 'B', 'C']].-----
오늘 나의 취미는 끝없는, 끝없는 인내다. 1973 法頂
-----
오늘 나의 취미는 끝없는, 끝없는 인내다. 1973 法頂
역시 패턴매칭은 강력하군요 .
단순 코드로만 보면 erlang보다 더 간단한 코드가 나올수 없을듯 합니다!
elang 보다 더 간단한 Perl 6
출력을 알아서 한다 치고 Perl 6 로 하면
참고:
http://search.cpan.org/perldoc?Magazine_Article_05#The_Cross_Operator
http://www.oreillynet.com/onlamp/blog/2007/12/yap6_operator_the_cross_operat.html
Haskell 로
Haskell 로 따라해봤습니다.
--------------------Signature--------------------
Light a candle before cursing the darkness.
erlang 갯수 제한 없는 버전
recursion이라 무제한은 아니겠네요.
per([H|T]) -> per(H, T, []). per([], _, []) -> ok; per([], _, [_|Result]) -> Result; per([Vh|Vt], [], Result) -> io:format("~w~n", [ lists:reverse([Vh|Result])]), per(Vt, [], Result); per([Vh|Vt], [Rh|Rt]=Rest, Result) -> per(Vt, Rest, per(Rh, Rt, [Vh | Result])).셸에서 쓰는것도 간편..
$ for a in {a..c}{1..3}{A..C}; do echo $a; done
a1A
a1B
a1C
a2A
a2B
a2C
a3A
a3B
a3C
b1A
b1B
b1C
b2A
b2B
b2C
b3A
b3B
b3C
c1A
c1B
c1C
c2A
c2B
c2C
c3A
c3B
c3C
댓글 달기