줄 바꿈이없는 Scala 494 줄 바꿈이있는 520 :
def k(i:Int,d:Int=0):(Int,Int)=if(i<(7-d))(d,i+1)else k(i-(7-d),d+1)
def t(i:Char)=(if(i=='y')i-4 else
if(i=='z')i+2 else
if(i=='j')i+14 else
if(i>='v')i+3 else
if(i>'i')i-1 else i)-'a'
def q(p:(Int,Int),i:Int,c:Char)=if(p._1==i||p._1+p._2==i)""+c else" "
def g(r:Int,c:Char)={val p=k(t(c.toLower))
print((r match{case 1=>q(p,3,'\\')+q(p,4,'|')+q(p,5,'/')
case 2=>q(p,2,'-')+"o"+q(p,6,'-')
case 3=>q(p,1,'/')+q(p,0,'|')+q(p,7,'\\')})+" ")}
for(w<-readLine.split(" ")){println;for(r<-(1 to 3)){w.map(c=>g(r,c));println}}
언 골프 :
def toClock (i: Int, depth: Int=0) : (Int, Int) = {
if (i < (7 - depth)) (depth, i+1) else toClock (i - (7-depth), depth + 1)}
def toIdx (i: Char) = {
(if (i == 'y') i - 4 else
if (i == 'z') i + 2 else
if (i == 'j') i + 14 else
if (i >= 'v') i + 3 else
if (i > 'i') i - 1 else i ) - 'a'}
def p2c (pair: (Int, Int), i: Int, c: Char) = {
if (pair._1 == i || pair._1 + pair._2 == i) ""+c else " "
}
def printGrid (row: Int, c: Char) = {
val idx = toIdx (c.toLower)
val pair = toClock (idx)
row match {
case 1 => { print(
p2c (pair, 3, '\\') +
p2c (pair, 4, '|') +
p2c (pair, 5, '/') + " ")
}
case 2 => { print(
p2c (pair, 2, '-') + "o" +
p2c (pair, 6, '-') + " ")
}
case 3 => { print(
p2c (pair, 1, '/') +
p2c (pair, 0, '|') +
p2c (pair, 7, '\\') + " ")
}
}
}
val worte = "This is Code Golf"
(1 to 3).map (row => {worte.map (c => printGrid (row, c));println})
설명:
나는 시계 패턴을 관찰했지만 12 시간은 아니었지만 8 시간이었습니다. 그리고 시작 시간은 0입니다.
플래그 1과 2는 구별 할 수 없으므로 첫 번째 플래그에 대해 더 낮은 숫자로 모든 조합을 정렬 할 수 있습니다. 불행히도, j가 i를 따르지 않지만 k, l, m을 따르고 나중에 엉망이되면 처음부터 좋은 순서가 방해받습니다.
따라서 매핑을 위해 키를 재정렬합니다.
val iis = is.map {i =>
if (i == 'y') i - 4 else
if (i == 'z') i + 2 else
if (i == 'j') i + 14 else
if (i >= 'v') i + 3 else
if (i > 'i') i - 1 else i }.map (_ - 'a')
iis.zipWithIndex .sortBy (_._1) .map (p => (p._1, ('a' + p._2).toChar))
Vector((97,a), (98, b), (99, c), (100,d), (101,e), (102,f), (103,g),
(104,h), (105,i), (106,k), (107,l), (108,m), (109,n),
(110,o), (111,p), (112,q), (113,r), (114,s),
(115,t), (116,u), (117,y), -------
------- (120,j), (121,v),
(122,w), (123,x),
(124,z))
모든 문자에서 'a'를 빼면 (0에서 7 + 6 + 5 + ... + 1)의 숫자를 얻습니다. 캐릭터 그리드의 숫자를 매핑 할 수 있습니다
3 4 5 \ | / |
2 6 - o - - o - o
1 0 7 / | \ (2, ) (2,2)
두 숫자 쌍은 두 플래그를 맵핑 할 수 있습니다. 첫 번째 숫자는 첫 번째 플래그의 경우 0에서 6까지의 색인이고 두 번째 플래그는 두 번째 플래그의 경우 1에서 7 사이의 숫자가 아니라 두 플래그의 거리입니다. 먼저 두 번째 플래그. (2,2)는 첫 번째 플래그는 서쪽이고 두 번째 플래그는 시계 방향에서 북쪽으로 두 단계입니다.
def toClock (i: Int, depth: Int=0) : (Int, Int) = {
if (i < (7 - depth)) (depth, i+1) else toClock (i - (7-depth), depth + 1)}
Vector( (0,1), (0,2), (0,3), (0,4), (0,5), (0,6), (0,7),
(1,1), (1,2), (1,3), (1,4), (1,5), (1,6),
(2,1), (2,2), (2,3), (2,4), (2,5),
(3,1), (3,2), (3,3),
(4,2), (4,3),
(5,1), (5,2),
(6,1))