1
/* acrostic-board-dimensions.c
2
 *
3
 * Copyright 2024 Tanmay Patil <tanmaynpatil105@gmail.com>
4
 *
5
 * This library is free software; you can redistribute it and/or
6
 * modify it under the terms of the GNU Lesser General Public
7
 * License as published by the Free Software Foundation; either
8
 * version 2.1 of the License, or (at your option) any later version.
9
 *
10
 * This library is distributed in the hope that it will be useful,
11
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
13
 * Lesser General Public License for more details.
14
 *
15
 * You should have received a copy of the GNU Lesser General Public
16
 * License along with this library; if not, write to the Free Software
17
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
18
 *
19
 * SPDX-License-Identifier: (LGPL-2.1-or-later OR MIT)
20
 */
21

            
22
#include "libipuz-config.h"
23
#include "ipuz-acrostic.h"
24
#include "acrostic-board-dimensions.h"
25

            
26

            
27
/*
28
 * @Algorithm used to generate dimensions:
29
 *
30
 *  def generate_dimensions (quote_length):
31
 *    RATIO = 1.6
32
 *    m, n = 0, 0
33
 *    MINI = math.inf
34
 *
35
 *    for height in range (1, quote_length + 1):
36
 *      middle = math.floor (height * RATIO)
37
 *
38
 *      for width in range (middle - 1, middle + 2):
39
 *        area = width * height
40
 *
41
 *        if (area >= quote_length) and abs (quote_length - area) < MINI:
42
 *          MINI = abs(quote_length - area)
43
 *          m = width
44
 *          n = height
45
 *
46
 *  return m, n
47
 *
48
 */
