Страницы

Поиск по вопросам

среда, 3 апреля 2019 г.

Вставить элементы одного списка в другой с определённым шагом

Здравствуйте, стоит следующая задача:
Есть 2 txt файла (количество строк в каждом произвольно). Необходимо строки из одного списка вставить в другой через определённый интервал, например, через каждые n строк.
f1 = open(r'c:\Исходная база.txt') f2 = open(r'c:\Строки для добавления.txt') list1 = f1.readlines() list2 = f2.readlines() f1.close() f2.close() i = 0 n = 2 while i + n <= 10: list1.insert(i * n, list2[i]) i = i + 1 with open(r'c:\результат.txt', 'w') as res: for item in list1: res.write("{}".format(item))
В случае, если задать
while i + n <= len(list2):
list2 - файл откуда берём строки для подстановки, код работает как надо.
Однако, при
while i + n <= len(list1):
Получаю ошибку:
list1.insert(i * n, list2[i])
IndexError: list index out of range
Прошу подсказать как реализовать подстановку строк из list2 в случае, если строк в list2 меньше, чем в list1. То есть когда строки в list2 кончатся, подстановка строк должна опять начаться с 0 элемента list2.
Исходные данные list1: 1, 2, 3, 4, .., m Исходные данные List2: a, b, c, d, .., k Результат должен быть: 1, a, 2, b, 3, c ... при n=2 1, 2, a, 3, 4, b, .. при n=3
При этом важно, чтобы строки подставлялись именно из list2 в list1. И когда строки в list2 кончатся, они должны опять начать подставляться с 0 элемента.


Ответ

Чтобы элементы по кругу возвращались (начинались с первого по окончанию), можно itertools.cycle() использовать.
Чтобы по несколько элементов сразу обходить, можно zip(*[iterator]*n) идиому применить.
Чтобы чередовать группы из первого итератора с элементами из второго и вернуть плоскую версию (без рекурсии) и обрезая ввод по меньшей длине аргументов:
import itertools
flatten = itertools.chain.from_iterable
def interlaced(groups, items): return flatten(itertools.chain(group, [item]) for group, item in zip(groups, items))
Объединяя :
n = 3 lines = interlaced(zip(*[itertools.cycle(f1)]*(n-1)), f2) output_file.writelines(lines)
Пример:
f1 = iter([1,2,3,4]) f2 = iter("abcde") it = interlaced(zip(*[itertools.cycle(f1)]*(n-1)), f2) print(*it) # -> 1 2 a 3 4 b 1 2 c 3 4 d 1 2 e

Конструкция return this

Всем привет. Возник вопрос, что означает return this;, который обычно встречается в методах? В пользовательском конструкторе this используется когда, поля класса и аргументы конструктора имеют одинаковое имя, как здесь:
public IntValue(int value) { this.value = value; }
А что означает return this;, не очень понятно? Я думаю эту запись ввели для сокращения кода, и возможно обойтись как-то без return this;, если такое возможно покажите? Если я правильно понял, то код, который я привёл ниже в реализация интерфейса - IEnumerable возвращает экземпляр класса UserCollection приведенный к базовому интерфейсному типу и this в данном случае это и есть ссылка на экземпляр класса UserCollection?
namespace InterIEnumerable { // Класс UserCollection коллекция (набор) объектов класса Element. // Для применения foreach, необходимо, чтобы класс реализовывал интерфейс - IEnumerable. public class UserCollection : IEnumerable, IEnumerator { public Element[] elementsArray = null;
public UserCollection() { elementsArray = new Element[4]; elementsArray[0] = new Element("A", 1, 10); elementsArray[1] = new Element("B", 2, 20); elementsArray[2] = new Element("C", 3, 30); elementsArray[3] = new Element("D", 4, 40); }
// Указатель текущей позиции элемента в массиве. int position = -1;
// ------------------------------------------------------------------------------------------------------------------ // Реализация интерфейса IEnumerator.
// Передвинуть внутренний указатель (position) на одну позицию. public bool MoveNext() { if (position < elementsArray.Length - 1) { position++; return true; } else { return false; } }
// Установить указатель (position) перед началом набора. public void Reset() { position = -1; }
// Получить текущий элемент набора. public object Current { get { return elementsArray[position]; } }
// ----------------------------------------------------------------------------------------------------------------- // Реализация интерфейса - IEnumerable.
IEnumerator IEnumerable.GetEnumerator() { return this as IEnumerator; } } }


Ответ

Ээхм.
this.value — это не магическая конструкция, означающая «не тот value, а другой, который я имею в виду».
this — это ссылка на вполне конкретный объект, и this.value — это совершенно обыкновенное обращение к полю этого объекта. Этот вызов ничем не отличается от вызова obj.value по другой ссылке (если, конечно, тип ссылки obj такой же).
Внутри нестатических методов объекта this является ссылкой на этот объект. Вне нестатических методов пользоваться this нельзя. Соответственно, если вы возвращаете ссылку на this, вы возвращаете ссылку на объект, в тором выполняется тот самый метод, откуда вы пытаетесь вернуть значение.
Никакой мистики.

Вывести дочерние узлы кроме первого и последнего

Привет, как вывести дочерние узлы кроме первого и последнего?
document.body.firstElementChild; Document

Text

Other

Next

Last



Ответ

if (document.body.children) { const children = document.body.children;
for (var i = 1; i < children.length - 1; ++i) { console.log(children[i]) } }

Как переместить запятую

public static void main(String args[]) { System.out.println(convert("5")); System.out.println(convert("56")); System.out.println(convert("560")); System.out.println(convert("5600")); }
public static double convert(String str){ double asd=Double.valueOf(str); return asd/100; }

0.05 0.56 5.6 56.0
Все работает кроме 2 последних чисел. Проблема в том что должно быть 5.60 и 56.00. А мы имеем 5.6 и 56.0
Что я делаю не так?


Ответ

Немного теории:
Для того чтобы вернуть данные, вам необходимо отформатировать их. Для этого можно использовать метод .format() из класса String, который вернет отформатированные данные в качестве строки.
public PrintStream format(String format, Object... args)
String format - это строка, определяет шаблон, согласно которому будет происходить форматирование. Object... args - это аргументы, на которые ссылаются спецификаторы формата в строке формата. Если аргументов больше, чем спецификаторов формата, дополнительные аргументы игнорируются. Число аргументов является переменной и может быть нулевым. Максимальное количество аргументов ограничено максимальным размером массива Java, как определено Спецификацией виртуальной машины Java ™. Поведение на нулевом аргументе зависит от преобразования.
Взято из офф. документации Oracle
Согласно заданному нами шаблону мы берем аргумент под номером %1$ и говорим что нужно вывести .2f- два знака после запятой.
Решение:
Измените свою функцию Convert следующим образом:
public String convert(String str) { double myDouble = Double.valueOf(str) / 100; return String.format("%1$,.2f", myDouble); }
Надеюсь мой ответ помог вам.

c# Net core Поиск номера строки ошибки в файле XML, имея путь к тегу (cases XPath, Regex, JSON?)

Здравствуйте. Ситуация: есть модель(дисериализованный файл), довольно большая. В ней много строк и вложенных объектов. (Модель YML каталога).
[XmlRoot("yml_catalog")] public class YMLCatalog { ///

/// Дата и время генерации YML файла на стороне магазина /// [Required] [XmlAttribute("date")] public string Date { get; set; }
/// /// Магазин /// [Required] [ValidateObject] [XmlElement(ElementName = "shop")] public Shop Shop { get; set; } }
/// /// Точка продаж /// https://yandex.ru/support/webmaster/goods-prices/technical-requirements.html /// public class Shop { /// /// Название магазина. /// [Required] [XmlElement("name")] public string Name { get; set; }
/// /// Название компании /// [Required] [XmlElement("company")] public string Company { get; set; } ... и тд. }
При валидации модели, в случае ошибки, я получаю (при помощи магии. См. краткое описание в комментариях) путь к ошибке. Например для YML файла с ошибкой в теге price, 0го оффера, в виде отсутствия цены, я получаю путь: shop/offers/offer['0 или 1', смотря как удобнее. Для XPath лучше 1]/price Value: Текст ошибки. (Value - поле со значением тега, аналогично может быть для атрибутов)
Нас интересует: shop/offers/offer[0]/price
По этому пути, мне нужно определить номер строки, где находиться этот тег. Чтобы указать пользователю где ошибка.
Что я пробовал:
1) Сделал через регулярные выражения. Сначала последовательно нахожу индекс элементов по пути, как получу индекс начала тега Price в файле. Затем собираю список строк в файле и нахожу номер строки для вывода, относительно всего файла. - Это работает, но меня не устраивает. Слишком медленно, а у меня могут быть очень большие файлы
2) Попробовал сделать через XPath. Т.е например можно легко получить элемент тега вот так:
XmlDocument document = new XmlDocument(); document.LoadXml(text); var node = document.SelectSingleNode("//shop/offers/offer[1]/price");// это для примера
3) Есть вариант с созданием своего дессериализатора + атрибутов валидации для него, чтобы к каждому полю в модели приписывать в метаданных IXmlLineInfo - который в стандартном XmlSerializer к сожалению используется только при выдаче информации об ошибке - но это долго, а те готовые, что я нашел, не поддерживаются в net core... UPD: также в таком случае требуется поддержка не только составных объектов, но и простых + простых атрибутов (string, int, long и тп)
Вопрос 1: XPath как-нибудь позволяет получить кол-во элементов выше (или лучше их список) ? Вроде комбинировать preceding и ancestor нельзя (ссылка) - Но опять же, даже если это получиться, придется искать индекс, создавая список строк файла. - Не очень хорошо, хотелось бы узнать номер строки ошибки другим способом
Пробовал "//shop/offers/offer[ 1 ]/price/preceding::*", но в таком случае игнорируются все элементы выше shop, почему не знаю. (когда использовал count(...), получал 27 элементов) - Думаю это всяко лучше только регулярных выражений
Знаете еще способ? Прошу в ответы:)
Главный вопрос: Так как лучше всего найти номер строки ошибки, имея XML и путь к тегу?
P.S Производительность решения приветствуется)


Ответ

Не выдержал, решил дать свой ответ.
Во-первых, XmlSerializer выдаёт ошибку не только при ошибке синтаксиса XML (например, незакрытый тег), но и в том случае, если тип данных не соответствует ожидаемому (например, свойство Price имеет тип decimal, а в узле Price пусто или нечисловая строка). При этом в выбрасываемом исключении содержится сообщение, содержащее номер и позицию ошибки:
В документе XML (4, 18) присутствует ошибка.
На мой взгляд, это уже фактически решает вопрос. Строка с ошибкой известна, можно её исправлять.

Чуть погуглив, я легко выяснил, что для документов YML имеется схема. Скачать её можно здесь
При валидации по схеме будет выдаваться описание ошибки наподобие следующего:
Элемент "Price" недействителен: значение "" недействительно с точки зрения его типа данных "http://www.w3.org/2001/XMLSchema:decimal" - Строка "" не является допустимым значением Decimal.
Это даёт огромное удобство: пользователь легко поймёт и исправит ошибку.
Сама валидация делается в несколько строк:
var xs = new XmlSerializer(typeof(Test)); var settings = new XmlReaderSettings { ValidationType = ValidationType.Schema };
var schemas = new XmlSchemaSet(); schemas.Add(null, "schema.xsd"); settings.Schemas = schemas; settings.ValidationEventHandler += Settings_ValidationEventHandler;
using (var xr = XmlReader.Create("test.xml", settings)) //while (xr.Read()) ; item = (Test)xs.Deserialize(xr);
private void Settings_ValidationEventHandler(object sender, ValidationEventArgs e) { Console.WriteLine(e.Severity); Console.WriteLine(e.Message); Console.WriteLine(e.Exception.LineNumber + " " + e.Exception.LinePosition); }
В данном коде валидация происходит в процессе чтения xml. То есть нет лишних проходов/загрузок, всё максимально эффективно по скорости и объёму памяти.
Если нужно только валидация без десериализации, то раскомментируйте строку с while, закомментировав следующую.

