Categories
Visual C# Телерик

Задача: Nightmare On Code Street

Решение

using System;

namespace NightmareOnCodeStreet {
  class Program {
    static void Main() {
      string number = Console.ReadLine();
      char[] numbersList = number.ToCharArray();
      int size = numbersList.Length;
      if (numbersList[0] - '0' < 0) {
        for (int i = 0; i < numbersList.Length - 1; i++) {
          numbersList[i] = numbersList[i + 1];
        }
        size--;
      }
      int counter = 0;
      int sum = 0;
      for (int i = 0; i < size; i++) {
        if (i % 2 != 0) {
          if (Char.IsDigit(numbersList[i])) {
            counter++;
            sum += (int)(numbersList[i] - '0');
          }
        }
      }
      Console.WriteLine("{0} {1}", counter, sum);
    }
  }
}

Categories
VB.NET

Задача: Sand-glass

Описание

Имало едно време един могъщ магьосник. Неговото име било Гуеногфрин. Не след дълго той станал велик магьосник. Добросърдечен бил той. Използвал магията си единствено, за да защитава хората от злите вещици, идващи през нощта. Гуеногфрин, въпреки това, бил миролюбив и не искал да се бие или нарани вещиците, затова той измислил друго решение. Щял да хваща вещиците и да ги заключва в пясъчни часовници (единственият затвор, от който  вещица не може да избяга). За нещастие, пясъчните му часовници били на привършване. Помогни на Гуеногфрин да залови всички вещици като направиш свои собствени пясъчни часовници.

Пример

Sand-glass

Решение

Module SandGlass
Sub Main()
Dim n = Integer.Parse(Console.ReadLine())
Dim stars As Integer = n + 2
Dim add As Boolean = False
For i As Integer = 1 To n
If stars = 1 Then
add = True
End If
stars = If(add = False, stars - 2, stars + 2)
Dim dots As Integer = (n - stars) * 0.5
Console.Write(New String(".", dots))
Console.Write(New String("*", stars))
Console.Write(New String(".", dots))
Console.WriteLine()
Next i
Console.ReadLine()
End Sub
End Module
Categories
VB.NET

Задача: Fir Tree

Описание

Бъдни вечер наближава, така че дори и програмистите трябва да се подготвят.

В духа на празника твоята задача е да напишеш програма, която отпечатва елха в конзолата.

Форматът на дървото е показан в примера по-долу.

Пример

Fir Tree

Решение

Module FirTree
Sub main()
Dim height As Integer = Integer.Parse(Console.ReadLine())
Dim width As Integer = 1
For i As Integer = 2 To height - 1
width += 2
Next i
Dim asterisk As Integer = -1
Dim point As Integer = 0
For i = 1 To height
asterisk += 2
point = If(i < height, (width - asterisk) * 0.5, (width - 1) * 0.5)
For j = 1 To width
If j <= point Or j > width - point Then
Console.Write(".")
Else
Console.Write("*")
End If
Next j
Console.WriteLine()
Next i
Console.ReadLine()
End Sub
End Module
Categories
Без категория

Задача: Tribonacci

Описание

Редицата на Трибоначи е редица, в която всеки следващ елемент се получава от сумата на предходните три елемента на редицата.

Tn = Tn-1 + Tn-2 + Tn-3

Напишете програма, която намира n-тият елемент на редицата на Трибоначи, ако са дадени първите три елемента на редицата и номерът на n-тия елемент.

Първоначално решение

Module Tribonacci
Sub main()
Dim T1 As Integer = Integer.Parse(Console.ReadLine())
Dim T2 As Integer = Integer.Parse(Console.ReadLine())
Dim T3 As Integer = Integer.Parse(Console.ReadLine())
Dim N As Integer = Integer.Parse(Console.ReadLine())
Dim T(N - 1) As Integer
T(0) = T1
T(1) = T2
T(2) = T3
For i As Integer = 3 To N - 1
T(i) = T(i - 3) + T(i - 2) + T(i - 1)
Next i
Console.WriteLine(T(N - 1))
Console.ReadLine()
End Sub
End Module

Коментар

Това решение не е добро, защото N може да е число от 1 до 15000 включително, а T1, T2 и T3 – числа от -2000000 до 2000000. В решението масивът T се запълва с всички елементи на редицата.

Ново решение

