суббота, 22 октября 2016 г.

Булеан

второй вариант:
язык - C++

#include "stdio.h"
#include "string.h"

void main()
{
    char s[32 + 1];

    scanf("%s", &s);
    int n = strlen(s);

    for(int i = 0; i < 2 << (n - 1); i++)
    {
        printf("\n%i: {", i);
        for(int j = 0; j < n; j++)
        {
            int mask = 1 << j;

            if(mask & i)
            {
                printf("%c", s[j]);

                int commaMask = 0xFFFFFFFF << (j + 1);
                if((commaMask & i) != 0)
                    printf(", ");
            }
        }
        printf("}");
    }
}

Пример работы:

abcd
0: {}
1: {a}
2: {b}
3: {a, b}
4: {c}
5: {a, c}
6: {b, c}
7: {a, b, c}
8: {d}
9: {a, d}
10: {b, d}
11: {a, b, d}
12: {c, d}
13: {a, c, d}
14: {b, c, d}
15: {a, b, c, d}

суббота, 15 октября 2016 г.

Вывод подмножеств

Задание:
Напишите программу, которая выводит все подмножества множества {a, b, c, d}

Решение:
Был выбран язык Delphi/Object Pascal из-за наличия встроенной работы с множествами.


1) Код "в лоб":
program Sets;

{$APPTYPE CONSOLE}

{$R *.res}

uses
  System.Classes;

type
  TSet = set of (a, b, c, d);

var
  I: Byte;
  SetX: TSet;

begin
  for I := 0 to 15 do
  begin
    SetX := TSet(I);
    write('{');
    if a in SetX then
      write('A');
    if b in SetX then
      write('B');
    if c in SetX then
      write('C');
    if d in SetX then
      write('D');
    writeln('}');
  end;

  readln;
end.
Вывод:
{}
{A}
{B}
{AB}
{C}
{AC}
{BC}
{ABC}
{D}
{AD}
{BD}
{ABD}
{CD}
{ACD}
{BCD}
{ABCD}
Недостаток:
Плохое форматирование.


2) Код использующий операции над множествами для улучшенного вывода:

program Sets;

{$APPTYPE CONSOLE}

{$R *.res}

uses
  System.Classes;

type
  TSet = set of (a, b, c, d);

var
  I: Byte;
  SetX: TSet;

begin
  for I := 0 to 15 do
  begin
    SetX := TSet(I);
    write('{');
    if a in SetX then
      if SetX - [a] = [] then write('A') else write('A, ');
    if b in SetX then
      if SetX - [a, b] = [] then write('B') else write('B, ');
    if c in SetX then
      if SetX - [a, b, c] = [] then write('C') else write('C, ');
    if d in SetX then
      write('D');
    writeln('}');
  end;

  readln;
end.

Вывод:

пятница, 14 октября 2016 г.

Реализация Online редактора фонового SVG изображения

 Реализация Online редактора фонового SVG изображения.

Для того чтобы отобразить SVG код введенный в textarea, был написан код который по таймеру преобразует SVG код введенный в textarea в base64 и подставляет в document.body.style.backgroundImage с соответствующим mime type: "data:image/svg+xml;base64". Преобразование в base64 необходимо чтобы некоторые символы не ломали загрузку изображения, пример: задание цвета с помощью конструкции #RRGGBB - символ '#'.

Drag and drop "окна" редактирования сделан с помощью JavaScript по причине того что установка атрибута draggable='true' не заставляла работать Drag and drop должным образом в используемом браузере - FireFox.
При быстром перемещении "окна" возможна потеря курсора, проблему можно решить функциями захвата мыши setCapture\releaseCapture от которых, к сожалению, пришлось отказаться, по причине того что реализованы они только в FireFox.

Ссылка на редактор: http://kodaktor.ru/73af581

Исходный код:

<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8"> 
    <title>SVG background editor</title>
    <meta name="Peter S." content="SVG background editor">
    <style>
      body
      { 
        margin-left: 0px;
      }
    
      #Panel
      {
        width: 420px;
        height: 240px;  
        position: absolute;
        background-color: #444444;
        cursor: move;
        left: 100px;
        top: 100px;
      }
      
      #ClickablePanel
      {
        width: 98%;
        height: 90%;
        margin: auto;
        padding-top: 20px; 
      }
      
      #Memo
      {
        width: 100%;
        height: 100%;
        border: 0px;
        padding: 0px;
      }
    </style>
  </head>
  <body>

    <div id="Panel" >
      <div id="ClickablePanel">
        <textarea id='Memo'><svg xmlns="http://www.w3.org/2000/svg" width="60" height="60">
<ellipse fill="#00FF00" stroke="#000000" opacity="0.4" stroke-width="5" cx="30" cy="30" rx="20" ry="20"/>
</svg></textarea>
      </div>
    </div>

  <script>
  Panel = document.getElementById('Panel');
  ClickablePanel = document.getElementById('ClickablePanel');
    
  ClickablePanel.onmousedown = OnMouseDown;
  ClickablePanel.onmousemove = OnMouseMove;
  ClickablePanel.onmouseup = OnMouseUp;  
  
  sx = 0;
  sy = 0;
  IsDrag = false; 
  
  function OnMouseDown(event)
  {
    if(event.target.getAttribute('id') == 'ClickablePanel')
    {
      IsDrag = true;
      sx = event.clientX - Panel.getBoundingClientRect().left;
      sy = event.clientY - Panel.getBoundingClientRect().top;
      Panel.style.opacity = 0.5;
    } 
  }
  
  function OnMouseMove(event)
  {
    if(IsDrag)
    {
      Panel.style.top = event.clientY - sy + 'px';
      Panel.style.left = event.clientX - sx + 'px';
    } 
  }
  
  function OnMouseUp(event)
  {
    IsDrag = false;
    Panel.style.opacity = 1;
  }
     
  Memo = document.getElementById('Memo');
 
  setInterval(function() {
    document.body.style.backgroundImage = 'url(\'data:image/svg+xml;base64,' + window.btoa(Memo.value) + '\')';
  }, 100);    
    
  </script>   
  </body>
</html>

пятница, 7 октября 2016 г.

ДЗ на 08.10.16

Задача 1. Множества.

Условие: 
  • Дрон - 3400
  • Квадракоптер - 5600
  • Дрон ИЛИ Квадракоптер - 8000
Найти:
Дрон и Квадракоптер

Правила:
A|B = A + B - A&B
A = A|B - B + A&B
B = A|B - A + A&B
A&B = A + B - A|B
Используя JavaScript получаем решение в виде кода:
<script>
var sets = {
       A:       3400,
       B:       5600,
       AorB:    8000,
       AandB:   0,
}
  
sets.AandB = sets.A + sets.B - sets.AorB;
$("div").html(sets.AandB);  
  
</script>
(http://hilite.me/)

Ответ:
1000

Задача 2.  iStore

В магазине iStore семь сотрудников,
которые дежурят у стенда парами.
Сколько вариантов пар существует?

Решение:
С(n, k) = n! / (k! * (n - k)!)
- количество сочетаний из n по к.
C(7, 2) = 7! / (2! * (7 - 2)!) = 5040 / (2 * 120) = 21

Задача 3.  Склад

На складе компьютерного магазина представлено 6 цветов сменных бамперов для смартфона.
В период акции к каждому смартфону прилагается по 2 разноцветных бампера.
Сколько может быть вариантов цветовых сочетаний для смартфона?
Решение:
С(n, k) = n! / (k! * (n - k)!)
- количество сочетаний из n по к.
C(6, 2) = 6! / (2! * (6 - 2)!) = 720 / (2 * 24) = 15