В том подходе, который используете вы сейчас, всё делается, имхо, очень неэффективно.
Десериализация - отдельно (проход по xml, потребление памяти). Валидация - отдельно (ещё проход, ещё память). Поиск строки с ошибкой с помощью XPath - ещё одна загрузка xml в XmlDocument/XDocument (опять полный парсинг xml, опять тратится время и память).
Кроме того, если xml синтаксически некорректен (незакрытый тег), то он вообще не загрузится в XmlDocument/XDocument и вы никогда не узнаете, где же ошибка...
Кроме того, вы вручную расставляете атрибуты валидации и пишете код валидации... Лишняя работа.

Как объединить два списка/кортежа словарей (например списки записей БД) в Python

Имеется два списка словаря:
Первый:
x = {'title':'[Лада]', 'prise':'[70000]', 'status':'[Непродана]'},{'title':'[нисан]', 'prise':'[70000]', 'status':'[Непродана]'}
Второй:
y = {'title':'[Лада]', 'prise':'[70000]', 'status':'[Продана]'},{'title':'[БМВ]', 'prise':'[70000]', 'status':'[Непродана]'}
Желаемый результат:
z = {'title':'[Лада]', 'prise':'[70000]', 'status':'[Продана]'},{'title':'[нисан]', 'prise':'[70000]', 'status':'[Непродана]'}, {'title':'[БМВ]', 'prise':'[70000]', 'status':'[Непродана]'}


Ответ

Pandas замечательно справляется с подобными задачами:
import pandas as pd
def merge(*args): return (pd.concat([pd.DataFrame(x if isinstance(x, list) else list(x)) for x in args], ignore_index=True) .drop_duplicates('title', keep='last'))
def merge2(*args): return (pd.concat([pd.DataFrame(x if isinstance(x, list) else list(x)) for x in args], ignore_index=True) .drop_duplicates('title', keep='last') .to_dict('records'))
В виде Pandas DataFrame:
In [72]: merge(x, y) Out[72]: prise status title 1 [70000] [Непродана] [нисан] 2 [70000] [Продана] [Лада] 3 [70000] [Непродана] [БМВ]
В виде списка словарей:
In [73]: merge2(x, y) Out[73]: [{'prise': '[70000]', 'status': '[Непродана]', 'title': '[нисан]'}, {'prise': '[70000]', 'status': '[Продана]', 'title': '[Лада]'}, {'prise': '[70000]', 'status': '[Непродана]', 'title': '[БМВ]'}]

Билдер для древовидной структуры данных?

Нужно реализовать паттерн билдер для древовидной структуры данных. Все что я пробовал, показывает, что это очень сложно делать и крайне неудобно намного проще сделать через несколько new. Буду очень рад, если кто-то решал подобные проблемы и покажет пример такого билдера.


Ответ

Допустим, мы хотим построить дерево. У нас есть узел
public class Node { public int Value { get; set;} public Node Left { get; set;} public Node Right { get; set;} }
Далее пример fluent билдера. То есть вызовы можно объединять в цепочки, чтобы построить дерево
public class TreeBuilder { private InnerNode _root; private InnerNode _currentNode;
private TreeBuilder(int value) { _root = new InnerNode() { Value = value }; _currentNode = _root; }
public static TreeBuilder Create(int value) { return new TreeBuilder(value); }
public TreeBuilder AddLeft(int value) { _currentNode.Left = new InnerNode() { Value = value, Parent = _currentNode }; return Left(); }
public TreeBuilder AddRight(int value) { _currentNode.Right = new InnerNode() { Value = value, Parent = _currentNode }; return Right(); }
public TreeBuilder Left() { _currentNode = _currentNode.Left; return this; }
public TreeBuilder Right() { _currentNode = _currentNode.Right; return this; }
public TreeBuilder Root() { _currentNode = _root; return this; }
public TreeBuilder Parent() { _currentNode = _currentNode.Parent; return this; }
public Node Build() { return Build(_root); }
private Node Build (InnerNode node) { if (node == null) return null; return new Node() {Value = node.Value, Left =Build(node.Left), Right=Build(node.Right)}; }
private class InnerNode { public int Value { get; set; } public InnerNode Left { get; set; } public InnerNode Right { get; set; } public InnerNode Parent { get; set; } } }
Внутри билдера для представления не законченного дерева я использовал отдельный класс, так как этот класс имеет ссылку на родителя и с ним удобней ходить по узлам. По идее можно было накапливать информацию о строящемся объекта как понравится.
Ну, и, собственно, использование:
var root = TreeBuilder .Create(10) .AddLeft(5) .Parent() .AddRight(15) .AddLeft(10) .Build();
// 10 // / \ // 5 15 // / // 10

Округление целого числа до значения делящегося на 10 без остатка? (Округление к большему по модулю)

Возможно округлить 41-49 до 50 пример 41 до 50, 43 до 50 или 49 до 50. Или к примеру -41 до -50 , -41 - -49 до -50. Надо для отображения нормальной шкалы на графиках.


Ответ

Делить число n + 9 умноженное на знак числа, нацело на 10, а потом умножать на 10
int res = (int) ((9 * (n / abs(n)) + n) / 10) * 10
Где n/abs(n) = знаку числа n (-1 или 1) (это для того что бы учитывать отрицательные числа)

Задать номер месяца по его названию. C#

Имеется ComboBox, который хранит месяца года в текстовом формате. Как можно записать номер месяца в DataTime?

Там где происходит добавление месяцев в список, нужный мне номер месяца сохранить сразу не могу, так как нужен выбор пользователя.
for (int i = 1; i <= 12; i++) { cmbMonth.Items.Add(now.ToString("MMMM")); now = now.AddMonths(1); cmbMonth.Text = DateTime.Now.ToString("MMMM"); }
Нужно из cmbMonth.Text получить название месяца, что бы записать полноценную дату выбранную пользователем. Но так-как месяца хранятся в виде текста, возникли проблемы. Как можно решить? (Писать цикл с месяцами и их номерами не вариант, так как текст месяца в ComboBox зависит от языка системы)


Ответ

Для перевода из String в DataTime есть пара хороших методов Parse и ParseExact. Вот второй и подойдет для данной задачи!
Суть следующая - Вы ему даете 3 аргумента:
string, где есть значения связанные со временем (будь то время, дата, месяц или еще что). Некая маска, по которой метод ParseExact поймет, что находится в пункте 1. Культура пользователя или указанная заранее.
Напишу пример к вашей задаче:
var m = "Декабрь"; DateTime dd = DateTime.ParseExact(m, "MMMM", System.Globalization.CultureInfo.CurrentCulture); Console.WriteLine(dd);
Как видим я задал 3 параметра - месяц (декабрь), маска (полный формат месяца) и культура (текущая культура пользователя).
Результатом программа выдаст:
01.12.2018 0:00:00
Надеюсь это решит вашу проблему. Удачи!

задача на С++ “обед”