49

            
50
static AcrosticBoardDimension dimensions[IPUZ_ACROSTIC_MAX_QUOTE_STR_LENGTH] = {
51
  {1, 1},  {2, 1},  {2, 2},  {2, 2},  {3, 2},  {3, 2},
52
  {4, 2},  {4, 2},  {3, 3},  {4, 3},  {4, 3},  {4, 3},
53
  {5, 3},  {5, 3},  {5, 3},  {5, 4},  {5, 4},  {5, 4},
54
  {5, 4},  {5, 4},  {6, 4},  {6, 4},  {6, 4},  {6, 4},
55
  {7, 4},  {7, 4},  {7, 4},  {7, 4},  {7, 5},  {7, 5},
56
  {7, 5},  {7, 5},  {7, 5},  {7, 5},  {7, 5},  {8, 5},
57
  {8, 5},  {8, 5},  {8, 5},  {8, 5},  {9, 5},  {9, 5},
58
  {9, 5},  {9, 5},  {9, 5},  {8, 6},  {8, 6},  {8, 6},
59
  {9, 6},  {9, 6},  {9, 6},  {9, 6},  {9, 6},  {9, 6},
60
  {10, 6},  {10, 6},  {10, 6},  {10, 6},  {10, 6},  {10, 6},
61
  {10, 7},  {10, 7},  {10, 7},  {10, 7},  {10, 7},  {10, 7},
62
  {10, 7},  {10, 7},  {10, 7},  {10, 7},  {11, 7},  {11, 7},
63
  {11, 7},  {11, 7},  {11, 7},  {11, 7},  {11, 7},  {12, 7},
64
  {12, 7},  {12, 7},  {12, 7},  {12, 7},  {12, 7},  {12, 7},
65
  {11, 8},  {11, 8},  {11, 8},  {11, 8},  {12, 8},  {12, 8},
66
  {12, 8},  {12, 8},  {12, 8},  {12, 8},  {12, 8},  {12, 8},
67
  {13, 8},  {13, 8},  {13, 8},  {13, 8},  {13, 8},  {13, 8},
68
  {13, 8},  {13, 8},  {13, 9},  {13, 9},  {13, 9},  {13, 9},
69
  {13, 9},  {13, 9},  {13, 9},  {13, 9},  {13, 9},  {13, 9},
70
  {13, 9},  {13, 9},  {13, 9},  {14, 9},  {14, 9},  {14, 9},
71
  {14, 9},  {14, 9},  {14, 9},  {14, 9},  {14, 9},  {14, 9},
72
  {15, 9},  {15, 9},  {15, 9},  {15, 9},  {15, 9},  {15, 9},
73
  {15, 9},  {15, 9},  {15, 9},  {15, 10},  {15, 10},  {15, 10},
74
  {15, 10},  {15, 10},  {15, 10},  {15, 10},  {15, 10},  {15, 10},
75
  {15, 10},  {15, 10},  {15, 10},  {15, 10},  {15, 10},  {15, 10},
76
  {16, 10},  {16, 10},  {16, 10},  {16, 10},  {16, 10},  {16, 10},
77
  {16, 10},  {16, 10},  {16, 10},  {16, 10},  {17, 10},  {17, 10},
78
  {17, 10},  {17, 10},  {17, 10},  {17, 10},  {17, 10},  {17, 10},
79
  {17, 10},  {17, 10},  {16, 11},  {16, 11},  {16, 11},  {16, 11},
80
  {16, 11},  {16, 11},  {17, 11},  {17, 11},  {17, 11},  {17, 11},
81
  {17, 11},  {17, 11},  {17, 11},  {17, 11},  {17, 11},  {17, 11},
82
  {17, 11},  {18, 11},  {18, 11},  {18, 11},  {18, 11},  {18, 11},
83
  {18, 11},  {18, 11},  {18, 11},  {18, 11},  {18, 11},  {18, 11},
84
  {18, 12},  {18, 12},  {18, 12},  {18, 12},  {18, 12},  {18, 12},
85
  {18, 12},  {18, 12},  {18, 12},  {18, 12},  {18, 12},  {18, 12},
86
  {18, 12},  {18, 12},  {18, 12},  {18, 12},  {18, 12},  {18, 12},
87
  {19, 12},  {19, 12},  {19, 12},  {19, 12},  {19, 12},  {19, 12},
88
  {19, 12},  {19, 12},  {19, 12},  {19, 12},  {19, 12},  {19, 12},
89
  {20, 12},  {20, 12},  {20, 12},  {20, 12},  {20, 12},  {20, 12},
90
  {20, 12},  {20, 12},  {20, 12},  {20, 12},  {20, 12},  {20, 12},
91
  {19, 13},  {19, 13},  {19, 13},  {19, 13},  {19, 13},  {19, 13},
92
  {19, 13},  {20, 13},  {20, 13},  {20, 13},  {20, 13},  {20, 13},
93
  {20, 13},  {20, 13},  {20, 13},  {20, 13},  {20, 13},  {20, 13},
94
  {20, 13},  {20, 13},  {21, 13},  {21, 13},  {21, 13},  {21, 13},
95
  {21, 13},  {21, 13},  {21, 13},  {21, 13},  {21, 13},  {21, 13},
96
  {21, 13},  {21, 13},  {21, 13},  {21, 14},  {21, 14},  {21, 14},
97
  {21, 14},  {21, 14},  {21, 14},  {21, 14},  {21, 14},  {21, 14},
98
  {21, 14},  {21, 14},  {21, 14},  {21, 14},  {21, 14},  {21, 14},
99
  {21, 14},  {21, 14},  {21, 14},  {21, 14},  {21, 14},  {21, 14},
100
  {22, 14},  {22, 14},  {22, 14},  {22, 14},  {22, 14},  {22, 14},
101
  {22, 14},  {22, 14},  {22, 14},  {22, 14},  {22, 14},  {22, 14},
102
  {22, 14},  {22, 14},  {23, 14},  {23, 14},  {23, 14},  {23, 14},
103
  {23, 14},  {23, 14},  {23, 14},  {23, 14},  {23, 14},  {23, 14},
104
  {23, 14},  {23, 14},  {23, 14},  {23, 14},  {23, 15},  {23, 15},
105
  {23, 15},  {23, 15},  {23, 15},  {23, 15},  {23, 15},  {23, 15},
106
  {23, 15},  {23, 15},  {23, 15},  {23, 15},  {23, 15},  {23, 15},
107
  {23, 15},  {23, 15},  {23, 15},  {23, 15},  {23, 15},  {23, 15},
108
  {23, 15},  {23, 15},  {23, 15},  {24, 15},  {24, 15},  {24, 15},
109
  {24, 15},  {24, 15},  {24, 15},  {24, 15},  {24, 15},  {24, 15},
110
  {24, 15},  {24, 15},  {24, 15},  {24, 15},  {24, 15},  {24, 15},
111
  {25, 15},  {25, 15},  {25, 15},  {25, 15},  {25, 15},  {25, 15},
112
  {25, 15},  {25, 15},  {25, 15},  {25, 15},  {25, 15},  {25, 15},
113
  {25, 15},  {25, 15},  {25, 15},  {24, 16},  {24, 16},  {24, 16},
114
  {24, 16},  {24, 16},  {24, 16},  {24, 16},  {24, 16},  {24, 16},
115
  {25, 16},  {25, 16},  {25, 16},  {25, 16},  {25, 16},  {25, 16},
116
  {25, 16},  {25, 16},  {25, 16},  {25, 16},  {25, 16},  {25, 16},
117
  {25, 16},  {25, 16},  {25, 16},  {25, 16},  {26, 16},  {26, 16},
118
  {26, 16},  {26, 16},  {26, 16},  {26, 16},  {26, 16},  {26, 16},
119
  {26, 16},  {26, 16},  {26, 16},  {26, 16},  {26, 16},  {26, 16},
120
  {26, 16},  {26, 16},  {26, 17},  {26, 17},  {26, 17},  {26, 17},
121
  {26, 17},  {26, 17},  {26, 17},  {26, 17},  {26, 17},  {26, 17},
122
  {26, 17},  {26, 17},  {26, 17},  {26, 17},  {26, 17},  {26, 17},
123
  {26, 17},  {26, 17},  {26, 17},  {26, 17},  {26, 17},  {26, 17},
124
  {26, 17},  {26, 17},  {26, 17},  {26, 17},  {27, 17},  {27, 17},
125
  {27, 17},  {27, 17},  {27, 17},  {27, 17},  {27, 17},  {27, 17},
126
  {27, 17},  {27, 17},  {27, 17},  {27, 17},  {27, 17},  {27, 17},
127
  {27, 17},  {27, 17},  {27, 17},  {28, 17},  {28, 17},  {28, 17},
128
  {28, 17},  {28, 17},  {28, 17},  {28, 17},  {28, 17},  {28, 17},
129
  {28, 17},  {28, 17},  {28, 17},  {28, 17},  {28, 17},  {28, 17},
130
  {28, 17},  {28, 17},  {27, 18},  {27, 18},  {27, 18},  {27, 18},
131
  {27, 18},  {27, 18},  {27, 18},  {27, 18},  {27, 18},  {27, 18},
132
  {28, 18},  {28, 18},  {28, 18},  {28, 18},  {28, 18},  {28, 18},
133
  {28, 18},  {28, 18},  {28, 18},  {28, 18},  {28, 18},  {28, 18},
134
  {28, 18},  {28, 18},  {28, 18},  {28, 18},  {28, 18},  {28, 18},
135
  {29, 18},  {29, 18},  {29, 18},  {29, 18},  {29, 18},  {29, 18},
136
  {29, 18},  {29, 18},  {29, 18},  {29, 18},  {29, 18},  {29, 18},
137
  {29, 18},  {29, 18},  {29, 18},  {29, 18},  {29, 18},  {29, 18},
138
  {29, 19},  {29, 19},  {29, 19},  {29, 19},  {29, 19},  {29, 19},
139
  {29, 19},  {29, 19},  {29, 19},  {29, 19},  {29, 19},  {29, 19},
140
  {29, 19},  {29, 19},  {29, 19},  {29, 19},  {29, 19},  {29, 19},
141
  {29, 19},  {29, 19},  {29, 19},  {29, 19},  {29, 19},  {29, 19},
142
  {29, 19},  {29, 19},  {29, 19},  {29, 19},  {29, 19},  {30, 19},
143
  {30, 19},  {30, 19},  {30, 19},  {30, 19},  {30, 19},  {30, 19},
144
  {30, 19},  {30, 19},  {30, 19},  {30, 19},  {30, 19},  {30, 19},
145
  {30, 19},  {30, 19},  {30, 19},  {30, 19},  {30, 19},  {30, 19},
146
  {31, 19},  {31, 19},  {31, 19},  {31, 19},  {31, 19},  {31, 19},
147
  {31, 19},  {31, 19},  {31, 19},  {31, 19},  {31, 19},  {31, 19},
148
  {31, 19},  {31, 19},  {31, 19},  {31, 19},  {31, 19},  {31, 19},
149
  {31, 19},  {31, 20},  {31, 20},  {31, 20},  {31, 20},  {31, 20},
150
  {31, 20},  {31, 20},  {31, 20},  {31, 20},  {31, 20},  {31, 20},
151
  {31, 20},  {31, 20},  {31, 20},  {31, 20},  {31, 20},  {31, 20},
152
  {31, 20},  {31, 20},  {31, 20},  {31, 20},  {31, 20},  {31, 20},
153
  {31, 20},  {31, 20},  {31, 20},  {31, 20},  {31, 20},  {31, 20},
154
  {31, 20},  {31, 20},  {32, 20},  {32, 20},  {32, 20},  {32, 20},
155
  {32, 20},  {32, 20},  {32, 20},  {32, 20},  {32, 20},  {32, 20},
156
  {32, 20},  {32, 20},  {32, 20},  {32, 20},  {32, 20},  {32, 20},
157
  {32, 20},  {32, 20},  {32, 20},  {32, 20},  {33, 20},  {33, 20},
158
  {33, 20},  {33, 20},  {33, 20},  {33, 20},  {33, 20},  {33, 20},
159
  {33, 20},  {33, 20},  {33, 20},  {33, 20},  {33, 20},  {33, 20},
160
  {33, 20},  {33, 20},  {33, 20},  {33, 20},  {33, 20},  {33, 20},
161
  {32, 21},  {32, 21},  {32, 21},  {32, 21},  {32, 21},  {32, 21},
162
  {32, 21},  {32, 21},  {32, 21},  {32, 21},  {32, 21},  {32, 21},
163
  {33, 21},  {33, 21},  {33, 21},  {33, 21},  {33, 21},  {33, 21},
164
  {33, 21},  {33, 21},  {33, 21},  {33, 21},  {33, 21},  {33, 21},
165
  {33, 21},  {33, 21},  {33, 21},  {33, 21},  {33, 21},  {33, 21},
166
  {33, 21},  {33, 21},  {33, 21},  {34, 21},  {34, 21},  {34, 21},
167
  {34, 21},  {34, 21},  {34, 21},  {34, 21},  {34, 21},  {34, 21},
168
  {34, 21},  {34, 21},  {34, 21},  {34, 21},  {34, 21},  {34, 21},
169
  {34, 21},  {34, 21},  {34, 21},  {34, 21},  {34, 21},  {34, 21},
170
  {34, 22},  {34, 22},  {34, 22},  {34, 22},  {34, 22},  {34, 22},
171
  {34, 22},  {34, 22},  {34, 22},  {34, 22},  {34, 22},  {34, 22},
172
  {34, 22},  {34, 22},  {34, 22},  {34, 22},  {34, 22},  {34, 22},
173
  {34, 22},  {34, 22},  {34, 22},  {34, 22},  {34, 22},  {34, 22},
174
  {34, 22},  {34, 22},  {34, 22},  {34, 22},  {34, 22},  {34, 22},
175
  {34, 22},  {34, 22},  {34, 22},  {34, 22},  {35, 22},  {35, 22},
176
  {35, 22},  {35, 22},  {35, 22},  {35, 22},  {35, 22},  {35, 22},
177
  {35, 22},  {35, 22},  {35, 22},  {35, 22},  {35, 22},  {35, 22},
178
  {35, 22},  {35, 22},  {35, 22},  {35, 22},  {35, 22},  {35, 22},
179
  {35, 22},  {35, 22},  {36, 22},  {36, 22},  {36, 22},  {36, 22},
180
  {36, 22},  {36, 22},  {36, 22},  {36, 22},  {36, 22},  {36, 22},
181
  {36, 22},  {36, 22},  {36, 22},  {36, 22},  {36, 22},  {36, 22},
182
  {36, 22},  {36, 22},  {36, 22},  {36, 22},  {36, 22},  {36, 22},
183
  {35, 23},  {35, 23},  {35, 23},  {35, 23},  {35, 23},  {35, 23},
184
  {35, 23},  {35, 23},  {35, 23},  {35, 23},  {35, 23},  {35, 23},
185
  {35, 23},  {36, 23},  {36, 23},  {36, 23},  {36, 23},  {36, 23},
186
  {36, 23},  {36, 23},  {36, 23},  {36, 23},  {36, 23},  {36, 23},
187
  {36, 23},  {36, 23},  {36, 23},  {36, 23},  {36, 23},  {36, 23},
188
  {36, 23},  {36, 23},  {36, 23},  {36, 23},  {36, 23},  {36, 23},
189
  {37, 23},  {37, 23},  {37, 23},  {37, 23},  {37, 23},  {37, 23},
190
  {37, 23},  {37, 23},  {37, 23},  {37, 23},  {37, 23},  {37, 23},
191
  {37, 23},  {37, 23},  {37, 23},  {37, 23},  {37, 23},  {37, 23},
192
  {37, 23},  {37, 23},  {37, 23},  {37, 23},  {37, 23},  {37, 24},
193
  {37, 24},  {37, 24},  {37, 24},  {37, 24},  {37, 24},  {37, 24},
194
  {37, 24},  {37, 24},  {37, 24},  {37, 24},  {37, 24},  {37, 24},
195
  {37, 24},  {37, 24},  {37, 24},  {37, 24},  {37, 24},  {37, 24},
196
  {37, 24},  {37, 24},  {37, 24},  {37, 24},  {37, 24},  {37, 24},
197
  {37, 24},  {37, 24},  {37, 24},  {37, 24},  {37, 24},  {37, 24},
198
  {37, 24},  {37, 24},  {37, 24},  {37, 24},  {37, 24},  {37, 24},
199
  {38, 24},  {38, 24},  {38, 24},  {38, 24},  {38, 24},  {38, 24},
200
  {38, 24},  {38, 24},  {38, 24},  {38, 24},  {38, 24},  {38, 24},
201
  {38, 24},  {38, 24},  {38, 24},  {38, 24},  {38, 24},  {38, 24},
202
  {38, 24},  {38, 24},  {38, 24},  {38, 24},  {38, 24},  {38, 24},
203
  {39, 24},  {39, 24},  {39, 24},  {39, 24},  {39, 24},  {39, 24},
204
  {39, 24},  {39, 24},  {39, 24},  {39, 24},  {39, 24},  {39, 24},
205
  {39, 24},  {39, 24},  {39, 24},  {39, 24},  {39, 24},  {39, 24},
206
  {39, 24},  {39, 24},  {39, 24},  {39, 24},  {39, 24},  {39, 24},
207
  {39, 25},  {39, 25},  {39, 25},  {39, 25},  {39, 25},  {39, 25},
208
  {39, 25},  {39, 25},  {39, 25},  {39, 25},  {39, 25},  {39, 25},
209
  {39, 25},  {39, 25},  {39, 25},  {39, 25},  {39, 25},  {39, 25},
210
  {39, 25},  {39, 25},  {39, 25},  {39, 25},  {39, 25},  {39, 25},
211
  {39, 25},  {39, 25},  {39, 25},  {39, 25},  {39, 25},  {39, 25},
212
  {39, 25},  {39, 25},  {39, 25},  {39, 25},  {39, 25},  {39, 25},
213
  {39, 25},  {39, 25},  {39, 25},  {40, 25},  {40, 25},  {40, 25},
214
  {40, 25},  {40, 25},  {40, 25},  {40, 25},  {40, 25},  {40, 25},
215
  {40, 25},  {40, 25},  {40, 25},  {40, 25},  {40, 25},  {40, 25},
216
  {40, 25},  {40, 25},  {40, 25},  {40, 25},  {40, 25},  {40, 25},
217
  {40, 25},  {40, 25},  {40, 25},  {40, 25},
218
};
219

            
220
AcrosticBoardDimension
221
6
acrostic_board_dimension_from_quote_length (guint quote_length)
222
{
223
6
  AcrosticBoardDimension board = {
224
    .width = 0,
225
    .height = 0,
226
  };
227

            
228
  /* Update the table if IPUZ_ACROSTIC_MAX_QUOTE_STR_LENGTH ever changes */
229
  g_assert (G_N_ELEMENTS (dimensions) == IPUZ_ACROSTIC_MAX_QUOTE_STR_LENGTH);
230

            
231
6
  g_return_val_if_fail (quote_length > 0, board);
232
6
  g_return_val_if_fail (quote_length <= IPUZ_ACROSTIC_MAX_QUOTE_STR_LENGTH, board);
233

            
234
6
  return dimensions[quote_length - 1];
235
}