Loading...
Joro_Paspalev avatar Joro_Paspalev 23 Точки

Задача 5. C# Messages от More Exercise Introduction

Здравейте, може ли малко помощ на тази задача :

1.Messages

Write a program, which emulates typing an SMS, following this guide:

1

2

abc

3

def

4

ghi

5

jkl

6

mno

7

pqrs

8

tuv

9

wxyz

 

0

space

 

Following the guide, 2 becomes “a”, 22 becomes “b” and so on.

Examples

Input

Output

 

Input

Output

 

Input

Output

5

44

33

555

555

666

hello

9

44

33

999

0

8

44

33

777

33

hey there

7

6

33

33

8

0

6

33

meet me

Hints

  • A native approach would be to just put all the possible combinations of digits in a giant switch statement.
  • A cleverer approach would be to come up with a mathematical formula, which converts a number to its alphabet representation:

Digit

2

3

4

5

6

7

8

9

  • Index
  • 0 1 2
  • 3 4 5
  • 6 7 8
  • 9 11 12
  • 13 14 15
  • 16 17 18 19
  • 20 21 22
  • 23 24 25 26
  • Letter
  • a b c
  • d e f
  • g h i
  • j  k  l
  • m  n  o
  • p  q  r  s
  • t u v
  • w  x  y  z
  • Let’s take the number 222 (c) for example. Our algorithm would look like this:
    • Find the number of digits the number has “e.g. 222 è 3 digits
    • Find the main digit of the number “e.g.  222 è 2
    • Find the offset of the number. To do that, you can use the formula: (main digit - 2) * 3
    • If the main digit is 8 or 9, we need to add 1 to the offset, since the digits 7 and 9 have 4 letters each
    • Finally, find the letter index (a è 0, c è 2, etc.). To do that, we can use the following formula: (offset + digit length - 1).
    • After we’ve found the letter index, we can just add that to the ASCII code of the lowercase letter “a” (97)

И трите нулеви тестове минават, но след това се чупи някъде. Моля някой за малко съвет? 

Направил съм я по стандартния начин с Switch case конструкция, като входните данни от конзолата първо се четяха като целочислени тип Integer, сега ги направих да са String, но отново същия резултат в Judge 20/100 точки.

Ето и кода: https://pastebin.com/tQtUbLey - Вариант със string

https://pastebin.com/jd1gR5nG - Вариант с Integer

 

0
Module: C# Advanced
knoteva avatar knoteva 1081 Точки

Здравей,

 

  1.  case 66:

  2.                         word += 'm';

  3.                         break;

0
Joro_Paspalev avatar Joro_Paspalev 23 Точки

Е неможе да съм толкова разсеян. Код код код ... и така става.

Какво ли не ми мина през главата, че съм сбъркал.

Благодаря много за трезвата проверка :)

1
RadostinStoychev avatar RadostinStoychev 128 Точки

Здрасти, мисля че идеята на тази задачка беше да не се използвaт case-ove или вложени if-ove.
Виж това решение:

 

namespace P05_Messages
{
    using System;

    class P05_Messages
    {
        static void Main(string[] args)
        {
            int clicks = int.Parse(Console.ReadLine());
            string message = string.Empty;

            for (int i = 0; i < clicks; i++)
            {
                string digits = Console.ReadLine();
                int digitLength = digits.Length;
                int digit = digits[0] - '0';    // ASCII hack hehehe
                int offset = (digit - 2) * 3;

                if (digit == 0)
                {
                    message += (char)(digit + 32);
                    continue;
                }

                if (digit == 8 || digit == 9)
                {
                    offset++;
                }
                int letterIndex = offset + digitLength - 1;
                message += (char)(letterIndex + 97);
            }

            Console.WriteLine(message);
        }
    }
}

 

0
13/05/2019 15:11:31
Joro_Paspalev avatar Joro_Paspalev 23 Точки

Здравей, 

да така е. Решавам я и по двата начина.

Първо реших да я напиша със знанията които имам до момента без да ползвам формулата, която е дадена в подсказката наготово, но още при първото ми решение резултата бе 20/100 точки - и зациклих.

Благодарение на колежката вече съм на 100/100 точки.

