Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Прочее";
Текущий архив: 2014.09.07;
Скачать: [xml.tar.bz2];

Вниз

Ваш вариант реализации FizzBuzz на Delphi?   Найти похожие ветки 

 
FizzBazz   (2014-02-04 17:01) [0]

Для тех, кто не в курсе

"Напишите программу, которая выводит на экран числа от 1 до 100. При этом вместо чисел, кратных трем, программа должна выводить слово «Fizz», а вместо чисел, кратных пяти — слово «Buzz». Если число кратно и 3, и 5, то программа должна выводить слово «FizzBuzz»"

Очень хочется посмотреть. Свой, конечно, тоже покажу, но попозже


 
ВладОшин ©   (2014-02-04 17:08) [1]

writeln("1");
writeln("2");
..
в общем "зобанят"  боюсь :))


 
Дмитрий СС   (2014-02-04 17:21) [2]


>  Свой, конечно, тоже покажу, но попозже

Какой хитрый школьник))


 
Inovet ©   (2014-02-04 17:28) [3]

> [0] FizzBazz   (04.02.14 17:01)
> При этом вместо чисел, кратных трем, программа должна выводить
> слово «Fizz», а вместо чисел, кратных пяти — слово «Buzz».
> Если число кратно и 3, и 5, то программа должна выводить
> слово «FizzBuzz»«

Неправильно. Число кратно 3 — должна выводить „Тройка“, кратно 7 — „Семёрка“, кратно 1 — „Туз“. Если число кратно 3, 7, 1 — „Пиковая дама“.

В версии Пелевина 3 и 4 — „ослик 15 центов“.


 
Inovet ©   (2014-02-04 17:40) [4]

> [3] Inovet ©   (04.02.14 17:28)
> 3 и 4 — „ослик 15 центов“.

7 же центов


 
Дмитрий СС   (2014-02-04 17:45) [5]

На дельфи же программа нужна:

procedure TForm1.Button1Click(Sender: TObject);
var
 C: TCanvas;
 I: Integer;
 A, B: Integer;
begin
 Refresh;
 Canvas.Brush.Style := bsClear;
 A := 3;
 B := 5;
 for I := 1 to 100 do
 begin
   Canvas.Font.Color := clBlack;
   Canvas.TextOut(10 + 15 * I, 10 + 15 * I, IntToStr(I));
   Canvas.Font.Color := clRed;
   if (I = A) and (I = B) then
   begin
     Canvas.TextOut(10 + 15 * I, 10 + 15 * I, "FizzBuzz");
     Inc(A, 3);
     Inc(B, 5);
   end
   else if I = A then
   begin
     Canvas.TextOut(10 + 15 * I, 10 + 15 * I, "Fizz");
     Inc(A, 3);
   end
   else if I = B then
   begin
     Canvas.TextOut(10 + 15 * I, 10 + 15 * I, "Buzz");
     Inc(B, 5);
   end;

 end;
end;



 
FizzBazz   (2014-02-04 17:47) [6]

>> Какой хитрый школьник))

Спасибо за комплимент, конечно, но ты ошибся лет эдак на 20.


 
FizzBazz   (2014-02-04 17:55) [7]

>> Дмитрий СС   (04.02.14 17:45) [5]

Вот именно это и имеется в виду. Это хреновое решение.
if (I = A) and (I = B) then
не нужно, это лишнее сравнение, которое для решения задачи не нужно.


 
Дмитрий СС   (2014-02-04 18:00) [8]

Тебе не угодишь:))


 
Inovet ©   (2014-02-04 18:27) [9]

> [7] FizzBazz   (04.02.14 17:55)
> не нужно, это лишнее сравнение


for i := 1 to 20 do begin
 if (i mod 3) = 0 then
   Write("Oslik ")
 else if (i mod 4) = 0 then
   Write("Sem Centov ")
 else begin
   Write(i);
   Write(" ");
 end;
