새로운 코드골프 문제가 나왔습니다

leonid의 이미지

*Grid Computing*

http://codegolf.com/grid-computing

codegolf.com에서 약 200일만에 드디어 새로운 문제가 튀어나왔군요.. ㅎㅎ

제가 좋아하는 간단한 문제입니다! (복잡한걸 싫어함..)

문제의 내용은 이렇습니다..

01 34 46 31 55 21 16 88 87 87
32 40 82 40 43 96 08 82 41 86
30 16 24 18 04 54 65 96 38 48
32 00 99 90 24 75 89 41 04 01
11 80 31 83 08 93 37 96 27 64
09 81 28 41 48 23 68 55 86 72
64 61 14 55 33 39 40 18 57 59
49 34 50 81 85 12 22 54 80 76
18 45 50 26 81 95 25 14 46 75
22 52 37 50 37 40 16 71 52 17

와 같이 10*10의 숫자들을 받습니다. 각 숫자들은 0~99 사이의 수이며, 0-padding이 되어있습니다.

이 배열의 각 행 또는 각 열들의 숫자를 전부 더한 수들 중 가장 큰 수를 출력하면 됩니다.

위의 배열의 경우, 8번째 열 (88, 82, 96, ... 14, 71)을 전부 더한 수 615가 가장 큰 수로 정답이 됩니다.

이번 문제 역시 perl이 강세를 보이고 있네요. 현재 perl 1위는 53B, ruby 1위는 63B입니다.

저의 현재 기록은 ruby로 75B입니다. (ruby부문 5위)

여러분도 한번 도전해보세요~ ㅎㅎ

7339989b62a014c4ce6e31b3540bc7b5f06455024f22753f6235c935e8e5의 이미지

간만에 문제가 나와서 재미있게 풀었습니다.
파이썬 코드 중에서 6위네요. 2바이트 어떻게 줄이지... ㅠㅠ

comkid의 이미지

Perl도 모르고.. PHP도 모르고.. ruby도 몰라서..
그나마 요즘 공부 중인 erlang으로 짜봤습니다..

아무래도 pattern matching을 사용하다보니 일정 수준 이상으로는 못 줄이겠네요.. =0=;;
로직 정해지고는 거의 빈칸, 줄바꿈 제거와 변수, 함수 이름 줄이기 신공..-_-;
그래도 367B라는..on_

가독성은 아웃 오브 안중..-_-;

-module(gc).
-export([f/0]).
f() -> X=r(10),io:format("~p~n", [max(X)]).
r(0) -> [];
r(N) -> {ok,L}=io:fread('', "~d~d~d~d~d~d~d~d~d~d"), [L|r(N-1)].
max(L) -> lists:max(sr(L) ++ sc(L)).
sr(L) -> [s:sum(X) || X <- L].
sc([H|T]) -> sc( T, H ).
sc([],A) -> A;
sc([H|T],A) -> se(H,A), sc(T,se(H,A)).
se([],_) -> [];
se([A|B],[X|Y]) -> [A+X|se(B,Y)]. 

실행은..(죄송합니다.. 윈도우예요..ㅠ_ㅠ)

E:\Programming\Erlang>erlc gc.erl
 
E:\Programming\Erlang>erl -noshell -s gc f -s init stop
01 34 46 31 55 21 16 88 87 87
32 40 82 40 43 96 08 82 41 86
30 16 24 18 04 54 65 96 38 48
32 00 99 90 24 75 89 41 04 01
11 80 31 83 08 93 37 96 27 64
09 81 28 41 48 23 68 55 86 72
64 61 14 55 33 39 40 18 57 59
49 34 50 81 85 12 22 54 80 76
18 45 50 26 81 95 25 14 46 75
22 52 37 50 37 40 16 71 52 17
615

[/]

Have a good day!

pung96의 이미지

perl로 57자 까지는 줄였는데 여기서 더 줄이는건 알고리즘을 바꿔야만 가능할 것 같군요. 일단 포기!!

7339989b62a014c4ce6e31b3540bc7b5f06455024f22753f6235c935e8e5의 이미지

일단 파이썬으로 76바이트 미만은 무리인 것 같으니 코드를 올려봅니다. (zip 함수 킹왕짱!)

T=[map(int,raw_input().split())for x in[0]*10]
print max(map(sum,T+zip(*T)))
다즐링의 이미지

아악 -_-;;
114바이트 버젼;

import os
k=map(int,os.read(0,300).split())
print max([max(sum(k[10*x:10*-~x]),sum(k[x::10]))for x in range(10)])

-------------------------------------------------------------------------------------------------------
Life ... http://iz4u.net/blog/

------------------------------------------------------------------------------------------------
Life is in 다즐링

ktd2004의 이미지

최근에 파이썬을 공부하고 있는 중입니다.
질문하나 드려도 될까요? ^^;