Сега започвам с втория вариант, който ти си посочил. Като цяло стъпките са ми ясни, но не схващам за какво е:

1. Main Digit - единиците ли се търсят или стотиците - т.е. с % деление ли го търсим къто остатък или с целичислено деление / за да намерим цялото числи.

2. Какво е offset - по скоро защо ни е? Каква е идеята на формулата (main digit - 2) * 3. Защо -2, защо *3;

3. If the main digit is 8 or 9, we need to add 1 to the offset, since the digits 7 and 9 have 4 letters each - тук може би има грешка в описанието - би трябвало ако основната цифра е 7 или 9, а не 8 или 9 според мен?

4. Каква е логиката на формулата 

  • (offset + digit length - 1).

Много въпроси, но така ще е докато се науча :)

Поздрави,

0
RadostinStoychev avatar RadostinStoychev 128 Точки

Main Digit --> примерно 666, цифрата е 6.
Ако го обърнеш от int в string, string-а сам по себе си е масив от char-ове.
              6 6 6
index     0 1 2
Когато вземеш елемента на нулевия индекс получаваш '6' но като char. Но според ASCII таблицата https://www.cs.cmu.edu/~pattis/15-1XX/common/handouts/ascii.html десетичната стойност на този char е 54, а на '0' -> 48 (54 - 48 = 6).
За да го обърнеш към int по-лесно използваш:

int digit = digits[0] - '0';

Май си прав, че има грешка в условието сега го забелязах и аз, не се опитвай да задълбаваш толкова на тази задачка, вече сме на touch screen :D

0
13/05/2019 16:19:03
Joro_Paspalev avatar Joro_Paspalev 23 Точки

Това с int digit = digits[0] - '0'; ми хареса. Умно измислено.

Докато схвана цялата логика ми отне известно време, но вече съм наясно каква е идеята, а за реализацията и варианти много.

Аз реших задачата по този начин:

using System;

namespace _05__Messages___difficult
{
    class Program
    {
        static void Main(string[] args)
        {
            int countOfLetters = int.Parse(Console.ReadLine());
            string word = string.Empty;

            for (int i = 1; i <= countOfLetters; i++)
            {
                string currentDigit = Console.ReadLine(); //44
                int mainDigit = int.Parse(currentDigit[0].ToString());

                if (mainDigit == 8 || mainDigit == 9)
                {
                    int offset = ((mainDigit - 2) * 3) + 1;
                    int offsetInSquare = currentDigit.Length;
                    int totalOffset = offset + offsetInSquare - 1;
                    char letter = (char)(97 + totalOffset);
                    word += letter;
                }
                else if (mainDigit == 0)
                {
                    word += ' ';
                }
                else
                {
                    int offset = (mainDigit - 2) * 3;
                    int offsetInSquare = currentDigit.Length;
                    int totalOffset = offset + offsetInSquare - 1;
                    char letter = (char)(97 + totalOffset);
                    word += letter;
                }
            }
            Console.WriteLine(word);
        }
    }
}
Благодаря за помощта!

1
IvaYorgova avatar IvaYorgova 17 Точки

Ето и от мен едно решение, дава 100/100.

 

using System;