Задача - Влад хочет взять с собой для ланча пару фруктов. У него есть a различных бананов, b различных яблок и c различных груш. Сколькими способами он может выбрать 2 разных фрукта из имеющихся у него?
Входные данные В одной строке заданы три неотрицательных числа: a, b, c. Все числа не превышают 106
Входные данные Вывести количество способов, которыми можно выбрать 2 фрукта разного вида.
Код
#include
using namespace std;
int main() { int a,b,c; cin >>a>>b>>c; int n=a*b+a*c+b*c; cout<На e-olymp даёт только 85%, что не так с кодом?


Ответ

Основы комбинаторики Вам нужна функция вычисляющая факториал от числа Потом нужно выбрать одну из формул, которая подходит к условию задачи И просто прописать ответ в виде формулы:
Ресурсы где можно найти, разобрать и понять их: https://www.matburo.ru/tv_komb.php http://old.nsu.ru/mmf/tvims/chernova/tv/lec/node3.html
Можно было дать и готовый код. Но вам в первую очередь нужно самому понять суть задачи

Работа с бинарным деревом

#include #include #include #include #include #include
using namespace std;
typedef int T;
queue myqueue;
typedef struct Node { int data; Node *LeftBranch; Node *RightBranch; Node *Parent; } Node;
Node* getFreeNode(T value, Node *Parent);
void addToTree(Node **head, int value);
void printTree(Node *Root, const char *dir, int level);
int min(Node *Root);
int find(Node *Root);
Node *deleteNode(Node *Root, int key);
void delete2(Node *Root);
bool isPrime(int n);
int main(int argc, char const *argv[]) {
Node *Root = NULL; int* arr = new int[14];
srand(time(NULL)); for (int i = 0; i < 14; i++) { arr[i] = rand() % 198 - 99; }
for (int i = 0; arr[i]; i++) { addToTree(&Root, arr[i]); }
printTree(Root, "Root", 0);
cout << "Min: " < cout << endl;
find(Root);
cout << endl;
delete2(Root);
printTree(Root, "Root", 0); cout << "finish"; return 0; }
Node* getFreeNode(T value, Node *Parent) { Node *tmp = (Node*) malloc(sizeof(Node)); tmp->LeftBranch = tmp->RightBranch = NULL; tmp->data = value; tmp->Parent = Parent; return tmp; }
void addToTree(Node **head, int value) { Node *tmp = NULL; Node *ins = NULL;
if (*head == NULL) { *head = getFreeNode(value, NULL); return; }
tmp = *head; while (tmp) { if (value > tmp->data) { if (tmp->RightBranch) { tmp = tmp->RightBranch; continue; } else { tmp->RightBranch = getFreeNode(value, tmp); return; } } else if ( value < tmp->data) { if (tmp->LeftBranch) { tmp = tmp->LeftBranch; continue; } else { tmp->LeftBranch = getFreeNode(value, tmp); return; } }
} }
void printTree(Node *Root, const char *dir, int level) { if (Root) { printf("lvl %d %s = %d
", level, dir, Root->data); printTree(Root->LeftBranch, "left", level + 1); printTree(Root->RightBranch, "right", level + 1); } }
int min(Node *Root) { while (Root->LeftBranch) { Root = Root->LeftBranch; } int min = Root->data; return min; }
int find(Node *Root) { if (Root == NULL) { return 0; }
if (isPrime(Root->data)) { myqueue.push(Root->data);
} find(Root->LeftBranch); find(Root->RightBranch); }
Node *minimum(Node *Root) { while (Root->LeftBranch) { Root = Root->LeftBranch; } return Root; }
Node *deleteNode(Node *Root, int key) { if (Root == NULL) { return Root; } else { if (key < Root->data) { Root->LeftBranch = deleteNode(Root->LeftBranch, key);
} else if(key > Root->data) { Root->RightBranch = deleteNode(Root->RightBranch, key);
} else if (Root->LeftBranch != NULL && Root->RightBranch != NULL) { Root->data = minimum(Root->RightBranch)->data; Root->RightBranch = deleteNode(Root->RightBranch, Root->data);
} else { if (Root->LeftBranch != NULL) { Root = Root->LeftBranch; } else { Root = Root->RightBranch; } } } return Root; }
void delete2(Node *Root) { cout << "My queue equal: "; while(!myqueue.empty()) { cout << myqueue.front() << " "; deleteNode(Root, myqueue.front()); myqueue.pop(); }
}
bool isPrime(int n) { for (int i = 2; i <= n; i++) { if (n % i == 0) { return false; } } return true; }
Дано бинарное дерево,рандомно было записано данные. Далее необходимо удалить все простые числа. В функции find() происходит запись в очередь. После в функции delete2() удаление. Проблема: в очередь попадають не те данные что нужно. Из-за етого происходит не коректное удаление Вопрос: помогите написать правильную реализацию find()


Ответ

BUG1 : Проверка простоты числа: проверять на деление нужно от 2 до sqrt(n). BUG2 : addToTree() при добавлении числа , которое уже есть в дереве будет глухой висяк. BUG3 : min() при пустом дереве будет крушение программы вообще. BUG4 : delete2(Node*) : новый указатель корня дерева возвращается из deleteNode, а сам результат нового корня игнорируется.

Анонимные структуры

Вычитал на сайте это
В некотором коде C широко распространено использование typedef вместе с анонимными структурами.
Зачем пользоваться анонимными структурами вместе с typedef вместо простого объявления.


Ответ

В С, в отличие от С++, слово struct приходится постоянно использовать с именем типа -
struct Pair { int a, b; };
struct Pair z;
Просто Pair z; будет не понято компилятором.
Чтобы избежать этой проблемы, можно дописать
typedef struct Pair mypair;
после чего
mypair z;
станет корректным объявлением. Получается, что само имя Pair de facto не используется нигде, кроме как при объявлении структуры и в typedef. Так не проще ли его вообще выкинуть и использовать typedef с анонимной структурой -
typedef struct { int a, b; } pair;
pair z;
"По-моему, так" (с) Пух

Заливка большого файла на WEB сервер методом POST python

Помогите разобраться в чем проблема. Хочу залить файл на сервер, использую библиотеку requests. Маленький файл льется отлично, с большим файлом беда - не уходит. Код:
import requests r = requests.get('запорос на урл') upload_url = r['урл сервера'] file = {'video_file': ('1.mp4', open('S:/1.mp4', 'rb'))} r2 = requests.post(upload_url, files=file)
ответ питона
Traceback (most recent call last): File "S:/charm/projects/2.py", line 13, in r2 = requests.post(upload_url, files=file) File "S:\charm\projects\venv\lib\site-packages
equests\api.py", line 112, in post return request('post', url, data=data, json=json, **kwargs) File "S:\charm\projects\venv\lib\site-packages
equests\api.py", line 58, in request return session.request(method=method, url=url, **kwargs) File "S:\charm\projects\venv\lib\site-packages
equests\sessions.py", line 494, in request prep = self.prepare_request(req) File "S:\charm\projects\venv\lib\site-packages
equests\sessions.py", line 437, in prepare_request hooks=merge_hooks(request.hooks, self.hooks), File "S:\charm\projects\venv\lib\site-packages
equests\models.py", line 308, in prepare self.prepare_body(data, files, json) File "S:\charm\projects\venv\lib\site-packages
equests\models.py", line 496, in prepare_body (body, content_type) = self._encode_files(files, data) File "S:\charm\projects\venv\lib\site-packages
equests\models.py", line 159, in _encode_files fdata = fp.read() MemoryError
Повторю, маленькие файлы грузит отлично. Что не так?


Ответ

Попробуйте использовать requests-toolbelt
# pip install requests-toolbelt from requests_toolbelt import MultipartEncoder
# pip install requests import requests
upload_file = open('S:/1.mp4', 'rb') payload = MultipartEncoder({'1.mp4': upload_file})
rs = requests.post('', data=payload , headers={'Content-Type': payload.content_type}) print(rs)

Как скопировать массив в динамический массив? (Си)

Есть массив char str[] = "abcdef";
И динамический массив: char *dstr = (char*)malloc(sizeof(char) * N);
Как скопировать str[] в dstr[] ?
P.S. Заранее извиняюсь, если вопрос глупый.


Ответ

Есть 3 способа, нативное копирование области памяти, специальной функцией копирования строк, посимвольный перебор массива и запись в dstr
memcpy(&str, &dstr, strlen(str) + 1); // Копирование области памяти

strcpy(dstr, str); // Специальная функция для строки

// Перебор массива циклом.
int strsize = strlen(str) + 1; for(int i = 0; i < strsize ; i++) { dstr[i] = str[i]; }
Имейте ввиду, в обоих случаях вы должны быть уверены что размер dstr больше на 1 чем длина строки str

c# переопределение ToString() для коллекции

Как можно переопределить метод ToString() для коллекции?
List spisok = new List(); for (int i = 0; i < 20; i++) spisok.Add(new Place(PlaceStatus.Free));
Я хочу при вызове spisok.ToString() я получал String формата 0,0,0,0 (т.е. элементы через запятую)
Или для такой коллекции аналогично
var spisok = new Place[20]; for (int i = 0; i < 20; i++) spisok[i] = new Place(PlaceStatus.Free));
Ниже код используемых элементов. В классе попытался перегрузить метод ToString(), он выдает числовые значения, когда объект 1. Но в случае с массивом, это текст - запись о классе
public enum PlaceStatus { Free, Booked, Paid, Confirmed } public class Place { public PlaceStatus Status { get; set; }
public Place(PlaceStatus status) { Status = status; }
public override string ToString() { return ((int)Status).ToString(); } }


Ответ

Создайте статический класс-helper. Это будет выглядеть примерно так:
public static class PlaceCollectionHelper { public static string ToString(this IEnumerable Collection, string Separator) { return string.Join(Separator, Collection); } }
И далее используйте в своём коде:
string spisokStr = spisok.ToString(",");

UPD: Предыдущий вариант является расширением, так как явно переопределить ToString() у существующей коллекции нельзя. Однако если Вам необходимо, чтобы сторонние методы могли вызывать нужное Вам преобразование Вашей коллекции в строку, придется создавать новый тип, который будет наследоваться от типа нужной Вам коллекции. Здесь есть 2 пути. Давайте рассмотрим их.

0) Самым лаконичным решением будет то, которое представлено в соседнем ответе:
public class PlaceCollection : List { public override string ToString() { return string.Join(", ", this); } public string ToString(string Separator) { return string.Join(Separator, this); } }
Вы просто создаете класс, который наследуется от листа с нужным Вам типом, где и переопределяете ToString() нужным Вам образом. Как Вы понимаете, работает эта конструкция точно так же, как и обычный лист:
PlaceCollection collection = new PlaceCollection { new Place(PlaceStatus.Free), new Place(PlaceStatus.Booked) }; collection.Add(new Place(PlaceStatus.Paid));
Однако теперь, если Вы вызовете, скажем, Console.WriteLine, которая при передачи в нее объекта автоматически вызывает у него ToString(), то получите уже:
Console.WriteLine(collection); // 0, 1, 2

1) Предыдущий вариант подойдет Вам лишь в том случае, если в качестве коллекции Вы используете List. Однако в Вашем втором примере ясно видно, что Вы так же используете и массив для своих целей. Так что в решении Вашей задаче нам поможет наследование от generic-интерфейса IEnumerable
public class PlaceCollection : IEnumerable { #region Var private IEnumerable Collection { get; set; } #endregion
#region Init public PlaceCollection(IEnumerable Collection) { this.Collection = Collection; }
public static implicit operator PlaceCollection(List Collection) { return new PlaceCollection(Collection); } public static implicit operator PlaceCollection(Place[] Collection) { return new PlaceCollection(Collection); } #endregion
#region Functions public IEnumerator GetEnumerator() { return Collection.GetEnumerator(); } IEnumerator IEnumerable.GetEnumerator() { return Collection.GetEnumerator(); }
public override string ToString() { return string.Join(", ", Collection); } public string ToString(string Separator) { return string.Join(Separator, Collection); } #endregion }
Доступ к элементам можно производить при помощи Linq, либо же дописать свои индексаторы. В данном классе реализовано неявное приведение, так что Вы вполне можете сделать так:
Place[] placeArray = new Place[] { new Place(PlaceStatus.Free), new Place(PlaceStatus.Booked) }; PlaceCollection collection = placeArray;
Или так:
List placeList = new List { new Place(PlaceStatus.Free), new Place(PlaceStatus.Booked) }; PlaceCollection collection = placeList;
Однако результат все равно будет один:
Console.WriteLine(collection); // 0, 1
И так как наследовались мы от IEnumerable, то Вам доступно получение энумератора:
foreach (Place p in collection) Console.WriteLine(p); // 0 // 1

Выбирайте наиболее удобный Вам метод и удачи в Ваших решениях)

Перечислить все поля и их значения C#

Нужно для отладки прочитать название всех полей класса и их значения. Ну например, имеется экземпляр класса dog
class dog { public int age = 3; public string name = "barboss"; public bool isHungry = false; }
Как мне, не зная сходу названия полей, просто получить на выходе что то типа такого
dog:{int age 3, string name "barboss,bool isHungry false};


Ответ

object bobik = new dog(); foreach(FieldInfo field in bobik.GetType().GetFields()) { Console.WriteLine("{0} {1} {2}", field.FieldType, field.Name, field.GetValue(bobik)); }

Сколько в интервале [a; b] - числа, которые делятся на 7 без остатка

Напишите программу, которая считывает числа a, b (100 #include
using namespace std;
int main() { int a, b; int sum=0; cin >> a >> b; for (int i = a; i <= b; ++i) { if (i % 7 ==0) { i++; cout << sum << ' '; } } return 0; }


Ответ

Код:
#include
using namespace std;
int main() { int a, b; int number = 0; cin >> a >> b; for (int i = a; i <= b; i++) { if (i % 7 == 0) { number++; cout << i << ' '; } }
cout << "
"; cout << "number: " << number << "
";
return 0; }
Ссылка на код, чтобы поиграться: https://ideone.com/ctv16G

Добавить \n к ответу в определенных местах

Есть ответ сервера JSon со временем работы, в частности такого вида.
info_worktime":"Пн 9 00 17 30 12 30 13 15|Вт 9 00 17 30 12 30 13 15|Ср 9 00 17 30 12 30 13 15"
Вопрос как добавить вместо/или за разделителем перенос на новую строку? Что бы каждый день был с новой строки а не разделен знаком |
Код геттера:
@SerializedName("info_worktime") private String infoWorktime; public String getInfoWorktime() { return infoWorktime; }


Ответ

Чтобы заменить строку нужно использовать String.replace
String infoWorktime = "Пн 9 00 17 30 12 30 13 15|Вт 9 00 17 30 12 30 13 15|Ср 9 00 17 30 12 30 13 15"; String correctString = infoWorktime.replace('|', '
'); System.out.println(correctString);
replaceAll принимает регулярное выражение, что в данном случае не требуется. В регулярных выражениях | используется как оператор «или», что, по-видимому, сбивает с толку парсер.

Enum для каждого enum

Собственно, вопрос, как это выглядит? Для примера возьмем: public enum Transport{ SHOTGUN, RIFLE, MINIGUN } И вот для каждого перечисления нужно задать еще один enum для конкретной модели. Как это будет выглядеть и как к этому обращаться? изначально мне кажется что должна присутствовать строка public Transport(Enum type){this.type = type}; Но ведь для каждого перечисления будет свое перечисление. И перечисление нельзя наследовать. Подскажите.


Ответ

Определите интерфейс, который должны будут реализовывать ваши вложенные перечисления. public enum Transport { SHOTGUN(Type1.T11), RIFLE(Type2.T21), MINIGUN(Type3.T31);
private Weapon weapon;
Transport(Weapon weapon) { this.weapon = weapon; }
public interface Weapon {};
public enum Type1 implements Weapon { T11, T12; }
public enum Type2 implements Weapon { T21, T22; }
public enum Type3 implements Weapon { T31, T32; } }

Почему метод, реализующий интерфейс, не может возвращать дочерний объект?

Допустим есть класс А, реализующий интерфейс I interface I { } class A : I { } Теперь сделаем интерфейс с функцией foo, возвращающей I interface IGetter { I foo(); } И попытаемся его реализовать. class Getter : IGetter { public A foo() { return new A(); } } На что получим ошибку компиляции мол «класс Getter не реализует интерфейс IGetter». И пойдём писать явную реализацию интерфейса, являющуюся обёрткой вызова foo() I IGetter.foo() { return foo(); } Но зачем это? С какой целью стандарты не разрешают в качестве возвращаемого типа иметь тип, неявно преобразующийся к исходному? UPD: вопрос сугубо о причине описанного запрета. Пожалуйста, не предлагайте способы его обойти, их я и сам могу придумать с десяток.


Ответ

С какой целью стандарты не разрешают в качестве возвращаемого типа иметь тип, неявно преобразующийся к исходному? С целью запрета ковариации и контрвариации для переопределений методов и реализаций интерфейсов. Более подробно описано в книге C# in Depth(2-е издание), подраздел 2.2.2. "Нехватка ковариантных типов возвращаемого значения".

Зачем нужны побитовые операторы и что они фактически делают в Си?

Здравствуйте! Объясните, пожалуйста, для чего нужны побитовые операторы и каков принцип их работы? Я уже несколько раз перечитывал главу K&R и читал в сети, но не пойму их. Если можно, с практическими примерами. Спасибо за понимание.


Ответ

Принцип работы предельно прост: идёт работа с битами целых чисел. Есть, например, число 10, оно в двоичной будет 1010, значит если это int (4 байта, 32 бита), то это будет: 0000 0000 . 0000 0000 . 0000 0000 . 0000 1010 Есть ещё, например, число 7. Оно будет равно: 0000 0000 . 0000 0000 . 0000 0000 . 0000 0111 Можно произвести конъюнкцию 7 & 10, т.е. поставить эти числа друг над другом и провести конъюнкцию каждого бита одного числа с соответствующим ему битом другого числа. Будет: 0000 0000 . 0000 0000 . 0000 0000 . 0000 0010 Такая же логика с "или", т.е. '|' и со "сложением по модулю 2", т.е. "^". В инете куча инфы, разумеется. Можете прочитать ещё про сдвиг (bitwise shift). Используется в комбинаторике, есть много примеров, например в алгоритме генерации множества всех подмножеств (используется и "сдвиг" и "побитовое и"). Или, может быть тоже будет интересно разобраться: бинарный алгоритм нахождения НОДа двух чисел

Где хранить общие для всех приложений теги шаблонов?

В документации сказано, что теги нужно хранить в папках templatetags приложений, но бывают теги, которые нужно использовать во всём проекте. Понятно, что можно раскопипастить всё по приложениям, но это не красиво :( Есть ли правильное решение этой проблемы?


Ответ

Мы для этих целей используем приложение utilites, вы можете назвать его как-нибудь еще. И там уже создавать теги, методы и классы, необходимые для работы другим приложениям. Копипастить конечно же ничего не надо. Просто в нужных вам местах делаете импорт необходимых модулей. В шаблонах соответственно load.

Управление процессами или одно задание на всех

Есть N-е количество процессов (не важно, треды, форки или просто программы). Им всем надо передать какую-то информацию, например, о неком событии. То есть, нужно чтобы было одно место, откуда они все должны брать информацию. Как это обычно реализуется?


Ответ

Ищите в сторону словосочетаний «publish-subscribe» и «message bus.» Там много можно найти вариантов, выбирайте на вкус и под задачу. Например, Если похитрее, и чтобы с очередями и подтверждением доставки — AMQP-сервер, скажем, RabbitMQ. Или не AMQP а STOMP использовать. Если более примитивно — Redis, например, да. Опять же, иногда все уже есть в системе. Например, часто можно встретить D-Bus на *nix'овых десктопах. Правда D-Bus по сети — это (хоть и возможно) очень, очень через задницу и только после огромного напильника, так что решение только в пределах одной машины. А если в конторе есть XMPP-сервер — оно тоже можо использовать. Если без сервера — у 0MQ (aka ZeroMQ) есть pub/sub возможности. Или вообще старые добрые (но малоизвестные) POSIX message queues, если надо в пределах одной машины.

Как выбрать первую запись ассоциативного массива?

$array=array(); $array[key]='val'; $array[keya]='val1'; $array[keyb]='val2'; Как выбрать первый элемент? $array[0] не работает ...


Ответ

Если надо получить значение первого элемента массива, не зная его ключа, то можно использовать функцию array_shift(), но не всегда удобна тем, что этот элемент, она как бы вырезает из массива: $array=array(); $array[key]='val'; $array[keya]='val1'; $array[keyb]='val2';
$first= array_shift($array); echo $first; // val print_r($array); // что осталось в массиве Array ( [keya] => val1 [keyb] => val2 ) Второй способ - это использовать указатель current $array=array(); $array[key]='val'; $array[keya]='val1'; $array[keyb]='val2';
//reset($array); // можно использовать для полной уверенности, что указатель будет на первом элементе массива (не принципиально) echo current($array); // val

Книга про профессиональный JavaScript

Я прочитал "JavaScript руководство программиста" и потом ~год практиковался Я знаю клиентский JavaScript на уровне 7 из 10 Раньше не имел практики Ajax (небыло сервера) теперь есть "сервер" (Denwer), Учу PHP и хочу создать крупный проэкт (уже начал) где мне потребуется отличное знание КЛИЕНТСКОГО JS на уровне отличного понимания работы библиотеки JQuery (например просматривая её код узнал новые незнакомые ключевые слова (delete например) ) И уметь создавать кроссбраузерные так же использующие и современные технологии скрипты. У меня есть "книга с носорогом" я начал её читать но она мне не понравилась... Посоветуйте пожалуйста книгу по JS (очень желательно на русском) типа "сборник рецептов с описанием" про технологии клиента (и различии работы с ними в разных браузерах) и клиент-серверные технологии и всякие "фишки" js (Например я с удивлением узнал в википедии (о PHP) про любой_сценарий.php?=PHPE9568F36-D428-11d2-A769-00AA001ACF42) PS: под на уровне отличного понимания работы библиотеки JQuery имеется в виду знание тех принципов и методов которые использовал автор этой библиотеки при её написании, а не "умение пользоваться ею".


Ответ

имеется в виду знание тех принципов и методов которые использовал автор этой библиотеки при её написании, а не "умение пользоваться ею". То есть вы хотите понять как на javascript написать аналог jquery? Для этого следует почитать в книге с 'носорогом'(Javascript - подробное руковоство Д. Фленаган 5-е издание) главы 7,8,9 Объекты и массивы, функции, классы конструкторы и прототипы. Если не усвоить ООП, то понимание принципов работы Jquery никогда не придет, сколько ни практикуйся. А для успешного завершения серьезных самописных проектов, создающихся в одиночку, рекомендуется хорошо знать C++, так как это дает понимание функционирования высокоуровневых языков и многих концепций программирования, в том числе и ООП.

Запись в файл с новой строки

Скажите, пожалуйста, скрипт для записи в файл с новой строки есть файл "file.txt" и текстовое поле "info".


Ответ

$fp = fopen('file.txt', 'a'); fwrite($fp, $_POST['info'] . PHP_EOL); fclose($fp);

Список @идентификаторов , TODO или что это такое?

Я видел что в некоторых исходных кодах JS например JQuery комментируют так:
// Define a local copy of jQuery
но это просто строка для людей а
// TODO:
это уже обнаруживается большинством IDE но JS не типизированный язык поэтому спрашиваю про другие например я видел в некоторых исходных кодах на Java (в основном помоему) или C++ (какой код здесь и придумал) в комментариях вставляют описания определяемых ф-ции и т.д. примерно (взял с потолка потому что не знаю что это такое и Java) так:
/* @function getSquare @args: @x int @returns int */ int getSquare(int); ... int getSquare(x){ return x*x; }
Что это вообще такое за @... все поисковики уже измучал не нашёл мне кажется что есть и @TODO просто в JS @ можно опускать. Или @ это что то типа директивы препроцессора в Java (типа # в c++) или это надо применять в документации а не в исходном коде? Сильно не пинайте я уже спрашивал Научиться писать документацию и хорошо комментировать код только про JS и только @lampa сказал
У вас что, на калькуляторе поиск сломался?
а @Котик:
Ахаха
но это было про JS а этот вопрос про C++ Java etc. Вопрос к профессионалам объясните что за @... и т.д и какие можно в исходном коде и документации использовать ключевые слова


Ответ

Говоря простым языком, это называется самодокументированием кода в стиле JavaDoc Пример: class Test {
/** * Разделить одно число на другое * * @param int x * @param int y * @return int */ public int divide(int x, int y) { return x/y; } } Где все, что начинается с "собачки" - называется тегами описания. Из примера: Эти теги, они стандарты. Не нужно придумывать своих. Самые основные: Тег @param int x - означает какой параметер будет передам в функцию Тег @return - означает какое возращаемое значение мы ожидаем Тег @author - означает кто автор Тег @copyright - Авторские права Тег @license - Лицензия Тег @version - Версия итд их много, если нужны все в гугл: JavaDoc Style JavaDoc Style используется не только в Java, но также и в C#/C/C++ и PHP для само-документирования классов и методов. Некоторые используют даже в JavaScript. Это нужно для того чтобы, облегчить чтение/понимание кода. Это общепринятый стандарт/правило для документирования своего кода.

Список глобальных переменных

Имеется больше тысячи cpp файлов, необходимо в текстовом файле вывести список всех глобальных переменных. Есть ли специальный софт для решения подобной задачи? Или необходимо писать свой скрипт?


Ответ

Вот, поподробнее об использовании nm (см. man nm) для получения списка глобальных переменных, определенных в заданных .cpp файлах. Я подразумеваю, что интересны только переменные (и константы), но не функции. Для примера сделаем пару С++ файлов. // ext1.cpp #include
using namespace std;
int esum, e1 = 1; extern int e2;
int const econ1 = 2; // в c++ это НЕ ГЛОБАЛЬНАЯ КОНСТАНТА !!! extern int const econ; // а это ГЛОБАЛЬНАЯ(!!!), но не определенная здесь
void sumext();
int main () { sumext(); // помещает сумму всех глобальных (кроме esum) в esum cout << "DoubleSum: " << esum + econ + e1 + e2 << '
'; }
// ext2.cpp extern int esum, e1; int e2 = 2;
extern int const econ = 3; // ГЛОБАЛЬНАЯ КОНСТАНТА, определена здесь
void sumext() { esum = e1 + e2 + econ; } Оттранслируем их, получив объектные файлы ext1.o и ext2.o avp@avp-ubu1:~/hashcode$ g++ -c ext1.cpp ext2.cpp и посмотрим на вывод утилиты nm avp@avp-ubu1:~/hashcode$ nm ext[12].o
ext1.o: 000000000000009f t _GLOBAL__sub_I_esum 000000000000005f t _Z41__static_initialization_and_destruction_0ii U _Z6sumextv 000000000000000c r _ZL5econ1 U _ZNSolsEi U _ZNSt8ios_base4InitC1Ev U _ZNSt8ios_base4InitD1Ev U _ZSt4cout 0000000000000004 b _ZStL8__ioinit U _ZStlsISt11char_traitsIcEERSt13basic_ostreamIcT_ES5_PKc U _ZStlsISt11char_traitsIcEERSt13basic_ostreamIcT_ES5_c U __cxa_atexit U __dso_handle 0000000000000000 D e1 U e2 U econ 0000000000000000 B esum 0000000000000000 T main
ext2.o: 0000000000000000 T _Z6sumextv U e1 0000000000000000 D e2 0000000000000000 R econ U esum Легко заметить, что инициализированные переменные e1 и e2 отмечены флагом D, неинециализированная переменная esum отмечена флагом B, а глобальная константа флагом R. В файлах, где эти переменные и константа являются внешними, они отмечены флагом U. Для первого приближения к решению можно написать скрипт на awk avp@avp-ubu1:~/hashcode$ for i in ext[12].o; do echo Global variables defined in $i; nm $i | awk 'NF == 3 && ($2 == "D" || $2 == "B" || $2 == "R") { print $2 " " $3 }'; done Global variables defined in ext1.o D e1 B esum Global variables defined in ext2.o D e2 R econ Ну и наконец, сделать исполнимый модуль и посмотреть, работает ли программа avp@avp-ubu1:~/hashcode$ g++ -o ext12 ext1.o ext2.o avp@avp-ubu1:~/hashcode$ ./ext12 DoubleSum: 12 avp@avp-ubu1:~/hashcode$

Возврат объекта типа T

Имеется такой код: public static FrameworkElement GetParentOfType(FrameworkElement element) { if (element is T) return element; while (true) { element = element.Parent as FrameworkElement; if (element is T) break; } return element; } ... MyPanel myPanel = (MyPanel)GetParentOfType(myTextBox); MyLabel myLabel = (MyLabel)GetParentOfType(myTextBox); ... Но мне хотелось бы сделать что то вроде этого: public static T GetParentOfType(FrameworkElement element) { if (element is T) return element as T; while (true) { element = element.Parent as FrameworkElement; if (element is T) break; } return element as T; } ... MyPanel myPanel = GetParentOfType(myTextBox); MyLabel myLabel = GetParentOfType(myTextBox); ... Но как хотелось бы не работает. Где об этом почитать или как быть? Сам искать пытался, но как правильно сформулировать запрос не знаю.


Ответ

Надо вот как: public static T GetParentOfType(FrameworkElement element) where T : FrameworkElement { if (element is T) return element as T; while (element != null) { element = element.Parent as FrameworkElement; if (element is T) break; } return element as T; }

Алгоритм: все возможные целые из наборов от .. до

Вроде простая задача, но что-то лыжи не едут. Дан массив диапазонов — пар мин. и макс. значений. Только целые числа. Нужно найти все возможные целые, получаемые суммированием «допустимых» значений из произвольного комплекта идущих подряд диапазонов, по одному из каждого участвующего. Например, дано три диапазона: [{"min":1,"max":2},{"min":3,"max":4},{"min":5,"max":6}] Можно получить числа [1, 2, 3, 4, 5, 6, 8, 9, 10, 11, 12]. На деле пар больше, значения веселее. Может, есть известный красивый алгоритм? В общем смысл моего, далеко не оптимального, решения, такой (перебор): распаковать пары min:max до массивов допустимых значений [[1,2],[3,4],[5,6]] перебирать массивы слева направо; для каждого варианты глубины вправо от 0 (только себя), до правого края; перебрать все возможные комбинации значений между этими массивами, по одному зн. из каждого. Суммировать, уникальные значения сохранить в результат. Интересно ещё решить обратную задачу: даны опять эти пары, и число. Разложить его в идущие подряд допустимые значения. Усложнённая условием про «подряд» Subset Sum Problem? Подскажите, как называются алгоритмы для похожих задач?


Ответ

Складывая два интервала [a,b]+[c,d] получим итервал [a+c,b+d], если интервалов больше то будет [a1+a2+...+an,b1+b2+...+bn]. Таким образом мы избавляемся от лишних вычислений, в частности от рекурсии совсем. Нам достаточно знать для каждой комбинации интервалов сумму их минимумов и сумму их максимумов. Чтобы перебрать все комбинации интервалов будем двигать границы в списке интервалов. Т.е. сначала будем смотреть первый интервал, потом первый и второй, потом с первого по n-й, затем второй, со второго по третий и т.д. var a = [{"min":2,"max":3},{"min":2,"max":2},{"min":2,"max":2}]; var a_l = a.length; var res = []; for (var i=0;i

Пакеты склеиваются

public class NetCon extends Thread {
String address = "127.0.0.1"; int port = 3458;
private DataInputStream in; private DataOutputStream out;
public ArrayList queue;
public Boolean Connect() { try { InetAddress ipAddress = InetAddress.getByName(address); Socket socket = new Socket(ipAddress, port);
InputStream sin = socket.getInputStream(); OutputStream sout = socket.getOutputStream();
in = new DataInputStream(sin); out = new DataOutputStream(sout);
queue = new ArrayList(); } catch (Exception e) { return false; } return true; }
public void SendText(String s) { try { out.write(s.getBytes("UTF-8")); out.flush(); } catch(Exception e) { System.out.println(e); } }
@Override public void run() { for(int i = 0; i < queue.size(); i++) { //System.out.println(queue.get(i)); //если убрать коммент. то ок SendText(queue.get(i)); } }
} В queue находится две строки "test1", "test2". Запускаю поток, идёт отправка на сервер. Проблема в том, что иногда получаю 2 пакета как и положено, первый пакет со строкой "test1", второй с "test2", а иногда проскакивает что получаю пакет "test1test2". Если перед отправкой на сервер выводить на экран, то получается маленькая задержка и работает тогда всегда правильно. Почему между пакетами нужна эта пауза? Как сделать нормально? Вот фрагмент кода сервера C# (TcpClient) NetworkStream ns = client.GetStream(); byte[] buffer = new byte[1024];
int count; while ((count = ns.Read(buffer, 0, buffer.Length)) > 0) { Console.WriteLine(BitConverter.ToString(buffer, 0, count)); Console.WriteLine(Encoding.UTF8.GetString(buffer, 0, count)); ns.Flush(); }


Ответ

Скорость сокета - непредсказуемая штука. Бывает, что пакет пришел ещё не весь, а программа уже читает буфер - пакет получен не весь, а следующий искажен. Бывает, что программа не дернула буфер сокета вовремя, и пришел ещё один или больше пакетов. Программа дергает буфер - и получает склеившиеся пакеты. Всё дело в устройстве TCP/IP, и вытекающем из него устройстве сокета и его буфера. Сетевые пакеты ни как не обозначают свою длину, если програмист не позаботился об этом. В сокет приходит байт, и он сразу помещается в конец своего буфера. Не имеет значения, пришел один байт или миллион. Когда программа вызывает метод чтения, если не указана читаемая длина - возвращается весь буфер в обратном порядке, а если указана - то байты от нулевого до указанного в обратном порядке. Таким образом программист сам обязан обозначивать размер или диапазон байтов в пакете. Решений несколько. От самых неправильных к наиболее подходящему: 1) Фиксировать размер пакета. Встречал несколько раз в чужом коде. Наличествует ещё и свой буфер, в который до нужного заполнения сливают данные буфера сокета, и читают нужными порциями. Стоит ли говорить, что вещь ужасно хардкодная? 2) В пакете означают его конец, к примеру каким-нибудь сочетанием 00-FF-00-FF. Встречал 2 раза. Велосипедизм. Возможны ложные срабатывания детектора конца пакета. 3) Первыми двумя (или четырьмя, если пакет планируется длинным) байтам обозначают либо размер всего пакета, либо размер "полезной части. Программа в цикле ждет 2 байта в буфере сокета, и читает их. Далее программа ждет появления N байтов или больше в сокете, где N - цифра, прочтенная из первых двух байтов. Далее программа читает N байт в свой буфер, и обрабатывает их. Цикл входит в новую итерацию. Помогать конкретным кодом не стану, если автор не попросит этого прямо. Я пропагандирую самостоятельное развитие ума с возможными подсказками. Добавлено: Вспомнил, что встречал ещё одну разновидность велосипедизма, похожую на ответ ниже. В первых 4 байтах передавался идентификатор пакета (обычный int), он передавался в обработчик пакетов, где свитчем выбирался нужный, создавался экземпляр этого пакета, в конструкторе читалось нужное количество байтов, и пакет обрабатывался. Самое смешное, что такой велосипед присутствует в одном, довольно известном и, пожалуй, знаменитом, приложении. Сообщить название продукта и производителя не могу по причине NDA. В принципе, такой метод вполне жизнеспособен, и, возможно, полностью пропитан духом ООП, но мне он кажется через чур странным... Ведь одио из основных негласных принципов ООП является отсутствие хардкода, а в таком решении размер пакета захардкожен.

Определить день недели по дате

На странице анкеты имеется пункт дата рождения. При отправке анкеты необходимо чтобы рядом с датой рождения прописывался день недели. Нашла вот такое решение в интернете, но это лишь с текущей датой прокатывает.Как сделать так, чтобы при выборе на начальной странице в календаре выводилась именно выбранная дата, а не текущая?


Ответ

День недели даты можно узнать следующим образом $date = '2013-01-01'; echo strftime("%a, %d/%m/%Y", strtotime($date));

(JAVA) В какой области памяти хранятся статические поля класса?

(JAVA) В какой области памяти хранятся статические поля класса?


Ответ

В Heap в области Permanent Generation. Хотя стоит заметить, что для самих объектов, на которые ссылаются статические поля, память может быть выделена и в других областях heap.

Как хранятся типы в object[] ?

Есть код static void Main(string[] args) {
object[] objects = new object[] {1, "asd", 'a'}; foreach (var elem in objects) { Console.WriteLine(elem.GetType().ToString()); }
Console.ReadKey(); } Выводятся типы System.Int, System.String, System.Char. Вопрос - откуда компилятор знает о типах если явного приведения нет, обратиться из кода к методам объектов нельзя (кроме обжектовских). Мне казалось, что должны вывести System.Object, однако выводит правильно.


Ответ

Смотрите. В .NET (как и в любом объектно-ориентированном языке) переменная-ссылка базового типа может указывать на объект производного типа. Вспомним, что в .NET object является предком всех типов. Это значит, что переменная может содержать фактически любой тип. Итак, у нас есть различие между compile-time-типом (тип ссылки) и runtime-типом (фактическим типом объекта, на который эта ссылка ссылается). Теперь, GetType(), согласно документации, возвращает именно runtime-тип, то есть настоящий тип объекта по ссылке. Каким именно образом это реализовано, для программиста не должно быть важно. На самом деле, каждый объект в .NET неявно хранит указатель на таблицу с метаданными, в которых описан его тип — но это деталь конкретной реализации, на которую опираться не стоит.

Объявление неизвестного типа в интерфейсе

Здравствуйте! Подскажите пожалуйста решение такой задачи: interface IModel{ public int getId(); }
class modelA implement IModel{ private int id; public int getId(){ return id; } }
class modelB implement IModel{ private String id; public String getId(){ return id; } } Как мне в интерфейсе сказать, что getId() может возвращать как int, так и String?


Ответ

Думаю, имеет смысл сделать два интерфейса, один из которых будет содержать int getId(), а второй String getId(). Если же помимо этого метода интерфейс должен содержать еще какие-то другие, то имеет смысл сделать один общий интерфейс с общими методами, а от него наследовать два интерфейса-потомка, у одного из которых будет метод int getId(), а у другого string getId(). Я надеюсь, Java позволяет наследовать интерфейсы друг от друга? Если же не позволяет, то можно вынести все общие методы в один интерфейс, а два отличающихся разнести по отдельным. Не думаю, что введение одного-двух новых интерфейсов будет трагедией, особенно на фоне предлагавшихся ранее манипуляций с приведением и/или выдиранием нужного значения из строки

Продвижение Андроид-приложения [закрыт]

Написал своё первое приложение, это секундомер с таймером. Теперь хочу выложить его в Play Market и даже не знаю, что дальше. Основа — платная версия, но думаю сделать ещё урезанную бесплатную.
В общем, как я понял, это очень ответственный шаг (очень часто приходится видеть плохие приложения чуть ли не в топе, а хорошие и интересные приложения всего с 10—50 загрузками). Но вот не знаю, что делать в первую очередь? Где выкладывать обзоры? Стоит ли вкладывать деньги в продвижение (изначально решил продвигать бесплатно)? Приложение имеет и английскую версию, и если с русскоязычной ещё более-менее понятно, то с английской полный ноль.


Ответ

Без лайт версии - не будет работать Запостите лайт версию в разные аппсторы (сейчас их много). Навскидку: Amazon, Samsung Apps, GetJar, Appoke и проч. Русскую версию выложите на 4PDA Прочтите книгу про маркетинг Android апп Не ленитесь отвечать на сообщения юзеров

Автоустановка расширения для google chrome

Как установить расширение в браузер хром программным путем. Запуск файла на компе → расширение добавлено в хром
Как это реализовать, какой файл в хроме отвечает за управление установленными расширениями?
Кое как разобрался с документацией, создал файл nojpnepbplnoojhiinbpegidccgolald.json (в качестве имени использовал id приложения, его получил установив плагин к себе в хром и скопировав его id) в папке
C:\Users\<имя пользователя>\AppData\Local\Google\Chrome\Application\31.0.1650.63\Extensions
со следующим содержанием:
{ "external_crx": "C:\Sdsattings.crx",
"external_version": "1.0" }
crx файл разместил на диске C, перезапускаю хром и ничего не происходит


Ответ

Приветствую.
В целях безопасности в Chrome на Mac / Windows можно устанавливать расширения только с Chrome Web Store. Т.е. по факту в Chrome добавляется информация о том какое расширение надо обновить и после запуска браузера он подгружает расширение.

Windows
1.1. В Windows установка происходит через реестр в раздел:
32-bit HKEY_LOCAL_MACHINE\Software\Google\Chrome\Extensions 64-bit HKEY_LOCAL_MACHINE\Software\Wow6432Node\Google\Chrome\Extensions
1.2. Создать новый ключ (папка) вида aaaaaaaaaabbbbbbbbbbcccccccccc (ID расширения в Chrome Web Store)
1.3. Внутри этого ключа создать свойство update_url со значением https://clients2.google.com/service/update2/crx (ссылка на Chrome Web Store) Mac
2.1. Создать файл типа aaaaaaaaaabbbbbbbbbbcccccccccc.json (ID расширения в Chrome Web Store)
2.2. Содержимое файла должно быть таким
{ "external_update_url": "https://clients2.google.com/service/update2/crx" }
2.3. Положить его в папку:
для определенного пользователя ~USERNAME/Library/Application Support/Google/Chrome/External Extensions/ для всех /Library/Application Support/Google/Chrome/External Extensions/ Вариант для Linux
Для Linux можно устанавливать как с удаленного источника, так и с локального .crx файла
3.1. Создать файл типа aaaaaaaaaabbbbbbbbbbcccccccccc.json (ID расширения)
3.2. Содержимое файла должно быть таким
при установке с локального файла
{ "external_crx": "/path/to/extension.crx", "external_version": "1.0" } при установке по ссылке (пример)
{ "external_update_url": "http://myhost.com/mytestextension/updates.xml" }
3.3. Положить файл в любую из папок (должен иметь права на чтение всеми):
/opt/google/chrome/extensions/
/usr/share/google-chrome/extensions/

Также возможно установить расширение простым открытием .crx файла из Chrome, если браузер запустить с флагом –enable-easy-off-store-extension-install

Как из консоли получить последнее вычисленное значение в интерпретаторе питона?

Запускаю интерпретатор: python
Потом пишу:
10 + 5 >>> 15
Я хочу использовать последнее вычисленное выражение 15 в качестве параметра в следующей строчке:
(?) * 2
B хочу получить на выходе:
>>> 30
Вопрос, что нужно написать вместо (?)?
Помню можно было как-то это сделать, но не могу найти как.


Ответ

Символ подчёркивания _. То есть, в вашем случае _ * 2

Передача переменных между функциями javascript

Например две функции: var func1 = function(var1, var2,..., varN) { var first = var1 + var2; var second = first + varN; .... }
var func2 = function() { } как-то можно передать переменные, например first во вторую функцию не объявляя её глобальной?


Ответ

Как вариант так: var func1 = function(var1, var2,..., varN) { var first = var1 + var2; var second = first + varN; .... return first; }
var func2 = function(getFirst) { var first = getFirst(var1, var2,..., varN); } Вообще, функция должна что-то принимать и что-то возвращать. Лучше будет даже так: var func1 = function (args) {var first; .....; return first}, func2 = function (first)) {};
func1(func1(args)); Во избежания такой некрасивой вложенности лучше использовать временные переменные: var func1 = ...., func2 = ......, first = func1(args); func2(first)

Каким образом оценивать сложность алгоритма в нотации О-больше?

Алгоритм поиска корня числа num. В алгоритме также используется sqrt, это приблизительный корень. function getsqrt (num, sqrt) { sqrt = 0.5*(sqrt+num/sqrt); var sqrtPrev = sqrt; while (Math.abs(sqrt-sqrtPrev) <= (sqrt-sqrtPrev)) { sqrtPrev = sqrt; sqrt = 0.5*(sqrt+num/sqrt); } return sqrt; } Какова сложность алгоритма? Линейная? Логарифмическая и т.д? Меня смущает просто деления на 2. Мне кажется, это линейная O(n)или логарифмическая. Обновление Мои рассуждения следующие: мы имеем один цикл, значит степень первая. Но я не уверен, что это линейная типа O(n). Потому что в задании есть 0.5*(sqrt+num/sqrt). Соответственно мне кажется, что это ускоряет поиск корня, нежели мы бы делили просто на 2 или методом перебора. Прав ли я, что это логарифмическая зависимость по основанию 2?


Ответ

Для Вашей функции сложно судить, какая у нее сложность - у Вас два аргумента. Поэтому, нужно либо фиксировать один аргумент, либо вводить зависимость между ними. Я использовал простое - sqrt = num/2. и пошел по самому простому пути - тестил на разных значениях аргумента и построить график (это один из способов узнать сложность). Мое мнение - сложность константная (или очень близка к ней). num десятые микросекунды (10^-7) 1 -> 32 2 -> 27 4 -> 24 8 -> 24 16 -> 23 32 -> 23 64 -> 23 128 -> 26 256 -> 24 512 -> 23 1024 -> 23 2048 -> 24 4096 -> 23 8192 -> 23 16384 -> 23 32768 -> 22 65536 -> 23 131072 -> 24 262144 -> 23 524288 -> 23 1048576 -> 24 2097152 -> 23 4194304 -> 24 8388608 -> 23 16777216 -> 23 33554432 -> 24 67108864 -> 23 134217728 -> 23 268435456 -> 24 536870912 -> 24 Как видно на первых проходах идет "прогрев" (это отрабатывает jit компилятор). Кстати, в Вашем коде есть одна ошибка - он иногда зависает. И зависает, если попытаться извлечь корень из числа, для которого он рациональный. (как минимум зависает на 4 и 10000). полный код для тестов и исправление (все тестилось на node.js). function getsqrt (num, sqrt) { sqrt = 0.5*(sqrt+num/sqrt); var sqrtPrev = sqrt; while (Math.abs(sqrt-sqrtPrev) < (sqrt-sqrtPrev)) { sqrtPrev = sqrt; sqrt = 0.5*(sqrt+num/sqrt); } return sqrt; }
function test(num) { var start = new Date(); for (var i = 0; i < 10000000; i++) { getsqrt(num, num / 2); } var end = new Date(); return end.setTime(end.getTime()-start.getTime()) }
for (var i = 1; i < 1000000000; i = i*2) { console.log(i + " -> " + test(i)); } P.S. В тегах указано с++, а код написан на JavaScript. Поэтому свой код я написал также на JavaScript. Обновление я разобрался, почему она константа. Потому что цикл обычно выполняется 1 раз или 0 (так у меня получается). Присмотритесь к условию while (Math.abs(sqrt-sqrtPrev) <= (sqrt-sqrtPrev)) sqrt-sqrtPrev используется в обеих частях! А если вспомните, то есть такое правило - не сравнивать на равенство вещественные числа (на больше-меньше можно, но осторожно, если числа близкие). Если там равно, то оно сработает только в том случае, если sqrt-sqrtPrev > 0 и немного повезет (на самом деле, если разница представима конечной двоичной дробью). Поэтому, сложность у алгоритма константная:).

Тестирование в Java

Начнём с того, что я новичок, пользуюсь IDEA. Интересуюсь, как разработкой оффлайн приложений, так и web-, даже про Android был бы не против, что-нибудь услышать, хотя и меньше, чем про первые два варианта. Напишу сначала, что я знаю о тестировании: 1) В некоторых книгах (и не только) рекомендуется такой подход к программированию, при котором перед тем, как писать непосредственно код, пишутся тесты. Если я правильно понял, тесты пишутся ко ВСЕМ классам, которые будут в коде. Но во первых, написание теста к классу требует такого же времени, что и написание самого класса, а иногда и гораздо большего. Во вторых, в тех ситуация, которые я учёл, класс будет функционировать исправно (за исключением опечаток), а в тех ситуациях, которые я не учёл, тест будет проходится успешно (т.к. они не заложены в тест). И в третьих, иногда не знаешь как будет выглядеть некий класс, до тех пор, пока его не реализуешь, более того, и после реализации будет много раз видоизменятся, иногда кардинальным образом - например: попробовал один подход - скорость отработки низкая, попробовал совершенно другой (с другим набором классов и интерфейсов) - выше. Так вот стоит ли прибегать к такому подходу? И как быть с учётом всего, выше написанного? Меня как-то панический страх берёт писать тесты все геттеры/сеттеры... 2) Слышал про автотестирование... даже видел обрывок записи, где записывался макрос мыши, как для автоматической прокачки персонажа в играх. Но знаю крайне мало, то, что мне попадалось выглядит сложно и непонятно, а самое главное не ясно, нужно ли это вобще... Просветите, как новичку воспользоваться автотестированием в различных ситуация (офф, web)? Какие программные инструменты для этого использовать? Какой русскоязычной литературой можно руководствоваться? 3) Может я ещё что-то упустил в области тестирования... Буду рад любым наставлениям ;)


Ответ

есты пишутся ко ВСЕМ классам писать тесты абсолютно на все - не самая здравая идея. в тех ситуация, которые я учёл, класс будет функционировать исправно не факт. У вас же нет никакой гарантии, что вы правильно реализовали "то, что учли". Проверить это как раз помогут тесты в тех ситуациях, которые я не учёл, тест будет проходится успешно (т.к. они не заложены в тест) разработчик обязан знать, что должен делать тот или иной его класс, соответственно, тестировать свои классы он должен на предмет соответствия этому "предназначению". Следовательно, описанная вами ситуация не имеет смысла иногда не знаешь как будет выглядеть некий класс, до тех пор, пока его не реализуешь см. выше - разработчик должен знать, что будет делать создаваемый им класс, и тестировать его именно с этой точки зрения. Следовательно, тестированию не особо интересны детали реализации этого класса (и возможные изменения в этой реализации) И наконец, не сочтите за занудство, но выглядит ужасно: не "координальным", а кардинальным, и не "просвятите", а просветите

Инспекция генератора имён

Написал я программу, выложил на гитхаб (https://github.com/KaPaHgaIII/namegenerator). Нет ли такого места, где можно показать свой код более опытным людям, чтобы указали на недочёты?


Ответ

1) cmdArguments.getGender().substring(0, 1).toLowerCase().equals("m") //жуть
cmdArguments.getGender() == Genders.MALE //старые добрые enum а вот в getGender нужно писать что-то типо этого switch(gender) { case "male": return Gender.MALE; //и т.п. 2) Random randomizer = new Random(System.nanoTime()); //мелкая придирка, но System.nanoTime() писать не обязательно 3) в for (int i = 0; i < cmdArguments.getCount(); i++) { System.out.println(engine.generateName(cmdArguments.getLength())); } System.out.println лучше выносить в отдельный метод, причём лучше в отдельный класс (правило mvc) 4) catch (FileNotFoundException e) { System.out.println(e); } catch (IOException e) { System.out.println(e); } меняем на catch (Exception e) { System.err.println(e); //обратите внимание на err } 5) readData("male_names.txt"); здесь тоже бы хорошо было бы заюзать enum. А вдруг в будущем вы будете считывать данные не с файла, а с интернета? Будете url каждый раз указывать? 6) огромное количество s.substring(i, i + 2); А почему +2, а не +3? Не помешал бы мелкий комментарий рядом 7) Отдельное текстовое пояснение как работает алгоритм. Иначе он будет понятен только вам 0) Но главное, после моих рекомендаций не превратиться в Бориса из известной статьи Как два программиста хлеб пекли

Как сделать счетчик уникальные просмотры на PHP?

Как сделать с помощью "ip" уникальные просмотры? $id = $_GET["id"]; qeurycount = mysql_query("SELECT count FROM news WHERE news_id='$id'",$link); $resultcount = mysql_fetch_array($qeurycount);
$newcount = $resultcount["count"] + 1;
$update = mysql_query ("UPDATE news SET count='$newcount' WHERE news_id='$id'",$link); }