다음 코드에서

print max(map(sum,T+zip(*T)))

"*T"를 zip 함수에 전달하는 "zip(*T)"의 의미가 무엇인지 알려주시면 감사하겠습니다.

동작은 다음과 같은 것을 확인했는데.

>>> T = [[1,2,3],[4,5,6],[7,8,9]]
>>> zip(*T)
[(1,4,7), (2,5,8), (3,6,9)]

어떻게 저 결과가 나오는지 잘 이해가 되지 않네요.
미리 답변 감사드립니다. ^^;

7339989b62a014c4ce6e31b3540bc7b5f06455024f22753f6235c935e8e5의 이미지

리스트나 튜플을 담고 있는 변수 앞에 *을 붙이면 그 시퀀스의 값을 함수 인자로 사용하게 됩니다. 이런 식이지요.

def f(a, b, c):
  print a + b + c
 
args = [1, 2, 3]
f(*args) # prints 6
ktd2004의 이미지

오호!..

가변 인수 리스트를 역으로 사용하는 방법이군요.
역시 책에서 공부하는 것과 실제 응용하는 것은 천지차이군요.

친절한 답변 감사합니다.

nakada의 이미지

파이썬 76이 엄청 많길래 저기에 먼가 비밀이 잇나보다 하고
막 줄이고 줄였는데..
76코드와 제꺼가 거의 똑같네요
제꺼 78과의 차이점은 .. in다음에 한칸뛰어쓰기였네요 ㅠ.ㅜ
그런데 띄어쓰기 하나가 2바이트 차이가 나는걸까요?
새로운 74바이트 코드가 등장했던데..
도대체 더이상 줄일수가 없어보이던데.. 참 대단하신것 같아요

mrhjkim의 이미지

입력을 여러번(10) 받기 위해 for 문을 돌리시는거 같은데 map 뒤에 어떻게 저런 식으로 올수 있는건가요? 파이썬을 대충써서 저렇게 사용되는걸 본적이 없네요^^; 참고할 만한 부분이 있으면 알려주시면 고맙겠습니다.

7339989b62a014c4ce6e31b3540bc7b5f06455024f22753f6235c935e8e5의 이미지

List Comprehensions에 대해 알아보시기 바랍니다.
http://docs.python.org/tut/node7.html#SECTION007140000000000000000

leonid의 이미지


루비로 71B까지 줄였습니다. 현재 루비 4위 -_-ㅋ

63B까지 갈 길이 멀군요.. 흐미

juneaftn의 이미지

34 바이트

1!:2&2":>./(+/,+/"1)".];._2(1!:1)3

cleol의 이미지

호오... 상당히 컴팩트하군요. J 언어 홈페이지를 찾아가서 대충 살펴봤는데 수치 데이터 처리에 적합해 보입니다. 혹 일반적인 어플리케이션 개발에도 쓸 만 한가요? GUI 빌더도 제공한다는 것으로 보아서는 그럴 것 같은데 코드 샘플을 찾지는 못했네요. 간단한 어플리케이션의 코드를 살펴볼 수 있으면 좋을텐데 말입니다.

익명 사용자의 이미지

익명 사용자의 이미지

]은 없어도 될 듯 합니다.

익명 사용자의 이미지

한줄만 쓰면 되는 상용 컴퍼넌트를 구입한다.

calMatrix.read().maxValue;

재미없죠? -_-;

leonid의 이미지

루비 71바이트에서 막혀버렸네요 -_-;;

도저히 줄어들 생각을 안함..

저랑 합작하실 분 없나요 ㅎㅎ

-----------------------------

오오 어쩌다가 66바이트까지 줄여버렸습니다 -_-ㅋㅋ

현재 루비 3위(공동2위)입니다 ㅎㅎ

lifthrasiir의 이미지

쉬운 문제일 수록 줄이기 어렵더군요... 76바이트까지 가는 데 몇십분 밖에 안 걸렸는데 거기서 한참 고민해도 안 되어서 좌절하다가, 히로 스즈키 씨가 74바이트를 올려서 다시 좌절했습니다. :(

어떤 분은 78바이트에서 막히신 듯 한데, 사실 이런 문제는 리스트 조작을 잘 하는 게 관건입니다. 짧은 코드일 수록 map과 zip의 사용이 두드러지는 이유도 여기에 있습니다.

nakada의 이미지

음냥; 그 어떤분이 저였습니다.;

방금 보니깐 74바이트에 도달하셧던데 +_+

좀더 많은 고민을 해봐야겠네요

aero의 이미지

전 Perl로 63바이트 까지 갔습니다만 순위권에도 못 드는군요 - -;

위에 pung96님은 perl로 53바이트 까지 가셔서 순위권에 등극하셨군요 :)

pung96의 이미지