namespace Messages2
{
    class Program
    {
        static void Main(string[] args)
        {
            int count = int.Parse(Console.ReadLine());
            string word = string.Empty;

            for (int i = 1; i <= count; i++)
            {
                string number = Console.ReadLine();
                int mainDigit = int.Parse(number[0].ToString());

                if (mainDigit == 2)
                {
                    if (number.Length == 1)
                    {
                        word += (char)97;
                    }
                    else if (number.Length == 2)
                    {
                        word += (char)98;
                    }
                    else if (number.Length == 3)
                    {
                        word += (char)99;
                    }
                }
                else if (mainDigit == 3)
                {
                    if (number.Length == 1)
                    {
                        word += (char)100;
                    }
                    else if (number.Length == 2)
                    {
                        word += (char)101;
                    }
                    else if (number.Length == 3)
                    {
                        word += (char)102;
                    }
                }
                else if (mainDigit == 4)
                {
                    if (number.Length == 1)
                    {
                        word += (char)103;
                    }
                    else if (number.Length == 2)
                    {
                        word += (char)104;
                    }
                    else if (number.Length == 3)
                    {
                        word += (char)105;
                    }
                }
                else if (mainDigit == 5)
                {
                    if (number.Length == 1)
                    {
                        word += (char)106;
                    }
                    else if (number.Length == 2)
                    {
                        word += (char)107;
                    }
                    else if (number.Length == 3)
                    {
                        word += (char)108;
                    }
                }
                else if (mainDigit == 6)
                {
                    if (number.Length == 1)
                    {
                        word += (char)109;
                    }
                    else if (number.Length == 2)
                    {
                        word += (char)110;
                    }
                    else if (number.Length == 3)
                    {
                        word += (char)111;
                    }
                }
                else if (mainDigit == 7)
                {
                    if (number.Length == 1)
                    {
                        word += (char)112;
                    }
                    else if (number.Length == 2)
                    {
                        word += (char)113;
                    }
                    else if (number.Length == 3)
                    {
                        word += (char)114;
                    }
                    else if (number.Length == 4)
                    {
                        word += (char)115;
                    }
                }
                else if (mainDigit == 8)
                {
                    if (number.Length == 1)
                    {
                        word += (char)116;
                    }
                    else if (number.Length == 2)
                    {
                        word += (char)117;
                    }
                    else if (number.Length == 3)
                    {
                        word += (char)118;
                    }
                }
                else if (mainDigit == 9)
                {
                    if (number.Length == 1)
                    {
                        word += (char)119;
                    }
                    else if (number.Length == 2)
                    {
                        word += (char)120;
                    }
                    else if (number.Length == 3)
                    {
                        word += (char)121;
                    }
                    else if (number.Length == 4)
                    {
                        word += (char)122;
                    }
                }
                else if (mainDigit == 0)
                {
                    word += " ";
                }
            }
            Console.WriteLine(word);
        }
    }
}

 

0
Joro_Paspalev avatar Joro_Paspalev 23 Точки

Много добро решение за упражняване на вложени конструкции.

Браво!

1
bobby24 avatar bobby24 2 Точки

using System;

namespace _05._Messages
{
    class Program
    {
        static void Main(string[] args)
        {
            int letters = int.Parse(Console.ReadLine());
            string word = String.Empty;

            for (int i = 1; i <= letters; i++)
            {
                string currentNum = Console.ReadLine();
                if (currentNum == "0")
                {
                    word += " ";
                    continue;
                }
                int length = currentNum.Length; 
                int firstDigit = int.Parse(currentNum[0].ToString());
                if (firstDigit > 7)
                    word += (char)(97 + (firstDigit -2)*3 + length);
                else
                    word += (char)(97 + (firstDigit - 2) * 3 + length - 1);
            }
            Console.WriteLine(word);
        }
    }
}
 

0
Emir_Tair avatar Emir_Tair 1 Точки

При 
case 66:
  word += 'n'
  break;

Ти си написал два пъти m
На case 6 си написал 'm', както и на case 66

0
sawyer avatar sawyer 3 Точки

И от мен едно решение. Дълго но за сега това мога

 

using System;

namespace _05._Messages
{
    internal class Program
    {
        static void Main(string[] args)
        {
            int number = int.Parse(Console.ReadLine());
            string word = string.Empty;

            for (int i = 1; i <= number; i++)
            {
                int currentNumber = int.Parse(Console.ReadLine());

                string command = currentNumber == 2 ? "a" : currentNumber == 22 ? "b" : currentNumber == 222 ? "c" :
                currentNumber == 3 ? "d" : currentNumber == 33 ? "e" : currentNumber == 333 ? "f" :
                currentNumber == 4 ? "g" : currentNumber == 44 ? "h" : currentNumber == 444 ? "i" :
                currentNumber == 5 ? "j" : currentNumber == 55 ? "k" : currentNumber == 555 ? "l" :
                currentNumber == 6 ? "m" : currentNumber == 66 ? "n" : currentNumber == 666 ? "o" :
                currentNumber == 7 ? "p" : currentNumber == 77 ? "q" : currentNumber == 777 ? "r" : currentNumber == 7777 ? "s" :
                currentNumber == 8 ? "t" : currentNumber == 88 ? "u" : currentNumber == 888 ? "v" :
                currentNumber == 9 ? "w" : currentNumber == 99 ? "x" : currentNumber == 999 ? "y" : currentNumber == 9999 ? "z" :
                currentNumber == 0 ? " " : "";

                word += command;


            }
            Console.Write(word);


        }
    }
}
 