end;


 
FizzBazz   (2014-02-04 18:40) [10]

>> Inovet ©   (04.02.14 18:27) [9]

Ну начнем с того, что при i = 1 напишет Oslik, хотя оно вовсе не кратно 3.
Дальше тоже неправильно, но уже пофиг


 
FizzBazz   (2014-02-04 18:45) [11]

>> FizzBazz   (04.02.14 18:40) [10]
>>Inovet ©   (04.02.14 18:27) [9]

А не, это я гоню. У тебя не работает, если i кратно и 3 и 5


 
Пронин   (2014-02-04 18:56) [12]

Как-то так:


For i:= 1 to 100 do
 If (i div 3 = 0) and (i div 5 = 0) then Writeln("FizzBuzz") else
 If (i div 3 = 0)                        then Writeln("Fizz")       else
 If (i div 5 = 0)                        then Writeln("Buzz")      else
                                                   Writeln(i);


 
Inovet ©   (2014-02-04 19:03) [13]

> [11] FizzBazz   (04.02.14 18:45)
> если i кратно и 3 и 5

3 и 4. Ну тогда ещё одно сравнение

   for i := 1 to 100 do begin
     if i mod 12 = 0 then
       Write("OslikSemCentov")
     else if i mod 3 = 0 then
       Write("Oslik")
     else if i mod 4 = 0 then
       Write("SemCentov")
     else
       Write(i);
     Write(" ");
   end;


 
Слава Пестов1   (2014-02-04 19:08) [14]

Более элегантного и оптимального решения не найдете:


flag: Boolean;

for i := 1 to 100 do begin
 flag := false;
 if (i mod 3) = 0 then begin
   Write("fizz");
   flag := true;
 end;
   
 if flag then begin
   if (i mod 5) = 0 then Writeln("buzz");
 end else if (i mod 5) = 0 then begin
   Writeln("buzz");
   flag := true;
 end;  

 if not flag Writeln(i);
end;


 
а в гугл заглянуть?   (2014-02-04 21:50) [15]

for i := 1 to 100 do begin
 if (i mod 3) = 0 then s:="Fizz" else s:="";
 if (i mod 5) = 0 then s:=s+"Buzz";
 if s="" then s:=IntToStr(i);
 Writeln(s);
end;


 
Игорь Шевченко ©   (2014-02-04 21:52) [16]

Хорошая статья, полезная.


 
asail ©   (2014-02-04 21:55) [17]


> Игорь Шевченко ©   (04.02.14 21:52) [16]
> Хорошая статья, полезная.

Какая статья?


 
а в гугл заглянуть?   (2014-02-04 22:00) [18]

это было элегантное, а вот оптимальное:

const
 m3: array[0..2] of byte = (1, 0, 0);
 m5: array[0..4] of byte = (2, 0, 0, 0, 0);
 st: array[0..3] of string[8] = ("", "Fizz", "Buzz", "FizzBuzz");
for i := 1 to 100 do begin
 f := m3[i mod 3] or m5[i mod 5];
 if f = 0 then Writeln(i) else Writeln(st[f]);
end;


 
ШАША   (2014-02-04 22:23) [19]


> а в гугл заглянуть?   (04.02.14 22:00) [18]
>
> это было элегантное, а вот оптимальное:


m3 и m5 это что?


 
Игорь Шевченко ©   (2014-02-04 22:25) [20]

asail ©   (04.02.14 21:55) [17]

http://habrahabr.ru/post/111843/


 
Rouse_ ©   (2014-02-04 22:32) [21]


> Игорь Шевченко ©   (04.02.14 22:25) [20]

Это уже слишком сложный этап, очень многие из начинающих отсеиваются на вопросе: "чем отличается функция от процедуры?" :)
Да даже и некоторые из "не начинающих" засыпаются на такой вот банальности :)


 
а в гугл заглянуть?   (2014-02-04 22:37) [22]