지금 1위가 45글자인데, 도저히 상상조차 되지 않는군요. 설마 print `wget mypage` 같은걸 하는건 아니겠지요?

jg의 이미지

싸이트 내에 모듈이라도 짜둔 게 아닐까요? =_=
아무튼 순위권 등극 축하드립니다.

$Myoungjin_JEON=@@=qw^rekcaH lreP rehtonA tsuJ^;$|++;{$i=$like=pop@@;unshift@@,$i;$~=18-length$i;print"\r[","~"x abs,(scalar reverse$i),"~"x($~-abs),"]"and select$good,$day,$mate,1/$~for 0..$~,-$~+1..-1;redo}

jg의 이미지

저는 오랜만에 도전해서 엄청 헤맸습니다..
요즘에는 도통 perl을 만질 수가 없었거든요.
62바이트로 일단 마감해야겠네요.

@ 답에 \n 을 찍을 필요가 없더군요. ;)
--
우선 60바이트로 마감을..
적어도 3바이트를 줄여야 순위권이군요;;
45, 47바이트는 대체.. 궁금해서 자꾸 신경쓰이는군요. ㅜ.ㅜ

$Myoungjin_JEON=@@=qw^rekcaH lreP rehtonA tsuJ^;$|++;{$i=$like=pop@@;unshift@@,$i;$~=18-length$i;print"\r[","~"x abs,(scalar reverse$i),"~"x($~-abs),"]"and select$good,$day,$mate,1/$~for 0..$~,-$~+1..-1;redo}

pung96의 이미지

47글자 까지는 줄였는데 다시 여기서 막히는 군요, ^^

jg의 이미지

간만에 풀어보는군요.. 사실 이 문제를 풀려고 시도했다는 사실조차 잊고 있었습니다.
문법을 조금 바꾸니 59바이트까지는 나오네요.
그 이상은 *문제만 푸는* 코드가 필요한 것 같습니다.
정말 재밌긴 한데.. 시간이...;;

$Myoungjin_JEON=@@=qw^rekcaH lreP rehtonA tsuJ^;$|++;{$i=$like=pop@@;unshift@@,$i;$~=18-length$i;print"\r[","~"x abs,(scalar reverse$i),"~"x($~-abs),"]"and select$good,$day,$mate,1/$~for 0..$~,-$~+1..-1;redo}

oneday의 이미지

이거 입력이 어떻게 되는건가요.
php로 하나 짜서 200바이트 정도 되길래 올려볼려고 했는데(첨이라서 참가에 의미를;;;;)
입력이 어떻게 넘어오는지 모르겠네요.

그냥 파일로 넘어오는건지 아니면 텍스트 베이스 인수로 넘어오는건지
애매하네요.. -_-

pung96의 이미지

Standard Input입니다.

oneday의 이미지

실패했습니다.ㅠ.ㅜ
윈도우에서는 php -n my.php < data.txt 형식으로 해서
정답이 나오는데 코드골프에 올려보니 죄다 0으로 나와있네요.
쩝.. 그러고보니 리눅스에서 항상 파일만 읽다보니 표준입출력은
php로 다뤄본 기억이 없군요. ㅎㅎㅎ

머 오늘은 일단 퇴근하는걸로 -_-;;

답변 감사합니다.

pung96의 이미지

-n옵션을 쓰지 못하는 것 아닐까요?

oneday의 이미지

해결했습니다.
표준입력 받는 방식의 문제더군요. -_-ㅋ

현재 199바이트로 php34위입니다. 푸하하하;;;

분명히 제가 모르는 함수가 있을듯 한데 찾지를 못하겠네요 ㅠ.ㅜ
1위 소스 한번 보고싶다....

number3의 이미지

계산하는 부분만 아무리 해도 100바이트이던데, 입출력을 어떻게 처리할지 몰라서..
대략 입력받은 것을 $a 배열에 넣었다고 가정하고..

$b=split(" ",$a);
for($i=0;$i<100;$i++){
$s[$i/10]+=$b[$i];$t[$i%10]+=$b[$i];
}
$m=max(max($s),max($t));

이렇게 하면 100바이트던데.. 이렇게 올리면 대략 30등 수준이겠는데,
도저히 67바이트는 방법이 생각이 안 나네요.
php 변수가 $가 붙으니 많이 불리한데.. 코드상에 16개나 되는데..
$를 줄이고, 덧셈배열을 하나로 만들면 될텐데
아무래도 발상의 전환이 필요할 듯 하네요. ^^;

혹시 좋은 생각 있으시면 공유하자는 뜻에서, 펄이나 파이선만큼은 아니더라도.. 올립니다
더 좋은 코드 부탁드립니다. 머리 아픕니다. 흑흑..
저도 1위 소스 한번 보고 싶습니다. 그럼 도를 깨우칠 듯.
그런데 안 보여주나요? 소스는?

