Страницы

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

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

Как сделать одинаковый отступ между элементами, но кроме краев контейнера?


(1 картинка)
У контейнера может меняться ширина. У элементов фиксированная ширина 75px, margin-left 20px. Как можно сделать, что бы элементы равномерно распределились?
ссылка на мою разметку:
https://jsfiddle.net/mefpu0k6/1/

Если делать через flex-wrap и space-between, то у последних элементов margin-left не такой как у всех (2 картинка)

А нужно сделать как на 3 картинке. Т.е margin-left у всех одинаковый
Мне удалось это сделать, но только с помощью js
`https://jsfiddle.net/u1yub2jq/2/`
Можно ли это сделать без помощи js? Или что делать с лишним пространством справа?
При этом, когда меняется ширина элементы переходят на новую строку.


Ответ

Не флексбоком единым. Есть ещё грид.
.container { display: grid; grid-template-columns: repeat(auto-fit, 75px); grid-gap: 20px; justify-content: space-between; width: 500px; border: 1px solid black; resize: horizontal; overflow: hidden; } .block { background-color: red; color: white; width: 75px; height: 75px; font: 20px sans-serif; line-height: 75px; text-align: center; }

1
2
3
4
5
6
7
8

Подробный разбор всех вариантов размещения ячеек с разнообразными выравниваниями можно найти в статье Красивое выравнивание блоков по резиновой сетке. По-новому

Поиск максимальной суммы квадратов чисел

Требуется найти максимальную сумму квадратов двух натуральных чисел, которая будет близка(или равна) к заданному числу.
Примеры:
20 -> 20 т.к. (42 + 22) 50 -> 50 т.к. (52 + 52 или 72 + 12) 30 -> 29 т.к. (52 + 22)
Не пойму, почему моя программа неверна.
res = int((N)**0.5) res1 = int(((N-res**2)**0.5)) print(res**2+res1**2)


Ответ

Ваше решение неверное так как int(N**.5)**2 не обязан быть одним из слагаемых в сумме. К примеру, 18 = 32 + 32, а ваше решение возвращает 17 = 42 + 12 для N=18 (17 < 18 поэтому это не является наибольшей суммой квадратов чисел близких к N).
Помимо перебора, можно построить решение на основе теоремы о сумме двух квадратов, из которой следуют разрешённые варианты разложения числа на простые множители — целое число m > 1 является суммой квадратов тогда и только тогда когда у него нет простых множителей вида 4*n+3 в нечётной степени:
def is_sum_of_two_squares(m): p = 2 while m > 1: multiplicity = 0 while m % p == 0: # found prime factor multiplicity += 1 m //= p if multiplicity & 1: # odd power if p % 4 == 3: # 4*n+3 form return False p += 1 return True
Имея способ определить является ли натуральное число суммой квадратов, можно найти наибольшую сумму близкую к числу, перебирая рядом стоящие числа (от близких к далёким, от больших к маленьким числам):
def max_sum_of_two_squares_nearest(m): for i in range(m + 1): if is_sum_of_two_squares(m + i): return m + i elif is_sum_of_two_squares(m - i): return m - i assert 0
Пример:
for m in range(21): print(m, "->", max_sum_of_two_squares_nearest(m))
Результат
0 -> 0 1 -> 1 2 -> 2 3 -> 4 4 -> 4 5 -> 5 6 -> 5 7 -> 8 8 -> 8 9 -> 9 10 -> 10 11 -> 10 12 -> 13 13 -> 13 14 -> 13 15 -> 16 16 -> 16 17 -> 17 18 -> 18 19 -> 20 20 -> 20

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

На сей раз возник вопрос к var. Как заставить переменную перезаписывать своё значение при каждом новом вызове функции? Весь код функции прилагается.
function tablecell(){ var st = $(this).attr('id'); console.log(st); if($(this).is('.disabled')){ } else{ $('.questionBg').css({'display':'flex'}); function answer(){ if ($(this).is('#true')){ $(this).css({'background':'#83c849'}).css({'color':'#fff'}); $('.answer').addClass('disabled'); $('.disabled').off('click', answer); $('.teamSelection').css({'display':'flex'}); $('.selectTeam').click(function(){ $(close); alert(st); $("#"+st).addClass('disabled'); if($(this).is('.selectTeam1')){ $("#"+st).children('.question').css({'display':'none'}); $("#"+st).children('.team1').css({'display':'block'}); } else{ $("#"+st).children('.question').css({'display':'none'}); $("#"+st).children('.team2').css({'display':'block'}); } }); } else{ $(this).css({'background':'#e03a3a'}).css({'color':'#fff'}); $('.answer').addClass('disabled'); $('.disabled').off('click', answer); setTimeout(close, 1000); } } } $('.answer').click(answer); };
Вызов производится извне:
$(document).ready(function(){ $('.tablecell').click(tablecell); });
У меня ощущение, что функция банально не завершается, но новое значение в консоль при повторном вызове выводится. Однако, alert с каждым разом повторно выводит предыдущие значения. Что делать - не пойму. Массивом прописать?

