출처: http://agile.egloos.com/5774107
디브온에서 미니대안언어축제가 진행되던 M2 밖에 텍스트큐브 부스에서 재미있는 코드골프 문제 풀기가 있었습니다. 150자 이하로 푸신 분들에게는 즉석에서 제공되는 원두커피와 텀블러가 상으로 주어졌다고 합니다.
문제는 아래와 같습니다. 이 결과가 나와야 하는데 언어 제약은 없답니다.
*
*
* *
* *
* *
** **
* *
* *
* *
*
*
61개의 풀이가 있습니다.
파이썬입니다.
마름모를 출력하는 코드에서 힌트를 얻었습니다.
크기는 총 116바이트입니다. (두 번째 들여쓰기는 공백이 아닌 탭문자(\t)로 해야 116바이트가 나옵니다.)
r=range(-5,6)
for y in r:
l=""
for x in r:
a,b=abs(x),abs(y)
l+=(" ","*")[a+b==4or(5,0)in[(a,b),(b,a)]]
print l
여기에는 총 2가지의 파이썬 골프기교가 사용되었습니다. (저도 오늘 배웠습니다. ^^)
\t)문자(a,b)[조건식]: 조건식이 참인 경우 1 이되어 b, 조건식이 거짓인 경우 0 이되어 a참고 : 파이썬 골프 Tips
안녕하세요 python 2.7.6
4의숫자를 바꾸면 크기변경 가능하게 한줄로
print'\n'.join([[l[0]]+l+l[-2::-1]+[l[0]]for l in[[s[0]+s+s[-2::-1]+s[0]for s in[' '*(4-x)+'*'+' '*x for x in range(4+1)]]]][0])
128 바이트
띄어쓰기를 남기고 싶었지만.(158 바이트 ㅜ)
ㅡㅡ 추가 ㅡㅡ
다시 바이트로 하드코딩.
00100
01010
10001
01010
00100
이런식으로
s=[32,32,80,136,260,1539]
for x in s+s[-2::-1]:
o=''
while x:o+=x&1 and'*'or' ';x/=2
print o
99바이트
출력하는부분을 수정하면 더줄일수있겟는데 더 모르겟어요.
ㅡㅡ 추가 ㅡㅡ
bin() 의 존제를 알고 다시해봣지만.
s=[32,32,80,136,260,1539]
for x in s+s[-2::-1]:print ''.join([' *'[int(b)]for b in bin(x)[:1:-1]])
99바이트.
예전에 풀어봤던 문제네요. 루비 82자. 더 못 줄이겠던데 ㅜ
"FFtldӝdltFF".codepoints{|p|puts (p-64).to_s.gsub(/([0-9])/){" "*($1.to_i-1)+"*"}}
cat(" *\n *\n * *\n * *\n * *\n** **\n * *\n * *\n * *\n *\n *")
R입니다. 그냥 아무 생각 안하고 출력해봤습니다. 110자니까 간신히 원두커피와 텀블러는 받을 수 있었겠네요 ㅋㅋ
> cat(" *\n *\n * *\n * *\n * *\n** **\n * *\n * *\n * *\n *\n *")
*
*
* *
* *
* *
** **
* *
* *
* *
*
*
정가운데를 (0,0)인 직교좌표계로 생각하면 네 개의 대각선은 각각 기울기가 1, -1이고 y절편이 4 또는 -4인 직선으로 생각할 수 있습니다.
크기는 123바이트입니다.
r=-5..5
puts r.map{|y|
r.map{|x|
t=[x.abs,y.abs].minmax
t[1]<5&&[x-y,-x-y,-x+y,x+y].any?{|a|a==4}||t==[0,5]?'*':' '
}.join}
String a=" *";
for(int i=0;i<11;i++)
System.out.println(((i==5)?"*":((i>0)?" ":""))+a.substring((i<6)?i:((i<10)?10-i:1))+((i!=5)?((i>1&&i<9)?a.substring((i<5)?(8-2*i):(2*i-12)):""):" "+a+"*"));
자바로 196자입니다ㅠㅠ 원체 자바가 불리하네요 [수정] {}빼고 198자에서 196으로 줄였네요 ㅋㅋㅋ 사소한 한두바이트라도...ㅋㅋ
자바스크립트입니다.
function b(n){a="";while(--n)a+=" ";return a+"*";}e="\n",c=[b(6),b(6),b(5)+b(2),b(4)+b(4),b(3)+b(6)];alert(c.join(e)+e+"**"+b(8)+"*"+e+c.reverse().join(e))
156자 입니다. 도와주세요 ㅠㅠ
깊이 생각안하고 마구잡이로 하니 딱 150자나오네요.... 커피랑 텀블러만....
def p(x): print(x)
a=' '
b='*'
c='\n'
d=a*5+b
d=d+c+d
p(d)
L=[0]*3
for i in [0,1,2]:
L[i]=a*(4-i)+b+a*(2*i+1)+b
p(L[i])
p(b*2+a*7+b*2)
p(L[2]+c+L[1]+c+L[0])
p(d)
for i in range(-5,6):
k=abs(i)
s=' '*k+[' *','**'][k in[0,5]]+' '*(5-k)
print s[:-1]+s[-3::-1]
이번엔 좀 다르게..
for n in [1,1,2,4,8,48,8,4,2,1,1]:
s=''.join([(' ','*')[int(x)] for x in bin(n)[2:]])
print "%6s"%s+"%-s"%s[-2::-1]
이런 방법도..90 바이트
s='5 5 41 33 25'.split()
for l in s+'0070'+s[::-1]:print''.join(' '*int(n)+'*'for n in l)
s = '*'; mul = 20; k = 2*mul+1; i = range(-((k-1)//2), ((k-1)//2)+1)
for x in i:
x = -2*abs(x)+k-4
if x<0:print(' '*((k-1)//2)+s+' '*((k-1)//2))
elif x == k-4:print(s*2+' '*x+s*2)
else:print(' '*((k-2-x)//2)+s+' '*x+s+' '*((k-2-x)//2))
mul = 크기 입니다. 파이썬 3.5.1
150character만 사용해서 어떻게 해야하나 고민했었는데 그냥 단순히 출력하는 방법이있었군요! 다른 몇몇분들도 이렇게 하신 것 같습니다. 제 C++ code입니다.
#include <cstdio>
using namespace std;
int main(){
printf(" *\n *\n * *\n * *\n * *\n** **\n * *\n * *\n * *\n *\n *\n");
return 0;
}
Ruby
리스트 115 글자.
a = %w(5*5 5*5 4*1*4 3*3*3 2*5*2)
puts (a+%w(**8**)+a.reverse).map {|e|e.chars.map {|c|c>"*" ? " "*c.to_i : c}*''}
c언어
#include<stdio.h>
void main(){
printf(" *\n *\n * *\n * *\n * *\n** **\n * *\n * *\n * *\n *\n *");
}
javascript(ES6)
133 bytes
console.log([65,65,133,273,577,3587,577,273,133,65,65].map(v=>v.toString(2).slice(1).replace(/0/g," ").replace(/1/g,"*")).join("\n"))
그냥 찍는 것이 더 짧다는...
118 bytes
console.log(" *\n *\n * *\n * *\n * *\n** **\n * *\n * *\n * *\n *\n *");
좀더 고민해보고 더 줄였습니다.
91 bytes
console.log("5\n5\n41\n33\n25\n0070\n25\n33\n41\n5\n5".replace(/\d/g,$=>" ".repeat($)+"*"))
def s(s):
print(str(s.center(11)),end='\n')
a='*'
b='* *'
c='* *'
d='* *'
e='** **'
l=[a,a,b,c,d,e,d,c,b,a,a]
for i in l:
s(i)
public class CodeGolf {
public static void main(String[] agrs)
{
System.out.println(" *\n *\n * *\n * *\n * *\n** **\n * *\n * *\n * *\n *\n *\n");
}
}
파이썬 3.6
m,sl=1,['*']
print('*'.center(11))
for i in range(4):
s='*'
if i > 0:
s+=' '*m+'*'
m+=2
print(s.center(11))
sl.append(s)
print("** **")
sl.reverse()
for i in sl:print(i.center(11))
# 파이썬
f=range(-5,6)
for y in f:
l=""
for x in f:
x,y=abs(x),abs(y)
l+=(" ","*")[x+y==4or(5,0)in[(x,y),(y,x)]]
print(l)
a = ' '
b = '*'
c = '\n'
d = a*5+b+c
e = a*4+b+a+b+c
f = a*3+b+a*3+b+c
g = a*2+b+a*5+b+c
h = b*2+a*7+b*2+c
print(d+d+e+f+g+h+g+f+e+d+d)
a=' '*5
c=' '
d=' '
f='*'
g='\n'
h=a+f+g
i=' '*4+f+' '+f+g
j=(c+f)*2+g
k=d+f+a+f+g
l=f*2+' '*7+f*2+g
print(h+h+i+j+k+l+k+j+i+h+h)
for i in [32,32,80,136,260,1539, 260, 136, 80, 32, 32] :
print(bin(i)[2:].zfill(11).replace('1', '*').replace('0', ' '))
public class DivOn {
public static void main(String[] args) {
// TODO Auto-generated method stub
char[][] table = new char[11][11];
for(int i = 0; i< 11; i++){
for(int j=0; j < 11; j++){
if((i == 0 || i == 1 || i == 9 || i == 10) && (j == 5) ){
table[i][j] = '*';
}else if((i == 2 || i == 8) && (j == 4 || j == 6)){
table[i][j] = '*';
}else if((i == 3 || i == 7) && (j == 3 || j == 7)){
table[i][j] = '*';
}else if((i == 4 || i == 6) && (j == 2 || j == 8)){
table[i][j] = '*';
}else if(i == 5 && (j == 0 || j == 1 || j == 9 || j == 10)){
table[i][j] = '*';
}else{
table[i][j] = ' ';
}
}
}
for(int i=0; i< 11; i++){
for(int j = 0; j<11; j++){
System.out.print(table[i][j]);
}
System.out.println();
}
}
}
^^
package main
func main() {
a := " *\n *\n * *\n * *\n * *\n** **\n * *\n * *\n * *\n *\n *\n"
print(a)
}
public class DivOn {
public static void main(String[] args) {
// TODO Auto-generated method stub
char[][] table = new char[11][11];
for(int i = 0; i< 11; i++){
for(int j=0; j < 11; j++){
if((i == 0 || i == 1 || i == 9 || i == 10) && (j == 5) ){
table[i][j] = '*';
}else if((i == 2 || i == 8) && (j == 4 || j == 6)){
table[i][j] = '*';
}else if((i == 3 || i == 7) && (j == 3 || j == 7)){
table[i][j] = '*';
}else if((i == 4 || i == 6) && (j == 2 || j == 8)){
table[i][j] = '*';
}else if(i == 5 && (j == 0 || j == 1 || j == 9 || j == 10)){
table[i][j] = '*';
}else{
table[i][j] = ' ';
}
}
}
for(int i=0; i< 11; i++){
for(int j = 0; j<11; j++){
System.out.print(table[i][j]);
}
System.out.println();
}
}
}
150자 생각안하고 걍 풀었습니다. Python
n_additional = 3
n = 10
width = 2*n - 1 + n_additional*2
a = "*"
ans = list()
for i in range(n_additional):
ans.append("*".center(width, " "))
for i in range(n):
if i != n - 1:
ans.append((a+a[::-1][1:]).center(width, " "))
a += " "
else:
ans.append(("*"*n_additional+a+a[::-1][1:]+"*"*n_additional).center(width, " "))
print(*(ans+ans[::-1][1:]), sep="\n")
그냥 출력하면 150자 이하가 되네요.
public class test {
public static void main(String[] args) {
System.out.print(
" *\n *\n * *\n * *\n * *\n** **\n * *\n * *\n * *\n *\n *");
}
}
for i in range(-5,6):
for j in range(-5,6): x,y=abs(i),abs(j); print('*'if x+y==4or(x,y)in[(5,0),(0,5)]else' ',end='')
print()
C#
실행 가능한 최소한의 프로그램 구조(클래스 및 진입점)를 갖추면...
class P{static void Main(){System.Console.WriteLine(@" *
*
* *
* *
* *
** **
* *
* *
* *
*
*");}}
def func(st):
print(str(st.center(11)),end='\n')
a='*'
b='* *'
c='* *'
d='* *'
e='** **'
l=[a,a,b,c,d,e,d,c,b,a,a]
for i in l:
func(i)
for x in [0,1,2,3,4,3,2,1,0]:
a=(6-x-(1,2)[x==4])*' ',('*','**')[x==4]
print((' *\n *')if x==0 else(a[0]+a[1]+' '*(2*(x)-1)+a[1]+a[0]))
길가의님의 풀이를 보고 새로운 삼항연산자같이 쓰는 방법을 알게 되었습니다.
치사하게 딱 150 글자로 맞췄습니다.
150자는 넘지만.. 좋은 방법 배워갑니다.
l=[' '*5+'*']
for i in range(0,4):
s=''
for j in range(0,11):
s+=(" ","*")[i+j==5 or j-i==5]
l.append(s)
print('\n'.join(l))
print('** **')
l.reverse()
print('\n'.join(l))
class Program
{
static void Main(string[] args)
{
Console.WriteLine(" *\n * *\n * *\n * *\n** **\n * *\n * *\n * *\n *\n");
}
}
r = range(5, -6)
for x in r:
l = ''
for y in r:
a, b = abs(x), abs(y)
l += (' ', '*')[a+b==4 or (5,0) in [(a,b), (b,a)]]
print(l)
for i in range(-5,6):
s=""
for j in range(-5,6):
q,w=abs(j),abs(i)
s+=(" ","*")[q+w==4 or (5,0) in [(q,w),(w,q)]]
print (s)
각각의 행들과 인덱스를 분석하여 규칙성을 찾는데 주로 시간을 들였던것 같읍니다. 더욱이 삼항연산자또한 알게되어서 매우 유익한 문제였읍니다.
그러나 가장 간단하며 경품까지 받을 수 있는 풀이는...
print('''
*
*
* *
* *
* *
** **
* *
* *
* *
*
*
''')
의외로 103~110자 정도 나와서 150자를 안 넘더군요...;; 심지어 전자의 풀이보다 글자수가 더 적읍니다..
print(" *\n *\n * *\n * *\n * *\n** **\n * *\n * *\n * *\n *\n *")
딱 이 모양만 출력하면 된다는 점과 제 코딩 실력을 생각하면....ㅠㅠㅠㅠ 이게 최선인것 같아요
python3
r = [ ]
for i in range(5):
o = [' ']*(5*2+1)
o[5-i] = '*'
o[5+i] = '*'
r.append(o)
r[5-1][0] = '*'
r[5-1][-1] = '*'
for o in [r[0], *r, *r[-2::-1], r[0]]:
print(''.join(o))
단어 수: 33
문자 수(공백 제외): 140
r=range(-5,6)
for y in r:
l =''
for x in r:
x,y=abs(x),abs(y)
l+='*' if x+y==4or((x,y)in((5,0),(0,5))) else ' '
print(l)
for i in range(-5,6):
s=""
for j in range(-5,6):
q,w=abs(j),abs(i)
if q+w == 4 or (5,0) in [(q,w),(w,q)]:
s+=("*")
else:
s+=(" ")
print(s)
def tree(number):
num = int(number)
result = []
result_print = []
idx = int(num/2)
for i in range(num):
result.append(' ')
result[idx] = '*'
result.insert(0,' ')
result_print.append(''.join(result))
result = [' ' for i in range(num)]
for i in range(num+1):
idx1 = idx + i
idx2 = idx - i
if idx1 >= num:
if idx1 == num:
idx1 = num - (i - idx)
idx2 = num - idx1 - 1
result[idx1] = '*'
result[idx2] = '*'
result.insert(0,'*')
result.insert(-1,'*')
result_print[-1] = ''.join(result)
result = [' ' for i in range(num)]
continue
idx1 = num - (i - idx)
idx2 = num - idx1 - 1
result[idx1] = '*'
result[idx2] = '*'
result.insert(0,' ')
result_print.append(''.join(result))
result = [' ' for i in range(num)]
result[idx] = '*'
result.insert(0,' ')
result_print.append(''.join(result))
for a in result_print:
print(a)
tree(7)
def a():
print(' *')
def b(x):
print(' '*(5-x)+'*'+' '*(2*x-1)+'*')
a()
a()
b(1)
b(2)
b(3)
print('**'+' '*7+'**')
b(3)
b(2)
b(1)
a()
a()
r=range(11)
for i in r:
l=""
a = i - 4
for j in r:
if(i % 5 == 0 and j % 5 ==0 and abs(i - j) == 5 ): l+="*"
elif((0< i < 6 and (j == 6 - i or j == 4 + i)) or (5 < i < 10 and (j == a or j == 10 - a))): l+="*"
else:l+=" "
print(l)
150자 못만들겠습니다.. 텀블러는 못 받겠군요.
r=range(-5,6)
for y in r:
l=""
for x in r:
a,b=abs(x),abs(y)
l+=(" ","*")[a+b == 4 or (5,0) in [(a,b),(b,a)]]
print(l)
추천답안 써보면서 연습했는데 삼항연산자도 신기하고 배울점이 정말 많네요 ㅜ
#codingdojing_daum_divon_re
#다른 사람들 코드를 참고.
"""
0b00000100000 = 32
0b00001010000 = 80
0b00010001000 = 136
0b00100000100 = 260
0b11000000011 = 1539
"""
#1
s = [32, 32, 80, 136, 260, 1539]
OX = str.maketrans('10','* ')
for x in s+s[-2::-1]:
print((bin(x)[:-7:-1]+bin(x)[-5:]).translate(OX))
#2
s = [32, 32, 80, 136, 260, 1539]
for x in s+s[-2::-1]:
print((bin(x)[:-7:-1]+bin(x)[-5:]).replace('1','*').replace('0',' '))
#3 1의 자리를 앞으로 보내는 개념, 풀이랑 동일버젼.
s = [32, 32, 80, 136, 260, 1539]
for x in s+s[-2::-1]:
o=''
while x:
o+=' *'[x&1]
x//=2
print (o)
#4 수정해보자, 2를 조금 바꾸어서 뒤집는다고 생각 굳이 뒷부분을 더할필요가 없네.
s = [32, 32, 80, 136, 260, 1539]
for x in s+s[-2::-1]:
print(bin(x)[:1:-1].translate(str.maketrans('10','* ')))
추천 풀이를 활용하여 조금씩 변형해보았습니다.
python 2.7
for i in range(-5,6):
a=2 if i==0 else 1
t=-abs(2*i)+7
print('{:^11}'.format('*')) if t<0 else '{:^11}'.format("*"*a+" "*t+"*"*a)
141byte 조건부 표현식과 포매팅을 이용했습니다. python 3버전에서는 f 문자열 포매팅을 이용해서 살짝 더 짧아질 수는 있겠네요. 그래도 print함수만 사용한것보다는 길다는...ㅠㅠ
for i in range(-5,6): a=abs(i) b='{0}{1}{2}{1}'.format if a>3: print(" ") elif i==0: print(b(" "0,""2," "7)) else: print(b(" "(a+1),""," "(7-2*a)))
공백 제외 142byte
def code_golf(_string):
for i in _string:
print(" " * int(i),end='*')
print("")
for i in ["5","5","41","33","25","0070","25","33","41","5","5"]:
code_golf(i)
a='00123432100'
b='91234567899'
for i in a:
print(''.join([[' ','*'][abs(5-int(x)) == abs(int(i)%5)] for x in b]))
# 윗 분들의 풀이를 참조하여
R = [5,4,3,2,1,0]
for r in R+R[-2::-1]:
z = ''
for c in R+R[-2::-1]:
z += (' ','*')[r+c==4 or (r,c) in [(0,5),(5,0)]]
print(z)
JAVA입니다. 아무리 짧게 만들려고 해도 한계가 있네요;;
package question4.다음_디브온_코드골프_문제;
public class Main {
public static void main(String[] args) {
char[][] cs = new char[11][11];
cs[0][5] = '*';cs[5][0] = '*';cs[10][5] = '*';cs[5][10] = '*';
for (int i = 1; i <= 5; i++) {cs[6-i][i] = '*';cs[6-i][10-i] = '*';cs[4+i][10-i] = '*';cs[4+i][i] = '*';}
for (char[] cr : cs) {
for (char c : cr) {
System.out.print(c);
}
System.out.println("");
}
}
}