Ответ

Здесь что-то не понятное, вам нужна уникальность по IP? Но где проверка IP вообще? Где запись, если этот IP пришел впервые?

Как изменить цвет подсветки таких же переменных в PhpStorm ?

Добрый день! Специально пересмотрел все заданные вопросы про PhpStorm (на сей момент их было 39) и не нашел ответа на свой вопрос. Имеется PhpStorm 6-ой версии с Default визуальной цветовой схемой. Создаю PHP файл и естественно, пишу PHP код. Предположим, выделяю переменную $a, PhpStorm подсвечивает другие переменные $a, однако очень тускло. Вопрос в следующем: как можно изменить цвет подсветки других таких же переменных ? (чтобы было ярко и четко подсвечивались) Копаюсь в Settings -> Editor -> Colors&Fonts -> PHP (все перебрал из списка, однако подсветку таких же переменных не смог пока найти... Подскажите пожалуйста что-нибудь по данному поводу. Заранее спасибо!


Ответ

IDE Settings - Editor - Colors & Fonts - General - Identifier under caret

Game development [закрыт]

Здравствуйте. Можете, пожалуйста, подсказать какую-то бесплатную литературу, онлайн уроки, или что-то подобное для ознакомления с темой: "Разработка игр под Android". С чего стоит начинать и куда двигаться дальше?


Ответ

Есть книга Марио Цехнера "Программирование игр под Андроид" (скачать). Вот еще пару ссылок, по которым я учусь: 1 тык; 2 тык; 3 тык; 4 тык; 5 тык

Bash скрипт - строчка, которая комментирует сама себя

Возможно ли написать на bash команду, которая комментирует сама себя в файле?


Ответ

Как мне кажется, я нашёл идеальное решение моей задачи. Тут самое главное переменная $LINENO, которая и показывает номер текущей строки в скрипте. Теперь можно делать скрипт, который после успешного выполнения команды сам себя комментирует. ls && sed -i ''$LINENO' s/^/#/' $0

Задача на скобочки

Задача: Некоторые скобочные структуры правильные, другие - неправильные. Ваша задача: определить, правильная ли скобочная структура. Вход: Слово в алфавите из двух круглых скобочек ( и ), [, ], {, }. Длина слова меньше 40001. Выход: Либо 'NO', либо 'YES' без кавычек. Вот текст моей программы, но она не проходит все тесты. Не пойму, где ошибка. И какие тесты она не проходит (не смог таких придумать). int main() { std::string s; std::cin >> s; std::stack < char > st; std::stack < char > st1; std::stack < char > st2;
bool f = true, g = true, k = true; int index = 0;
while (index < s.length() && f && g && k) { if (s[index] == ')') { f = (!st.empty()); if (f) st.pop(); } else if (s[index] == ']') { g = (!st1.empty()); if (g) st1.pop(); } else if (s[index] == '}') { k = (!st2.empty()); if (k) st2.pop(); } else if (s[index] == '(') { st.push(s[index]); } else if (s[index] == '[') { st1.push(s[index]); } else if (s[index] == '{') { st2.push(s[index]); }
index++; } std::cout << (((k && f && g && st.empty() && st1.empty() && st2.empty()) ? "YES" : "NO")) << std::endl;
} Прошу помощи. Обновление Программа работает, но на каких-то тестах она работает неправильно (при загрузке в систему проходят не все тесты). Какие там тесты, мне не известно. И я не могу выяснить, при каких условиях она ошибается, прошу помочь именно в этом. Просто хочу научиться работать со стеком. Не подумал о Вашем примере. Попробовал реализовать заново с помощью трех стеков, Ваш пример теперь работает правильно, но снова не проходит все тесты в системе. Код изменил в ответе. Посмотрите, пожалуйста.


Ответ

Я не вижу, чтобы у вас использовался флаг k в проверке while. Как вы думаете, что произойдет при входе "[{))" в вашу программу и является ли это правильным. Не указаны критерии правильности скобочных структур, к примеру, могут ли они быть пересекающимися. По хорошему, вам нужно считать количество каждого вида скобок, без всяких стеков и прочих наворотов: int round=0, rect=0, figure=0; Если опустилось ниже 0 во время прохождения, значит ошибка в структуре скобок и выполнить break, если по окончанию строки не все стали, снова равны нулю, тоже ошибка. UPDATE 1 (неверный) Тогда можно ограничиться одним стеком и организовать проверку только выталкиваемого из стека значения pop(), чтобы оно содержало аналогичную открывающую скобку. Ясли не ошибаюсь, этого достаточно: if (s[index] == ')') f = (!st.empty() && st.pop()=='('); if (s[index] == ']') g = (!st.empty() && st.pop()=='['); if (s[index] == '}') k = (!st.empty() && st.pop()=='{'); if (s[index]=='['||s[index]=='{'||s[index]=='(') st.push(s[index]); Соответственно проверка флагов в цикле и при выводе ответа (+ на пустоту стека) остается. UPDATE 2 (исправленный) @doomsday, прошу прощения, я не часто имею дело с С++, для возврата значения из стека надо использовать вместо pop() функция top(). То есть по идее следующий код должен решать поставленную задачу. #include #include #include
using namespace std;
int main(){ string str; stack st; int index = 0; bool f = true, g = true, k = true;
cin >> str;
while (index < str.length() && f && g && k) { char chr = str[index]; if (chr == '[' || chr == '{' || chr == '(') st.push(chr); if (chr == ')') f = (!st.empty() && st.top() == '('); if (chr == ']') g = (!st.empty() && st.top() == '['); if (chr == '}') k = (!st.empty() && st.top() == '{'); index++; }
cout << (k && f && g && st.empty() ? "YES" : "NO") << endl;
return 0; }

Удаление элементов в ArrayList

Как известно, после удаления элемента из середины списка ArrayList, часть массива, которая следовала после данного элемента, перезаписывается на позицию влево, чтоб перекрыть пустую ячейку. Если стоит задача удалить несколько элементов из середины списка одной операцией (т. е. чтоб избежать многоразовой перезаписи массива), как это можно сделать?


Ответ

Как обычно - наследованием: public class MyArrayList extends ArrayList { public void remove(int startIndex, int endIndex) { //здесь и придумывайте свой гениальный код } }

Вопрос про админки в Ruby On Rails

Здравствуйте, нужно понять, какая сейчас админка:
1) поддерживает Ruby On Rails последней версии под номером 4.2
2) русифицированная, вместе с ошибками валидации, либо понять как это сделать максимально просто и быстро и какими gem'ами нужно догнаться


Ответ

Хорошая админка - это Active Admin. Active admin документация
Все это ставится с гемом Devise. С моей версией ruby 2.2.1 версия Devise
gem 'devise', '~> 3.4.1'
хороший туториал по настройке Devise
В итоге в гем файле должно выглядеть как-то так:
gem 'activeadmin', github: 'activeadmin' gem 'devise', '~> 3.4.1'

Клонирование репозитория git в текущую папку

У меня хостинг timeweb, через панель управления создаю новый сайт, привязываю к нему домен, начинаю работать. По умолчанию для сайта создаётся папка с именем сайта site содержащая public_html т.е. корневую папку сайта и демо файлы которые можно сразу удалять, что я обычно и делаю.
Проблема вот в чём, есть существующий проект на github я через putty захожу в очищенную от демок директорию нового сайта site/public_html/ выполняю следующие команды:
git init git clone https://github.com/maler1988/cookies.git
клонируется репозиторий в результате в site/public_html/ создаётся папка cookies содержащая файлы фреймворка, index.php и пр., то есть те файлы, которые я бы хотел видеть в корне public_html. Как это можно сделать без использования трюков c .htaccess и пр.?


Ответ

git clone https://github.com/maler1988/cookies.git .
точка в конце обозначает, что нужно клонировать репозиторий в текущую папку

preg_match понимает не все русские буквы

Почему может быть, что
preg_match('/^[а-яА-ЯЁёa-zA-Z0-9_]+$/', $userName)
возвращает true для буквы "ПП","пп","УУ","еe","яя" и false для "тт", "уу","юю" и других?
Кодировка UTF-8. Php 5.2.17
Также я заметил, что strlen($userName), например, для "пп" = 4, а для "уу" = 2.
П.С. При этом
preg_match('/^[_0-9A-Za-zА-Яа-пр-яЁё]+$/', $userName)
работает.


Ответ

В PHP Регулярные выражения не работают с русскими буквами. Для работы с ними нужно использовать модификатор /u
u (PCRE_UTF8) Этот модификатор включает дополнительную функциональность PCRE, которая не совместима с Perl: шаблон и целевая строка обрабатываются как UTF-8 строки. Модификатор u доступен в PHP 4.1.0 и выше для Unix-платформ, и в PHP 4.2.3 и выше для Windows платформ. Валидность UTF-8 в шаблоне и целевой строке проверяется начиная с PHP 4.3.5. Недопустимая целевая строка приводит к тому, что функции preg_* ничего не находят, а неправильный шаблон приводит к ошибке уровня E_WARNING. Пятый и шестой октеты UTF-8 последовательности рассматриваются недопустимыми с PHP 5.3.4 (согласно PCRE 7.3 2007-08-28); ранее они считались допустимыми.
Источник
Пример:
preg_match( '/^([а-яА-ЯЁёa-zA-Z0-9_]+)$/u', $userName)

С#: передача параметров с POST запросом

Столкнулся с интересно задачей - требуется на сервер послать параметры и в ответ получить XML.
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(is_card_URL); request.Method = "POST";
byte[] bytes = Encoding.UTF8.GetBytes(params_); request.ContentLength = bytes.Length;
using (var stream = request.GetRequestStream()) { stream.Write(bytes, 0, bytes.Length); stream.Close(); }
HttpWebResponse response = (HttpWebResponse)request.GetResponse(); Stream stream2 = response.GetResponseStream(); StreamReader reader = new StreamReader(stream2);
string data = reader.ReadToEnd();
reader.Close(); stream2.Close();
Сам код работает, но нужно вместе с УРЛ также послать параметры (допустим, а,b,c) Я пробовал дописывать в УРЛ (...?a=1&b=2&c=3), но сервер не видит параметров, в ответе он пишет, что параметры не переданы.
Подскажите пожалуйста, как в данном случае можно передать параметры на сервер?


Ответ

Параметры для POST запроса передаются немного по-другому:
string postParameters = "a=1&b=2&c=3";
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(is_card_URL); request.Method = "POST"; request.ContentLength = postParameters.Length; using (var writer = new StreamWriter(request.GetRequestStream())) { requestWriter.Write(postParameters); }
Если передаваемая строка может содержать недопустимые символы, ее предварительно нужно закодировать:
string parameters = ...; string postParameters = HttpUtility.UrlEncode(parameters);
Дополнительно можно указать желаемую кодировку:
using (var writer = new StreamWriter(request.GetRequestStream(), Encoding.UTF8))
В общем случае, когда нужно передать произвольные данные, используется байтовый массив:
byte[] postData = ...; request.ContentLength = postData.Length; using (var stream = request.GetRequestStream()) { stream.Write(postData, 0, postData.Length); }
Тогда пример с передачей строки можно свести к следующему коду:
string parameters = ...; byte[] postData = Encoding.UTF8.GetBytes(HttpUtility.UrlEncode(parameters)); request.ContentLength = postData.Length; using (var stream = request.GetRequestStream()) { stream.Write(postData, 0, postData.Length); }

Как при установке приложения поместить его иконку на рабочий стол?

Пишу программу. Нужно чтобы при ее установке иконка появлялась на рабочем столе пользователя. Не могу найти как это сделать.


Ответ

Если приложение устанавливается из google play, то иконку на главный экран добавляет само приложение google play, делать это в приложении не нужно.
Эта возможность может быть отключена в настройках google play, но и в этом случае добавлять иконку самостоятельно не стоит.

Как понимается else if в C?

До этого немного учил Python (там "или если" такого не было) Сейчас учу C, читаю книгу и в примере написано else if - что это?
... if (c==...) state = OUT; else if (state == OUT){ state = IN; ...
UPD:
... while ((c = getchar()) != EOF){ ++nc; if (c=='
') ++nl; if(c==' ' || c== '
' || c=='\t') state = OUT; else if(state==OUT){ state = IN; ++nw; } }


Ответ

С одной стороны, вы можете смотреть на эту конструкцию, как на набор последовательно проверяемых условий:
if (cond1) // выполняется cond1? { code1; // да -> выполняем code1 } else if (cond2) // нет? проверяем дальше: выполняется cond2? { code2; // да -> выполняем code2 } else if (cond3) // нет? проверяем дальше: выполняется cond3? { code3; // да -> выполняем code3 } else { code4; // все проверки не прошли - выполняем code4 }
То есть это есть некий аналог switch
С другой стороны, в этой конструкции используется то, что else относится к ближайшему if, а значит, if после else — просто содержимое else-клаузы (которую можно для ясности отделить фигурными скобками):
if (cond1) { code1; } else { if (cond2) { code2; } else { if (cond3) { code3; } else { code4; } } }
Таким образом, мы остаёмся в пределах привычного if с двумя вариантами. Хотя так обычно не пишут, чтобы не плодить уровни вложенности.

Обновление:
Давайте разберём актуальный код:
while ((c = getchar()) != EOF) { // считать следующий символ и проверить // не кончился ли stdin ++nc; // увеличить счётчик символов if (c=='
') // если строка закончилась, ++nl; // увеличить счётчик строк if(c==' ' || c== '
' || c=='\t') // если текущий символ -- пробел, state = OUT; // перейти в состояние "между словами" else if(state==OUT){ // иначе текущий символ не пробел, и // если мы были в состоянии "между словами" state = IN; // то перейти в состояние "в слове" ++nw; // и увеличить счётчик слов } }
Судя по всему, это утилита wc?

Python2.7 ускорение работы кода, сложение огромных 2хмерных массивов

Есть два двумерных массива (например, ndarray):
3000х4000 (12 000 000 элементов) - 2,5D карта высот - назовем Массив1 100Х100 (10 000 элементов) - форма фрезы - назовем Массив2
Задача: нужно обойти "карту высот" "фрезой" и рассчитать 3й массив "оставшийся недорез" для каждого пикселя из Массива1.
Проблема в том, что получается 3000Х4000Х100Х100=120 000 000 000 точек, и над каждой нужно провести одну операцию вычитания, одну операцию сравнения на меньше, и несколько операций записи.
Python 2.7 делает это ооочень медленно(на моем компе рассчитывает около 14 часов)
Подскажите, пожалуйста, как можно ускорить работу python скрипта?
Используемый алгоритм простой:
Цикл X по СтрокамМатрицы1: #3000 Цикл Y по СтрокамМатрицы1: #4000 Цикл N по СтрокамМатрицы2: #100 Цикл M по СтрокамМатрицы2: #100 ВремТочка = матр1[X+N,Y+M] - матр2[N,M] Если Матр3[X+N,Y+M] > ВремТочка: Матр3[X+N,Y+M] = ВремТочка
В реальности есть еще несколько дополнительных операций, но на суть это не влияет.
Вот используемый код:
def get_rmf_map_tool(self,offset_image,tool_roughing,previous_offset,pixelstep_roughing):
#Dictionary faster then array map_tool1 = {} #numpy.zeros((self.w, self.h), numpy.float32) - self.image.min() y = x = 0 #init y,x for speed
ts_roughing = tool_roughing.shape[0]
max_line,max_pix = self.get_im_maxmin(self.w, self.h, ts_roughing)
jrange = self.mxrange(self.row_mill, max_line, pixelstep_roughing) irange = self.mxrange(self.row_mill, max_pix) ln = max_line
if prn_detal > 0: print "(Previous tool shape: {0} pixels, max line: {1}, max pixel: {2} )".format(ts_roughing,max_line,max_pix)
trange = xrange(0,ts_roughing)
for lin in jrange: #lines progress(lin, ln) for pix in irange: #pixels
if self.row_mill: y,x = lin,pix else: x,y = lin,pix
m1 = offset_image[y:y+ts_roughing, x:x+ts_roughing] hhh1 = (m1 - tool_roughing).max() + previous_offset
for i in trange: #lines tool for j in trange: #pixels tool
t = tool_roughing[i,j] if isinf(t): continue
ty = i+y tx = j+x # self.image[ty,tx] <= hhh1 !!! t >= 0 dt = -self.image[ty,tx] + hhh1 + t #dt = round(dt,16)
if dt < -epsilon and prn_detal > -1: print(" delta < -0.00001 ",ty,tx,dt,self.image[ty,tx], hhh1, t) if dt < .0: dt = .0
try: if map_tool1[ty,tx] > dt: #finde MAX for this pixel map_tool1[ty,tx] = dt except KeyError: map_tool1[ty,tx] = dt
if prn_detal > 0: print "(End make map tool1. Map len: {0} pixels. End at {1})".format(len(map_tool1),datetime.now()) if len(map_tool1) == 0 and prn_detal > -1: print "(WARNING! Map tool1 len: {0}! )".format(len(map_tool1))
Принимаются любые предложения: ассемблер, ctypes, cython, средствами графического процессора, OpenGL, Numpy, CUDA, ... Желательно с примером.


Ответ

Увы, если ничего принципиально не менять в алгоритме, то разве что средствами графического процессора. На таких данных, пишите вы для процессора хоть на ассемблере, быстро не получится. Вот пример, чтоб не быть голословным:
int main() { int i, j, k, l; long z = 0;
for (i = 0; i < 300; ++i) for (j = 0; j < 4000; ++j) for (k = 0; k < 100; ++k) for (l = 0; l < 100; ++l) z++; }
Как вы видите, я первый параметр уменьшил в 10 раз (ну допустим вы распараллелите на гипотетические 10 ядер), и вот, что получилось на не самом слабом компьютере:
$ gcc test.c -o test $ time ./test ./test 31,72s user 0,00s system 99% cpu 31,728 total
То есть почти 32 секунды, и это на чистом C с минимумом операций. Ну, будет, допустим, 20 секунд на самом современном процессоре, вряд ли это можно назвать быстро.
Обновление: написал вашу логику на Cython:
import numpy as np cimport numpy as np
def calc( np.ndarray[np.double_t, ndim=2] A, np.ndarray[np.double_t, ndim=2] B, np.ndarray[np.double_t, ndim=2] C):
cdef int N1 = A.shape[0] cdef int M1 = A.shape[1] cdef int N2 = B.shape[0] cdef int M2 = B.shape[1] cdef int i, j, k, l cdef double tp
if N1 != C.shape[0] or M1 != C.shape[1]: raise ValueError('Array dimensions mismatch')
for k in range(N2): for l in range(M2): for i in range(N1 - N2): for j in range(M1 - M2): tp = A[i + k, j + l] - B[k, l] if C[i + k, j + l] > tp: C[i + k, j + l] = tp
Тестовый код (опять в 10 раз меньше данных, чтоб не ждать долго):
import numpy as np import calc
N, M = 300, 4000 n, m = 100, 100
A = np.random.random((N, M)) B = np.random.random((n, m)) C = np.random.random((N, M))
calc.calc(A, B, C)
Вот пример запуска:
$ time python2 test.py python2 test.py 36,68s user 0,05s system 99% cpu 36,734 total
То есть ненамного дольше, чем на чистом C. На полных данных точно укладывается в ваше время.
Обновление 2: ради интереса запустил на полных данных (массив размера 3000x4000), и получил следующий результат:
$ time python2 test.py python2 test.py 1572,55s user 2,11s system 99% cpu 26:16,10 total
В 30 минут уложились, но, конечно, получилось не так быстро, как хотелось бы. Предполагаю, это из-за того, что данные перестали помещаться в кэш. Скорее всего, если разбить большой массив на 10 меньших (которые будут попадать в кэш) и последовательно обработать их, получится гораздо быстрее. Можете попробовать сами, в обработке таких массивов будет пара тонких моментов, так что в рамках ответа на вопрос мне такой код писать лень.