Module Tribonacci
Sub main()
Dim T1 As Integer = Integer.Parse(Console.ReadLine())
Dim T2 As Integer = Integer.Parse(Console.ReadLine())
Dim T3 As Integer = Integer.Parse(Console.ReadLine())
Dim N As Integer = Integer.Parse(Console.ReadLine())
Dim i As Integer = 4
Dim nextMember As Integer = 0
While i <= N
nextMember = T1 + T2 + T3
T1 = T2
T2 = T3
T3 = nextMember
i += 1
End While
Console.WriteLine(nextMember)
Console.ReadLine()
End Sub
End Module

Коментар

В това решение последните три члена на редицата се пазят в променливите T1, T2 и Т3. Масиви не се използват.

Categories
VB.NET

Задача: Ship Damage

Описание

За дефинирането на диагонала не е от значение реда на въвеждане на двете срещуположни точки, както и самите точки.

Визуализация

Ship Damage

Решение

Imports System.Drawing
Module ShipDamage
Sub Main()
' вход на данни
Dim line(10) As Integer
For i As Integer = 0 To line.Length - 1
line(i) = Integer.Parse(Console.ReadLine())
Next i
' дефиниране на правоъгълник,
' с начало долен ляв ъгъл (1) и посока обратна на часовниковата стрелка,
' зададен чрез един от диагоналите му
Dim S(3) As Point 'масив за точките, дефиниращи върховете на правоъгълника
If line(2) - line(0) > 0 And line(3) - line(1) > 0 Then
'диагоналът е зададен с точки 1-3
S(0) = New Point(line(0), line(1))
S(1) = New Point(line(2), line(1))
S(2) = New Point(line(2), line(3))
S(3) = New Point(line(0), line(3))
ElseIf line(2) - line(0) > 0 And line(3) - line(1) < 0 Then 'диагоналът е зададен с точки 2-4 S(0) = New Point(line(2), line(1)) S(1) = New Point(line(0), line(1)) S(2) = New Point(line(0), line(3)) S(3) = New Point(line(2), line(3)) ElseIf line(2) - line(0) < 0 And line(3) - line(1) > 0 Then
'диагоналът е зададен с точки 4-2
S(0) = New Point(line(0), line(3))
S(1) = New Point(line(2), line(3))
S(2) = New Point(line(2), line(1))
S(3) = New Point(line(0), line(1))
Else
'диагоналът е зададен с точки 3-1
S(0) = New Point(line(2), line(3))
S(1) = New Point(line(0), line(3))
S(2) = New Point(line(0), line(1))
S(3) = New Point(line(2), line(1))
End If
'дефиниране на катапулти
Dim C(2) As Point 'масив за точките, дефиниращи катапултите
C(0) = New Point(line(5), line(6))
C(1) = New Point(line(7), line(8))
C(2) = New Point(line(9), line(10))
'дефиниране на хоризонта
Dim horizon As Integer = line(4)
'щети, нанесени по кораба от катапултите
Dim totalDmg As Integer = 0
'превъртане на всички катапулти
For i As Integer = 0 To C.Length - 1
'разстояние от катапулта до хоризонта
Dim dist = horizon - C(i).Y
'координати на точката, дефинираща мишената
Dim target = New Point(C(i).X, dist + horizon)
'брояч за положителните детерминанти
Dim positiveDeterminant As Integer = 0
'флаг за пропуск при отрицателна детерминанта
Dim miss As Boolean = False
'превъртане върховете на кораба
For j As Integer = 0 To S.Length - 1
'определяне на "площта" (детерминантата)
Dim area As Integer
If j < S.Length - 1 Then
area = (0.5) * (S(j + 1).X * target.Y - S(j + 1).Y * target.X - S(j).X * target.Y + S(j).Y * target.X + S(j).X * S(j + 1).Y - S(j).Y * S(j + 1).X)
Else
area = (0.5) * (S(0).X * target.Y - S(0).Y * target.X - S(j).X * target.Y + S(j).Y * target.X + S(j).X * S(0).Y - S(j).Y * S(0).X)
End If
'проверяване знака на "площта" (детерминантата)
Select Case area Case Is > 0 'положителна "площ"
'целта е улучена при 2 <= positiveDeterminant <= 4 positiveDeterminant += 1
Case Is < 0 'отрицателна "площ"
'целта е пропусната
miss = True
Exit For
End Select
Next j
'ако няма пропуск, прибавяме щетите, нанесени по кораба, към общите щети
If miss = False Then
Select Case positiveDeterminant
Case 4 'изстрелът попада в кораба
totalDmg += 100
Case 3 'изстрелът попада върху един от ръбовете
totalDmg += 50
Case 2 'изстрелът попада върху един от върховете
totalDmg += 25
End Select
End If
Next i
'извеждане на резултата
Console.WriteLine(String.Format(totalDmg))
End Sub
End Module