> m3 и m5 это что?
typed constants (типизированные константы)


 
Зануда   (2014-02-04 23:03) [23]

>а в гугл заглянуть?

Гляжу в гугл - вижу фак. В смысле - не работает:

>[DCC Error] Unit5.pas(34): E2038 Illegal character in input file: """ (#$22)

потом:

---------------------------
Debugger Exception Notification
---------------------------
Project Project5.exe raised exception class EInOutError with message "I/O error 105".
---------------------------
Break   Continue   Help  
---------------------------


 
oldman ©   (2014-02-04 23:20) [24]


> FizzBazz   (04.02.14 17:01) 
> Для тех, кто не в курсе
>
> "Напишите программу, которая выводит на экран числа от 1
> до 100. При этом вместо чисел, кратных трем, программа должна
> выводить слово «Fizz», а вместо чисел, кратных пяти — слово
> «Buzz». Если число кратно и 3, и 5, то программа должна
> выводить слово «FizzBuzz»"


a[1]:=1
a[2]:=2
a[3]:="Fizz"
a[4]:=4
a[5]:="Buzz"
...
a[98]:=98
a[99]:="Fizz"
a[100]:="Buzz"

А потом печатаем весь массив


 
Inovet ©   (2014-02-04 23:24) [25]

> [24] oldman ©   (04.02.14 23:20)

Кавычки пропустил.


 
Владислав ©   (2014-02-05 00:04) [26]

> а в гугл заглянуть?   (04.02.14 21:50) [15]
> а в гугл заглянуть?   (04.02.14 22:00) [18]

program FizzBuzz;

{$APPTYPE CONSOLE}

uses
 System.SysUtils;

const
 SOutputFormat: array [Boolean] of array [Boolean] of string =
   (("%d", "Buzz"),
   ("Fizz", "FizzBuzz"));

var
 I: Integer;

begin
 for I := 1 to 100 do
   Writeln(Format(SOutputFormat[I mod 3 = 0][I mod 5 = 0], [I]));
end.


 
Дмитрий СС   (2014-02-05 00:32) [27]


> Более элегантного и оптимального решения не найдете:

Что значит оптимальнее? По скорости [5] будет быстрее (если убрать стеб)


 
Дмитрий СС   (2014-02-05 00:51) [28]

Вот еще вариант.

var
 I: Integer;
begin
 for I := 1 to 100 do
 begin
   case I mod 15 of
     0: Write("FizzBuzz ");
     3, 6, 9, 12: Write("Fizz ");
     5, 10: Write("Buzz ");
   else
     Write(I, " ");
   end;
 end;
 Readln;
end.

Сложно решить задачу, когда ждешь подвоха.

А вообще если задача поставлена как поставлена, то любое правильное решение нормальное. Любому компьютеру (и, наверное, почти любому микроконтроллеру) хватит памяти и скорости решить эту задачу мгновенно.


 
Дмитрий СС   (2014-02-05 00:54) [29]

Или вот:

var
 I: Integer;
begin
 for I := 1 to 100 do
 begin
   Write(I, #13);
   if I mod 3 = 0 then Write("Fizz");
   if I mod 5 = 0 then Write("Buzz");
   Writeln;
 end;
 Readln;
end.


 
Inovet ©   (2014-02-05 01:01) [30]

> [29] Дмитрий СС   (05.02.14 00:54)

Вместо числа же эти фузипуси надо.


 
Дмитрий СС   (2014-02-05 01:06) [31]


> Inovet ©   (05.02.14 01:01) [30]

А ты запусти:)


 
Inovet ©   (2014-02-05 01:12) [32]

> [31] Дмитрий СС   (05.02.14 01:06)
> А ты запусти:)

Так это шаманство с возвратом каретки.
фузипуси.exe > prn
или
фузипуси.exe > 1.txt
разоблачит магию.


 
FizzBazz   (2014-02-05 11:19) [33]

А на внешний вид вот так как-то православней выгдядит

program Project1;

{$APPTYPE CONSOLE}

uses
 SysUtils;

var
  i: Integer;
  s: string;

begin
 for i := 1 to 100 do
 begin
   s := "";
   if i mod 3 = 0 then
     s :="Fizz";
   if i mod 5 = 0 then
     s := s +"Buzz";

   if s = "" then
     Write (i, " ")
   else
     Write (s, " ")
 end;

 ReadLn
   
end.


 
Дмитрий СС   (2014-02-05 11:24) [34]


> FizzBazz   (05.02.14 11:19) [33]

Это и есть твой вариант?


 
sniknik ©   (2014-02-05 11:30) [35]

самый православный вот ("идея" от лучшего решения на php из статьи) -
{$APPTYPE CONSOLE}
begin
 Write(
   "1 2 Fizz 4 Buzz Fizz 7 8 Fizz Buzz 11 Fizz 13 14 FizzBuzz 16 17 Fizz 19 Buzz"#13#10+
   "Fizz 22 23 Fizz Buzz 26 Fizz 28 29 FizzBuzz 31 32 Fizz 34 Buzz Fizz 37 38 Fizz"#13#10+
   "Buzz 41 Fizz 43 44 FizzBuzz 46 47 Fizz 49 Buzz Fizz 52 53 Fizz Buzz 56 Fizz 58"#13#10+
   "59 FizzBuzz 61 62 Fizz 64 Buzz Fizz 67 68 Fizz Buzz 71 Fizz 73 74 FizzBuzz 76"#13#10+
   "77 Fizz 79 Buzz Fizz 82 83 Fizz Buzz 86 Fizz 88 89 FizzBuzz 91 92 Fizz 94 Buzz"#13#10+
   "Fizz 97 98 Fizz Buzz"
 );
 ReadLn;
end.


 
Inovet ©   (2014-02-05 11:33) [36]

> [33] FizzBazz   (05.02.14 11:19)

Ну и где там 2 сравнения?


 
FizzBazz   (2014-02-05 11:36) [37]

Дмитрий СС   (05.02.14 11:24) [34]

Не, я с флагами делал. Примерно как Слава Пестов1   (04.02.14 19:08) [14]
Но раз уж выложили похожее, нафига повторять?


 
анонимус   (2014-02-05 12:45) [38]

а без деления никак?

int i3 = 1;
int i5 = 1;
String res;
for (int i = 1; i<=100; i++) {
res = "";
if (i3 == 3) {
 res+="Fizz";
 i3 = 0;
}
if (i5 == 5) {
 res+="Buzz";
 i5 = 0;
}
     
if (res.equals("")) res= String.valueOf(i);
System.out.println(res);  
i3++; i5++;
}


 
Владислав ©   (2014-02-05 12:55) [39]

Без деления уже было.


 
а в гугл заглянуть?   (2014-02-05 14:03) [40]

Владислав, уж оптимизировать, так  оптимизировать:
const s: array[0..14] of string = ("FizzBuzz", "%d", "%d", "Fizz", "%d", "Buzz", "Fizz", "%d", "%d", "Fizz", "%d", "%d", "Fizz", "%d", "%d");
begin
for I := 1 to 100 do Writeln(Format(s[I mod 15], [I]));
end.



Страницы: 1 2 вся ветка

Форум: "Прочее";
Текущий архив: 2014.09.07;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.54 MB
Время: 0.002 c
15-1391468915
Кузьмич
2014-02-04 03:08
2014.09.07
Ищу табличку!


15-1390681802
Юрий
2014-01-26 00:30
2014.09.07
С днем рождения ! 26 января 2014 воскресенье


15-1391525551
Несусвет
2014-02-04 18:52
2014.09.07
CheckBrackets() на Pascal


15-1391245952
Kerk
2014-02-01 13:12
2014.09.07
RTTI


15-1391425585
Drowsy
2014-02-03 15:06
2014.09.07
При Run программы в IDE...





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский