Клас для роботи з Yandex Translate API

using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Net;
using System.Runtime.Serialization;
using System.Runtime.Serialization.Json;
using WindowsFormsApplication2.Properties;

namespace WindowsFormsApplication2
{
    public  class YandexTranslate
    {
        private readonly string _apiKey;

        public YandexTranslate()
        {
            _apiKey = Settings.Default.ApiKey;
        }

        public YandexTranslate(string key)
        {
            _apiKey = key;
        }

        public  List<string> GetLangs()
        {
            var requestString =
                String.Format("https://translate.yandex.net/api/v1.5/tr.json/getLangs?key={0}",
                _apiKey);
            var request = WebRequest.Create(requestString);
            var response = request.GetResponse(); 
            var yandexDataContractSerializer = new DataContractJsonSerializer(typeof(GetLangsData));
            var getLangsData = (GetLangsData)yandexDataContractSerializer.ReadObject(response.GetResponseStream());
            return getLangsData.Dirs;
        }
        public  List<string> GetLangs(string ui)
        {
            var requestString =
                String.Format("https://translate.yandex.net/api/v1.5/tr.json/getLangs?key={0}&amp;ui={1}",
                _apiKey, ui);
            var request = WebRequest.Create(requestString);
            var response = request.GetResponse();
            var sr = new StreamReader(response.GetResponseStream());
            var json = sr.ReadToEnd();
            json = json.Remove(json.Length - 3);
            json = json.Substring(json.IndexOf("langs") + 8);
            json = json.Replace('"', ' ');            
            return json.Split(',').ToList();
        }
        public  string Detect(string text)
        {
            var requestString =
                String.Format("https://translate.yandex.net/api/v1.5/tr.json/detect?key={0}&amp;text={1}",
                _apiKey, text);
            var request = WebRequest.Create(requestString);
            var response = request.GetResponse();
            var yandexDataContractSerializer = new DataContractJsonSerializer(typeof(DetectData));
            var detectData = (DetectData)yandexDataContractSerializer.ReadObject(response.GetResponseStream());
            return detectData.Lang;
        }
        public  List<string> Translate(string lang, string text)
        {
            var requestString =
                String.Format("https://translate.yandex.net/api/v1.5/tr.json/translate?key={0}&amp;text={1}&amp;lang={2}&amp;format={3}",
                _apiKey, text, lang, "plain");

            var request = WebRequest.Create(requestString);
            if ((requestString.Length > 10240) &amp;&amp; (request.Method.StartsWith("GET")))
                throw new ArgumentException("Text is too long (>10Kb)");
            var response = request.GetResponse();

            TranslateData translateData;
            var yandexDataContractSerializer = new DataContractJsonSerializer(typeof(TranslateData));
            try
            {
                translateData = (TranslateData)yandexDataContractSerializer.ReadObject(response.GetResponseStream());
            }
            catch (Exception exception)
            {
                translateData = new TranslateData();
                translateData.Text = new List<string>();
            }
            return translateData.Text;
        }
        [DataContract]
        internal class TranslateData
        {
            [DataMember (Name = "code")]
            internal int Code { get; set; }            
            [DataMember(Name = "lang")]
            internal string Lang { get; set; }
            [DataMember(Name = "text")]
            internal List<string> Text { get; set; }
        }
        [DataContract]
        public class GetLangsData
        {
            [DataMember(Name = "dirs")]
            internal List<string> Dirs { get; set; }
        }
        [DataContract]
        internal class DetectData
        {
            [DataMember(Name = "code")]
            internal int Code { get; set; }            
            [DataMember(Name = "lang")]
            internal string Lang { get; set; }
        }
    }
}

Номер цифри

Дано натуральне число. З нього викреслюють одну цифру. Яку саме цифру потрібно викреслити з цього числа, щоб після цього отримати максимально можливе число?

Формат вхідних даних: у єдиному рядку записано єдине ціле число N(11 ≤N< 1 000 000 000).

Формат вихідних даних: номер ви­кресленої цифри, за умови, що цифра в найстаршому розряді має номер 1.

Continue reading

Заяць на східцях

Вгорі на східцях, що мають N сходинок, знаходиться заєць, який почи­нає стрибати по них униз. Заєць може стрибнути на наступну сходинку, через одну або через дві. Тобто, якщо заєць знаходиться на 10-й сходинці, то він може переміститися на 9-ту, 8-му або 7-му Обчислити кількість усіх можливих «маршрутів» зайця з вершини до землі.

Формат вхідних даних: одне число 0 <М< 37.

Формат вихідних даних: одне число — кількість усіх можливих маршрутів.

Ідея розв’язання. Задачу розв’яжемо аналогічно до задачі про числа Фібоначчі. Нехай заєць знаходиться на сходинці з номером X. Тоді він може стрибнути на сходинки X- 1, X- 2 і X- 3.

TextWindow.Title="Заяць на східцях"
TextWindow.WriteLine("Введіть значення N")
N=TextWindow.ReadNumber()
x=1
y=2
z=4
If (n=1) then
  TextWindow.WriteLine(x)