Какого цвета этот блок?
    Варианты ответа:
  • Синий
  • Красный
  • Серый
  • Белый
Начать!


Ответ

Что делать
Не назначать обработчики событий внутри других обработчиков событий.
Каждый раз, когда выполняется функция tablecell, Вы добавляете новый обработчик события click всем элементам с классом "answer". По щелчку на такой элемент выполняются все накопившиеся обработчики.
(function(){ var st;
function answer(){ ... }
function tablecell(){ st = $(this).attr('id'); console.log(st); if($(this).is('.disabled')){ } else { $('.questionBg').css({'display':'flex'}); } }
$(document).on('click', '.tablecell', tablecell); $(document).on('click', '.answer', answer); })();

Python проверка наличия данных в sys.stdin

Как проверить есть ли данные для чтения в sys.stdin, чтобы программа не останавливалась в ожидании ввода, если их нет.


Ответ

Можно посмотреть, что происходит, если timeout близкий к нулю передать в input_with_timeout(). На Unix, чтобы узнать есть ли данные для чтения:
import select
ready, _, _ = select.select([sys.stdin], [],[], 0)
На Windows, при вводе с консоли:
import msvcrt
ready = msvcrt.kbhit()
В качестве альтернативы, можно использовать асинхронный ввод/вывод (потоки, asyncio, O_NONBLOCK). Примеры для неблокирующего чтения вывода внешней команды

sql запрос на удаление

База данных postgreSQL , есть две таблицы , "groups" (group_id (pk), name) - 6 строк и "students" (student_id(pk), group_id, first_name, last_name) - 43 строки.
Как удалить строки из таблицы "students" по конкретному названию (groups.name) из таблицы "groups" На вот такой запрос
DELETE FROM public."GROUPS", public."STUDENTS" WHERE "GROUPS"."GROUP_ID" = "STUDENTS"."GROUP_ID" AND "GROUPS"."NAME" = "SR-01";
пишет
ошибка синтаксиса (примерное положение: ",")
на вот такой запрос
DELETE FROM public."STUDENTS" WHERE "GROUPS"."GROUP_ID" = "STUDENTS"."GROUP_ID" AND "GROUPS"."NAME" = "SR-01";
пишет
таблица "GROUPS" отсутствует в предложении FROM


Ответ

У PostgreSQL довольно забавный синтаксис удаления с использованием ключевого слова USING
DELETE FROM public."STUDENTS" USING public."GROUPS" WHERE "GROUPS"."GROUP_ID" = "STUDENTS"."GROUP_ID" AND "GROUPS"."NAME" = 'SR-01'
В крайнем случае всегда можно использовать старые, добрые подзапросы:
DELETE FROM public."STUDENTS" WHERE "STUDENTS"."GROUP_ID" IN(SELECT "GROUP_ID" FROM public."GROUPS" WHERE "NAME" = 'SR-01')

Метод реализации графического интерфейса


Необходимо будет сделать подобную вещь в своей программе на c# Windows Forms, возможно и WPF. Из чего лучше всего сделать такой график? На нем нужно будет и многое другое вырисовывать, но главное это основные свечи(красные, зеленые). Как мысль, самая банальная, сделать координаты и рисовать по ним прямоугольники с линиями сверху и снизу. А при масштабировании вырисовывать другие, более мелкие или большие. Но, может быть, есть более лаконичное решение данной задачи?


Ответ

Ваш рисунок очень похож на Candlestick chart, название которого иногда переводят как японские свечи
Практически в каждой библиотеки для построения графиков такой тип тоже реализован, поэтому в первую очередь стоит рассмотреть готовые варианты прежде чем изобретать собственный велосипед.
Пример того, как может выглядеть такой график нарисованный при помощи библиотеки OxyPlot

Подчеркну, что кроме цвета фона использовались настройки по умолчанию, так как не ставил перед собой цели добиться соответствия с приведенным изображением.
Данные получены случайным образом, по примеру из репозитория.
Не буду копировать оттуда пример, но переведу его реализацию на F# для более наглядной демонстрации типов и методов библиотеки
let candleStickSeries() = let model = PlotModel(Title = "", LegendSymbolLength = 24.0 ) let s1 = new CandleStickSeries(Title = "", Color = OxyColors.Black) let r = Random()
Seq.initInfinite (fun _ -> r.NextDouble()) |> Seq.scan(fun price a -> price + a + 0.1) 100.0 |> Seq.indexed |> Seq.map (fun (i, price) -> let high = price + 10.0 + (r.NextDouble() * 10.0) let low = price - (10.0 + (r.NextDouble() * 10.0)) let open' = low + (r.NextDouble() * (high - low)) let close = low + (r.NextDouble() * (high - low)) new HighLowItem(float i, high, low, open', close)) |> Seq.take 30 |> Seq.iter s1.Items.Add
model.Series.Add(s1) model.Axes.Add(new LinearAxis(Position = AxisPosition.Left, MaximumPadding = 0.3, MinimumPadding = 0.3 )) model.Axes.Add(new LinearAxis(Position = AxisPosition.Bottom, MaximumPadding = 0.03, MinimumPadding = 0.03 ))
model
Если хотите добиться полного (или почти полного совпадения), то советую разбить вопросы на несколько небольших и задать их по метке выбранной библиотеки.

В C# необходимо отредактировать несколько элементов коллекции через LINQ запрос

Язык C#, LINQ, Работа с несколькими элементами коллекции элементов.
Уважаемые коллеги прошу о помощи! Есть коллекция элементов. Мне необходимо выбрать все элементы с "Company=Microsoft" и изменить в этой же коллекции на "Company=12345" через LINQ запрос
Код:
namespace GroupByLinq { class Phone { public string Name { get; set; } public string Company { get; set; } }
class Program { static void Main(string[] args) { List phones = new List { new Phone {Name="Lumia 430", Company="Microsoft" }, new Phone {Name="Mi 5", Company="Xiaomi" }, new Phone {Name="LG G 3", Company="LG" }, new Phone {Name="iPhone 5", Company="Apple" }, new Phone {Name="Lumia 930", Company="Microsoft" }, new Phone {Name="iPhone 6", Company="Apple" }, new Phone {Name="Lumia 630", Company="Microsoft" }, new Phone {Name="LG G 4", Company="LG" } };
//Вот здесь что-то необходимо поправить или присвоения вовсе не должно быть phones = phones.SelectMany(x => x.Company == "Microsoft", p => new Phone { Name = p.Name, Company = "Citrus" }).ToList();
foreach (Phone g in phones) Console.WriteLine(g.Company + " / " + g.Name);
Console.Read(); } } }


Ответ

Linq не предназначен для изменения данных, он используется для запросов, поэтому я рекомендую вам воспользоваться обычным циклом, но если очень захотеть, можно написать примерно так:
phones = phones .Select(p => p.Company == "Microsoft" ? new Phone { Name = p.Name, Company = "12345" } : p) .ToList();
Этот подход плох тем, что он не изменяет старые объекты, а создает новые:
а) вы должны учесть что где-то могут остаться ссылки на старые phone, которых теперь нет в новой коллекции;
б) если вы добавите в класс новые свойства - вам придется найти каждый такой запрос и откорректировать его.
Подумайте хорошенько и поймете, что такой вариант будет гораздо лучше (да и, кстати, не сильно многословнее):
for (int i = 0; i < phones.Count; ++i) if (phones[i].Company == "Microsoft") phones[i].Company = "12345";
и да, с помощью Linq вы можете выбрать нужные телефоны и итерировать по ним, это тоже корректное решение (объекты остаются те же самые, с помощью Linq выбираем из них нужные):
foreach (var phone in phones.Where(p => p.Company == "Microsoft")) phone.Company = "12345";
А в идеале вам вообще нужно завести отдельный класс для компаний, а в телефоне иметь ссылку на него, тогда смена наименования компании превратится во что-то такое:
var company = companies.First(c => c.Name == "Microsoft"); company.Name = "12345";