Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2014.09.07;
Скачать: CL | DM;

Вниз

Ваш вариант реализации 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;
Скачать: CL | DM;

Наверх




Память: 0.57 MB
Время: 0.007 c
15-1391245952
Kerk
2014-02-01 13:12
2014.09.07
RTTI


15-1391272847
Митрофанов И.С.
2014-02-01 20:40
2014.09.07
Ошибка закрытия Ms Excel


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


11-1254240927
Злобный Ламерюга
2009-09-29 20:15
2014.09.07
Очень хочецца KOL + Borland C++ Builder


2-1381782438
Marina1990
2013-10-15 00:27
2014.09.07
TreeView выделить программно нужный нод