0
p.sht avatar p.sht 1 Точки

И аз се помъчих с логиката, но накрая нещата си дойдоха на мястото :) 

using System;

namespace _5._Messages
{
    internal class Program
    {
        static void Main(string[] args)
        {
                int lines = int.Parse(Console.ReadLine());
                string word = String.Empty;

                for (int i = 0; i < lines; i++)
                {
                    string input = Console.ReadLine();
                    int number = int.Parse(input);
                    int digit = number % 10;
                    int offset = (digit - 2)*3;
                    if (digit == 0)
                        word += ' ';
                    else if (digit > 7)
                        word += (char)(97 + offset + input.Length);
                    else
                        word += (char)(97 + offset + input.Length - 1);
                }
                Console.WriteLine(word);
        }
    }
}

0
tt104 avatar tt104 15 Точки

Картинка:

индекс:    0                        25
           |                        |
символи:   abcdefghijklmnopqrstuvwxyz
           |  |  |  |  |  |   |  |
бутон:     2  3  4  5  6  7   8  9
бутон[3]:  2  3  4  5  6  7  8  9
           22
           222
отместване:012

Надявам се да е станало ясно "Каква е идеята на формулата".

Малко по-различно решение (тествано само с един примерен вход):

static char LineToSymbol(string line)
{
    // validate
    if (line.Length <= 0 || line.Length > 4) throw new ArgumentException ("Unexpected line length");
    if (line[0] < '0' || line[0] > '9') throw new ArgumentException ("Unexpected button");
    for (int i = 1; i < line.Length; i++)
        if (line[i - 1] != line[i]) throw new ArgumentException ("Unexpected line content");
    int[] btns = { 1, 0, 3, 3, 3, 3, 3, 4, 3, 4 }; // btn_size [symbols]
    if (btns[line[0] - '0'] < line.Length) throw new ArgumentException ("Unexpected button content");
    // compute
    int[] btn = { 0, 0, 1, 4, 7, 10, 13, 16, 20, 23 }; // offset of each button into "symbols"
    const string symbols = " abcdefghijklmnopqrstuvwxyz";
    return symbols[btn[line[0] - '0'] + (line.Length - 1)];
}

static void Main()
{
    int lines_count;
    if (!int.TryParse (Console.ReadLine (), out lines_count)) throw new Exception ("Not a number");
    if (lines_count <= 0 || lines_count >= 1 << 8) throw new Exception ("Odd number of buttons");
    StringBuilder message = new StringBuilder ();
    while (lines_count-- > 0) message.Append (LineToSymbol (Console.ReadLine ()));
    Console.WriteLine (message.ToString ());
    Console.ReadLine ();
}

 

1
15/01/2023 10:09:37
Можем ли да използваме бисквитки?
Ние използваме бисквитки и подобни технологии, за да предоставим нашите услуги. Можете да се съгласите с всички или част от тях.
Назад
Функционални
Използваме бисквитки и подобни технологии, за да предоставим нашите услуги. Използваме „сесийни“ бисквитки, за да Ви идентифицираме временно. Те се пазят само по време на активната употреба на услугите ни. След излизане от приложението, затваряне на браузъра или мобилното устройство, данните се трият. Използваме бисквитки, за да предоставим опцията „Запомни Ме“, която Ви позволява да използвате нашите услуги без да предоставяте потребителско име и парола. Допълнително е възможно да използваме бисквитки за да съхраняваме различни малки настройки, като избор на езика, позиции на менюта и персонализирано съдържание. Използваме бисквитки и за измерване на маркетинговите ни усилия.
Рекламни
Използваме бисквитки, за да измерваме маркетинг ефективността ни, броене на посещения, както и за проследяването дали дадено електронно писмо е било отворено.