oneday의 이미지

<?for(;$v[$i]=fread(STDIN,3);$m[$i%10]+=$v[$i],$m[$i/10+10]+=$v[$i++])?><?=max($m);

현재 제능력으로는 여기까지가 한계입니다. -0-;

number3의 이미지

<?for(;$v=fread(STDIN,3);$m[$i%10]+=$v,$m[$i/10+10]+=$v,$i++);echo max($m);?>

합계를 구할 때 $v[$i]가 필요없어서 $v로 변경했습니다.
이제 10byte만 줄이면 되는군요.
아무래도 덧셈을 하나로 만들면 될 거 같은데..

좋은 아이디어 감사드립니다.

oneday의 이미지

<?for(;$v=fread(STDIN,3);$m[$i%10]+=$v,$m[$i++/10+10]+=$v)?><?=max($m);

더이상 어케할지 모르겠던데 하다보니 계속 줄어들긴 하네요.. -0-;

number3의 이미지

저는 한계인 듯, 아무리 봐도 어떻게 줄일 수 있을 지 모르겠네요.
이제 4바이트 줄이면 되는데, 가능할까요?

이럴 수록 1등의 코드가 궁금하네요. 도대체 어떻게 그렇게 할 수 있을런지.. 쩝.

number3의 이미지

줄이다 보니 이제 제대로 된 것인가 그렇네요.
이메일이 블럭되어서 가입이 안되서 확인은 안되는데, 테스트는 잘 됩니다.

67바이트 전이 70바이트였는데, 그때 한바이트 줄이기 위해서 타입캐스팅을 악용(!)했습니다.
<?for(;$v=fread(STDIN,3);$m[$i/10]+=$v,$m[A.$i++%10]+=$v)?><?=max($m);

나머지 3byte는 assign을 악용(?)해서 처리하면 됩니다.
일주일동안 꿈속에 4바이트 때문에 미치는 줄 알았는데..
1등 코드만큼 풀고 나니 좀 허망하네요.

--------------------
역시나 악용은 악용이군요.
95 68 69 48 02 10 52 28 74 41
77 59 71 83 00 59 57 72 03 10
77 32 51 50 93 43 84 67 51 29
91 60 60 86 39 56 07 32 69 78
39 89 28 98 23 19 76 77 92 15
52 42 20 06 24 15 02 11 37 50
21 37 92 28 57 84 20 65 28 86
00 07 89 55 81 03 26 96 09 09
59 19 09 26 98 31 99 13 81 99
75 13 87 77 07 56 70 22 70 12

8번째줄 00에서 루프가 죽어버리면 끝나버리네요.
586이 나와야 하는데, 576이 나와서.. 헐..

위에 있는 코드는 동작하는데, assign을 수정한 코드는 이 앞쪽에 0이 나오면 동작을 안하네요
아마도 typecasting, 연산자 우선순위 등과 관계가 있는 듯..
쩝.. 이제 포기해야할때인가..

sjpark의 이미지

해보려고 했으나, 일단, main 함수 뼈다귀만 써도.. -_-;

http://nicesj.com

gimmesilver의 이미지

(sequence$replicate 10 getLine)>>=(\x->print$(\l->maximum$map sum$l++List.transpose l)$map((map read).words)x)

112bytes 네요...
기본적인 알고리즘은 위에 있는 python 소스와 동일한데 모나드나 타입 처리를 위한 추가 작업이 있다보니 소스가 길어졌습니다...

------------------------
http://agbird.egloos.com

------------------------
http://agbird.egloos.com

memming의 이미지

load a;max([sum(a),sum(a')])

28 bytes! (but it's from a file named 'a', not from stdin. There's no way to get stdin in MATLAB?)

사랑천사의 이미지

음.. 코드골프라는 말을 KLDP에서 많이 본 터라 뭐 하는 건가.. 했더니 문제를 풀기 위해서 프로그램을 만드는데.. 최대한 짧은 코드를 만들어야 등수가 올라가는 무서운 개임이군요... 이런... 근데 대부분 문제가 수학 문제일 거 같은데...

아무튼... 저는 수학 문제를 푸는 것은 흥미가 없어서... 어떤 분야이든... (역시 프로그래머가 되기는 그른 듯...) 별로 안 땡기는 군요. 근데 대단들 하십니다. 왠지 달인들을 보는 느낌이랄까요
----
Lee Yeosong(이여송 사도요한)
E-Mail: yeosong@gmail.com
HomePage: http://lys.lecl.net:88/
Wiki(Read-Only): http://lys.lecl.net:88/wiki/
Blog: http://lys.lecl.net:88/blog
MSN: ysnglee2000@hotmail.com
----
절이 싫으면 중이 떠나는 것이 아니라, 절이 싫으면 중이 절을 부숴야 한다.

사람천사