|
1 | 1 | using System; |
2 | 2 | using System.Collections.Generic; |
| 3 | +using System.Diagnostics; |
| 4 | +using System.Globalization; |
3 | 5 | using System.Linq; |
4 | 6 | using System.Numerics; |
5 | 7 | using System.Text; |
@@ -458,10 +460,10 @@ internal static void Division(Stack context) |
458 | 460 | context.Push(result); |
459 | 461 | } |
460 | 462 |
|
461 | | - internal static void Each(Stack context, Item first, Item second) |
| 463 | + internal static void Each(Stack context, Item str, Item array) |
462 | 464 | { |
463 | | - var code = first.GetString(); |
464 | | - foreach (var item in second.GetArray()) |
| 465 | + var code = str.GetString(); |
| 466 | + foreach (var item in array.GetArray()) |
465 | 467 | { |
466 | 468 | context.Push(item); |
467 | 469 | context.Golfscript.Run(code); |
@@ -492,6 +494,14 @@ internal static void Modulus(Stack context) |
492 | 494 | var value = split.Where(str => str.Length > 0).Select(str => new StringItem(str)); |
493 | 495 | result = new ArrayItem(value); |
494 | 496 | } |
| 497 | + // TODO: Array implementation |
| 498 | + else if (tuple == (ItemType.Array, ItemType.Array)) |
| 499 | + { |
| 500 | + var separator = first.GetArray(); |
| 501 | + var split = second.GetArray().Split(separator); |
| 502 | + var value = split.Where(arr => arr.Any()).Select(str => new ArrayItem(str)); |
| 503 | + result = new ArrayItem(value); |
| 504 | + } |
495 | 505 | else if (tuple == (ItemType.Block, ItemType.Array)) |
496 | 506 | { |
497 | 507 | context.PushFrame(); |
@@ -1046,7 +1056,7 @@ internal static void Peek(Stack context) |
1046 | 1056 | if (context.Size == 0) |
1047 | 1057 | return; |
1048 | 1058 |
|
1049 | | - //var second = context.Pop(); |
| 1059 | + var second = context.Pop(); |
1050 | 1060 | // TODO: Mapping sort |
1051 | 1061 | //if (second.Type == ItemType.String) |
1052 | 1062 | //{ |
@@ -1187,6 +1197,76 @@ internal static void While(Stack context) |
1187 | 1197 | } |
1188 | 1198 | } |
1189 | 1199 |
|
| 1200 | + |
| 1201 | + internal static void Zip(Stack context) |
| 1202 | + { |
| 1203 | + if (context.Size == 0) |
| 1204 | + return; |
| 1205 | + |
| 1206 | + var first = context.Pop(); |
| 1207 | + |
| 1208 | + if (first.Type != ItemType.Array) |
| 1209 | + { |
| 1210 | + Console.WriteLine("It must be an array"); |
| 1211 | + return; |
| 1212 | + } |
| 1213 | + |
| 1214 | + var matrix = first.GetArray(); |
| 1215 | + |
| 1216 | + if (ItemType.Array.MatchAll(matrix.ToArray())) |
| 1217 | + { |
| 1218 | + var columnCount = matrix.Count; |
| 1219 | + var rowCount = (int)matrix.Max(row => row.Size); |
| 1220 | + |
| 1221 | + var rows = new List<List<Item>>(rowCount); |
| 1222 | + |
| 1223 | + for (int i = 0; i < rowCount; i++) |
| 1224 | + rows.Add(new List<Item>(matrix.Count)); |
| 1225 | + |
| 1226 | + for (int i = 0; i < columnCount; i++) |
| 1227 | + { |
| 1228 | + var row = matrix[i].GetArray(); |
| 1229 | + for (int j = 0; j < row.Count; j++) |
| 1230 | + { |
| 1231 | + var item = row[j]; |
| 1232 | + rows[j].Add(item); |
| 1233 | + } |
| 1234 | + } |
| 1235 | + |
| 1236 | + context.PushFrame(); |
| 1237 | + for (int i = 0; i < rowCount; i++) |
| 1238 | + context.Push(new ArrayItem(rows[i])); |
| 1239 | + |
| 1240 | + context.PopFrame(true); |
| 1241 | + } |
| 1242 | + else if (ItemType.String.MatchAll(matrix.ToArray())) |
| 1243 | + { |
| 1244 | + var columnCount = matrix.Count; |
| 1245 | + var rowCount = (int)matrix.Max(row => row.Size); |
| 1246 | + |
| 1247 | + var rows = new List<StringBuilder>(rowCount); |
| 1248 | + |
| 1249 | + for (int i = 0; i < rowCount; i++) |
| 1250 | + rows.Add(new StringBuilder(matrix.Count)); |
| 1251 | + |
| 1252 | + for (int i = 0; i < columnCount; i++) |
| 1253 | + { |
| 1254 | + var row = matrix[i].GetString(); |
| 1255 | + for (int j = 0; j < row.Length; j++) |
| 1256 | + { |
| 1257 | + var item = row[j]; |
| 1258 | + rows[j].Append(item); |
| 1259 | + } |
| 1260 | + } |
| 1261 | + |
| 1262 | + context.PushFrame(); |
| 1263 | + for (int i = 0; i < rowCount; i++) |
| 1264 | + context.Push(new StringItem(rows[i].ToString())); |
| 1265 | + |
| 1266 | + context.PopFrame(true); |
| 1267 | + } |
| 1268 | + } |
| 1269 | + |
1190 | 1270 | #endregion |
1191 | 1271 |
|
1192 | 1272 | #region Utils |
|
0 commit comments