Był wieczór, zwyczajny, jeden z wielu w ’96 lub ’97. Ciężko o dokładniejszy rok. Jedno jest pewne, grałem wtedy w Warcraft II. Więc to musiało być wtedy – patrząc na rok wydania gry i rok wydania Starcraft, jak i fakt, że na pewno to było przed liceum :) Uczyłem się wtedy Pascala, zresztą, nie miałem wyboru. Zostało mi powiedziane, żebym rozpoczął naukę od niego. Już nie wiem jakie poszczególne zdarzenia doprowadziły do tego, ale w ostateczności siedziałem z tatą przed komputerem. Turbo Pascal odpalony, a we mnie była wlewana wiedza co to jest pętla i na czym ona polega. A następnie, zostało mi dane zadanie:

Narysuj choinkę

To jest jedno z trzech zdań programistycznych z początku moich zmagań, które utkwiło mi w pamięci i zaraz pierwsze z normalnym językiem. Bo nie mowa tutaj o logo i ruszaniu żółwikiem, choć jedynie pamiętam że było, zadania już nie. Ale była też inna aplikacja, która uczyła programowania – albo dokładniej – planowania ruchów poszczególnych postaci. Tam pamiętam, że miałem zrobić tak by jakieś zwierzę przeszło przez ekran. Dobra, trochę zboczyłem z tematu. Więc pierwszym była choinka, drugim zadaniem było narysowanie w 3D (tak, pascal i 3D) obrazu – dowolnego, ale bardziej skomplikowanego niż sześcian). Trzecim, stworzenie aplikacji/gry – dosłownie, temat dowolny.

Ale nic tak dobrze nie utkwiło mi w pamięci jak narysowanie tej choinki. To było coś, czego: nie rozumiałem do końca, nie wiedziałem w ogóle jak się za to zabrać, a jedyne źródło informacji powiedziało mi, delikatnie bym się walił i sam wymyślił rozwiązanie. Pierwsze kroki zawsze są trudne! :)

Celem było zrobienie:

     *
    ***
   *****
  *******
 *********
***********

Od tamtej pory, lubię po cichu czasami, pisać sobie takie właśnie drzewko. Robię to po cichu, nikomu nie mówiąc. To taki sprawdzian mały… i nie pytam się nikogo o to jak to zrobić :) w niektórych językach to przychodzi bardzo łatwo, w innych trochę więcej pracy trzeba w to włożyć. Jednak zawsze ta choinka :)

A, że są święta to napisałem ją sobie w elixir:

defmodule XMas do
    import IO
    import Integer

    defp get_char_repeted_times(how_many, char) do
        1..round(how_many)
            |> Enum.map(fn x -> char end)
            |> Enum.join("")
    end

    defp print(how_many_stars, 0) do
        spaces = ""
        stars = get_char_repeted_times(how_many_stars, "*")

        puts spaces <> stars
    end

    defp print(how_many_stars, position) do
        spaces = get_char_repeted_times(position, " ")
        stars = get_char_repeted_times(how_many_stars, "*")

        puts spaces <> stars
    end


    def tree(length, current \\ 1)
    def tree(length, current) when is_odd(length) and current >= length do      
        print(current, 0)
    end

    def tree(length, current) when is_odd(length) do
        position = (length - current)/2

        print(current, position)

        tree(length, current + 2)
    end

    def tree(length, current) when is_even(length) do
       puts "Tree without the top is not a tree, try using odd number for length"
    end
end

XMas.tree(21)

Czy jest to idealne? Nie, da się lepiej? Pewnie, że się da. Da się inaczej? Da, chociażby na listach. Ale to, to ja polecam wam byście sami sobie napisali :) jest to dobra zabawa, a choinka i gwiazdka idą w parze :)

Miłego drugiego dnia świąt! :) bawcie się dobrze :)

5 KOMENTARZE

  1. //See sharp version:
    class Program
    {
    static void Main(string[] args)
    {
    int maxWidth = 21;
    int width = 1;
    while (width <= maxWidth)
    {
    Console.WriteLine(buildTreeLine(width, maxWidth));
    width += 2;
    }
    }
    static string buildTreeLine(int width, int maxWidth)
    {
    int whitespaceWidth = (maxWidth – width) / 2;
    StringBuilder treeLineBuilder = new StringBuilder(buildCharSequence(" ", whitespaceWidth));
    treeLineBuilder.Append(buildCharSequence("*", width));
    treeLineBuilder.Append(buildCharSequence(" ", whitespaceWidth));
    return treeLineBuilder.ToString();
    }
    private static string buildCharSequence(string character, int count)
    {
    return new StringBuilder(character.Length * count).Insert(0, character, count).ToString();
    }
    }

    Pozdrawiam :)

    • Wersja minimalistyczna :) :
      class Program
      {
      static void Main(string[] args)
      {
      int maxWidth = 55;
      int width = 1;
      while (width <= maxWidth)
      {
      System.Console.WriteLine(buildTreeLine(width, (maxWidth – width) / 2));
      width += 2;
      }
      }
      static string buildTreeLine(int width, int whitespaceWidth)
      {
      return buildCharSequence(" ", whitespaceWidth) + buildCharSequence("*", width);
      }
      private static string buildCharSequence(string character, int count)
      {
      return new System.Text.StringBuilder(character.Length * count).Insert(0, character, count).ToString();
      }
      }

Comments are closed.