ElseIf (n=2) Then
  TextWindow.WriteLine(y)
elseif (n=3) then
     TextWindow.WriteLine(z)
   Else
      For i=4 To N
        z= x+y+z
        y=z-x-y
        x=z-x-y
      EndFor
        TextWindow.WriteLine(z)  
EndIf

Числа Фібоначчі

Обчислити N-е число послідовності Фібоначчі — 1, 1, 2, 3, 5, 8,…, — в якій перші два члени дорівнюють 1, а всі інші — це сума двох попе­редніх.

Формат вхідних даних: одне число 0 < N< 47.

Формат вихідних даних: одне число —N-й член послідовності.

Доцільно розглянути найпростіший спосіб — не рекурсивний . Для цього будемо виконувати обчислення не від того, що потрібно знайти до тривіального (рекурсія), а навпаки.

Як правило, такий спосіб розв’язання програма виконує у кілька разів швидше. Ідея алго­ритму — обчислення і збереження тільки двох елементів послідовності:

y=x+y

x=y-x

TextWindow.Title="Числа Фібоначчі"
TextWindow.WriteLine("Введіть число N")
N=TextWindow.ReadNumber()
x=1
y=1
For i=3 To N
  y=x+y
  x=y-x
  EndFor 
  TextWindow.WriteLine(y)

Друк рядка

Сергій дуже любить грати в таку гру: довільним чином вибирають два натуральних числа N (1 <И < 100) і М (1 <М<100). Створюється рядок символів, у який підряд виписуються числа: спочатку одна 1, потім дві 2, потім три 3 і так далі до N. Наприклад, для N = 5 отриманий рядок такий: 122333444455555. Потім отриманий рядок записується в кілька рядків по М символів у рядку. Останній рядок може бути неповної дов­жини. Наприклад, попередній рядок для М= 3 буде записаний у вигляді:

122

333

444

455

555

Потрібно написати програму, що звільнить Сергія від цієї марної витрати часу.

Формат вхідних даних: два числа N і М, що не перевищують 100.

Формат вихідних даних: у кожному рядку повинно міститися по М символів з отриманого для N рядка. Останній рядок може бути неповним.

Ідея розв’язання. Формування на початку всього рядка є недоцільним. Такий рядок можна сформувати тільки для N= 16 (227 символів). Тому будемо формувати рядок, доки його довжина не стане > М, потім будемо виводити підрядок довжини М та відразу його вилучати. Після цього зно­ву будемо будувати рядок з подальшим виведенням і вилученням. Для випадку, коли останній рядок буде неповним, передбачимо його виведен­ня після закінчення циклу.

TextWindow.Title="Друк рядка"
TextWindow.WriteLine("Введіть значення N")
N=TextWindow.ReadNumber()
TextWindow.WriteLine("Введіть значення M")
M=TextWindow.ReadNumber()
s=""
For i=1 To N
  For j=1 To i
    s=Text.Append(s, i)
    While Text.GetLength (s) >= M
      TextWindow.WriteLine(Text.GetSubText(s,1,M))
      s=text.GetSubTextToEnd(s,M+1)
    EndWhile
  EndFor
EndFor
If Text.GetLength (s) > 0 Then
  TextWindow.WriteLine(s)
EndIf

Факторіал

N! — добуток натуральних чисел від 1 до N. Напишіть програму знаходження правої ненульової цифри в запису числа N!. Наприклад, 5! = 120 — правою ненульовою цифрою буде 2, для 71 — 4.

Формат вхідних даних: у єдиному рядку знаходиться число N(1≤N≤1000).

Формат вихідних даних: у єдиний рядок виведіть праву ненульову цифру в N!.

Ідея розв’язання. Очевидним способом є обчислення факторіала чис­ла N та знаходження відмінної від нуля правої цифри із застосування дов­гої арифметики.

Розглянемо більш раціональний спосіб. Очевидно, що:

• нулі в кінці числа N! суттєвої ролі не відіграють, тому відкидатимемо їх у міру появи;

• зберігати повністю число N! також немає сенсу, достатньо зберігати 5—8 останніх цифр без «правих» нулів.

TextWindow.Title="Факторіал"
TextWindow.WriteLine("Введіть значення N")
N=TextWindow.ReadNumber()
x=1
For i=1 To N
  x=x*i
  While math.Remainder(x,10)=0
      x=x/10
    EndWhile
      If x>100000 Then
      x=Math.Remainder(x,100000)
    EndIf
  EndFor 
  TextWindow.WriteLine(Math.Remainder(x,10))

Задача 0122

Побудувати і замалювати прямокутник зі сторонами 30 і 50 пікселів, центр якого співпадає з центром монітора. Сторони прямокутника мають бути паралельні осям координат монітора.

x=GraphicsWindow.Width /2
y=GraphicsWindow.Height /2
GraphicsWindow.FillRectangle(x-25,y-25,50,30)