К сожалению, я думаю, что то, что вы пытаетесь сделать, принципиально невозможно. Если пользователи могут выполнять произвольный код в своем приложении, они могут делать все, что захотят. Даже если вы смогли помешать им импортировать определенные модули, ничто не помешало бы им самим писать эквивалентную функциональность (с нуля или с помощью некоторых доступных модулей).
Я действительно не знаю особенности реализации песочницы в Python, но я бы предположил, что это то, что нужно сделать на уровне интерпретатора и далеко не просто!
public static List<string> DivideIntoPartitions(string stringToDivide, int partitions)
{
var parts = new List<string>(partitions);
var len = stringToDivide.Length;
if (len < partitions)
{
throw new ArgumentException("partitions should be less than length");
}
if (len % partitions == 0)
{
var eachSubstrLength = len / partitions;
for (int i = 0; i < stringToDivide.Length; i += eachSubstrLength)
{
parts.Add(stringToDivide.Substring(i, eachSubstrLength));
}
}
else
{
var nextDivisibleNumber = len + (partitions - (len % partitions));
var lengthOfLastSubstr = nextDivisibleNumber / partitions;
var lastItem = stringToDivide.Substring((len - lengthOfLastSubstr));
stringToDivide = stringToDivide.Remove((len - lengthOfLastSubstr));
var chunksize = stringToDivide.Length / (partitions - 1);
for (int i = 0; i < stringToDivide.Length; i += chunksize)
{
parts.Add(stringToDivide.Substring(i, chunksize));
}
parts.Add(lastItem);
}
return parts;
}
var result = DivideIntoPartitions("qrstuvwxyz", 3);
Вы можете сделать что-то вроде этого:
private static List<string> Divide(List<string> input, int index, int partitions)
{
var stringToDivide = input[index];
input.RemoveAt(index);
var stringToAdd = "";
var partitionLength = stringToDivide.Length / partitions;
for (int i = 0, partitionNum = 0; i < stringToDivide.Length; i++)
{
if (i % partitionLength == 0 && partitionNum != partitions) // skip space in last part
{
if (i > 0) // do not add leading space
{
stringToAdd += " ";
}
partitionNum++;
}
stringToAdd += stringToDivide[i];
}
input.Insert(index, stringToAdd);
return input;
}
Этот код добавляет пробелы каждый partitionLength
, но пропускает пробел для последней строки. Обратите внимание, что для длинных строк лучше использовать StringBuilder
.
stringToDivide.Length % partitions
- это количество символов, оставшихся после деления на partitions
количество разделов.
stringToDivide.Length / partitions
- это количество символов, которое должно быть в каждом разделе, кроме последнего, к которому должны быть добавлены оставшиеся символы.
Так что просто возьмите первое partitions
количество фрагментов stringToDivide.Length / partitions
длины и добавьте оставшиеся к последнему фрагменту.
Когда строка делится поровну, stringToDivide.Length % partitions
равен нулю, так что это не частный случай.