LINUX.ORG.RU
решено ФорумTalks

Happy Programming. Eposode 0x01 - нарисуй слоника ::)

 , , , ,


3

2

Давай повеселимся, реализуй и выложи код который будет рисовать слоника по приложенным данным на своём любимом языке программирования ::) Можно выбрать и не слоника, а другое.

Данные по которым нужно рисовать >>> ★ слоник ★★ бабочка ★★★ крабик ★★★★ лошадка ★★★★★ робот

Программист из меня никакой и в качестве примера я нарисовал слоника из параллельной вселенной, уж точно не из нашей. А сможешь ли ты , да да именно ты нарисовать слоника? Или слабо :D

UPDATE: Готовые реализации

>>> Language C => Dron★★★★
>>> Language Ruby => theNamelessOne ★★★★★
>>> Language Bash => ArcFi ★
>>> Language Python3 => unikoid ★★★
>>> Language Python + matplotlib => i-rinat ★★★★★
>>> Language javascript => arax ★
>>> Language javascript v2 => arax ★
elefan.c #моя стартовая инопланетнокривая версия

#include <stdio.h>

enum 
{
    UP,
    DOWN,
    LEFT,
    RIGHT
};

static int elefan[28][2] = {
 
     {RIGHT,2},{DOWN,6},{RIGHT,2},{UP,1},{RIGHT,1},{UP,1},
     {RIGHT,1},{UP,1},{RIGHT,4},{DOWN,1},{RIGHT,1},{DOWN,3},
     {RIGHT,7},{DOWN,1},{RIGHT,3},{DOWN,7},{LEFT,1},{DOWN,6},
     {LEFT,3},{UP,1},{LEFT,2},{UP,1},{LEFT,1},{UP,2},{LEFT,2},
     {UP,1},{LEFT,2},{UP,9}
 };

  static char surface [22][22]; 
  char dot = '@';
  char fon = '.';
  int pose_x =0;
  int pose_y =0;

int main(int argc, char *argv[])
{

/*create surface*/
for (int i = 0; i < 22; ++i) 
{
    for (int y = 0; y < 22; ++y) 
    {
        surface[i][y]=fon;
    };  
};
/*paint elefan*/
for (int i = 0; i < 28; i++)
{
    switch (elefan[i][0])
    {
        case UP:    pose_x-=elefan[i][1];
                    surface[pose_x][pose_y]=dot;
                    break;
        case DOWN:  pose_x+=elefan[i][1];
                    surface[pose_x][pose_y]=dot;
                    break;
        case LEFT:  pose_y-=elefan[i][1];
                    surface[pose_x][pose_y]=dot;
                    break;
        case RIGHT: pose_y+=elefan[i][1];
                    surface[pose_x][pose_y]=dot;
                    break;
        default:    break;
    };
}
/*print elefan*/
for (int i = 0; i < 22  ; i++)
{
       for(int y=0; y < 22; y++)
       {
            putchar(surface[i][y]);
            putchar(fon);//correct surface cube
            
       };
       putchar('\n');
}

    return 0;
}

result

dron@gnu:~$ gcc elefan.c -o elefan ; ./elefan
....@.......................................
............................................
............................................
............@.......@.......................
..........@.@.......@.@.....................
........@.@.................................
....@...@...................................
....................@.@.............@.......
....................................@.....@.
............................................
............................................
............................................
............................................
............................................
............................................
........................................@.@.
....................@...@...................
........................@...@...............
............................................
............................@.@.............
..............................@...@.........
..................................@.....@...
dron@gnu:~$ 
★★★★★

Последнее исправление: Dron (всего исправлений: 13)

Ответ на: комментарий от alozovskoy

:D у меня квадратик, ты нарисовал квадратик ::)

Dron ★★★★★
() автор топика
Последнее исправление: Dron (всего исправлений: 1)

Такие занятия рекомендуются детям от 4 до 12 лет, хотя могут быть интересны и более старшим. Это упражнение развивает внимание, пространственное восприятие, мелкую моторику.

d_a ★★★★★
()

Программист из меня никакой и в качестве примера я нарисовал слоника

Художник точно никакой, а про программиста - это еще нужно выяснить!

ptarh ★★★★★
()
Ответ на: комментарий от ptarh

это еще нужно выяснить!

Я и надеялся на последующие реализации и баталии чей язык лучше и почему на конкретном примере ::)

Dron ★★★★★
() автор топика
Ответ на: комментарий от HeipaVai1o

У меня слоник отображается синий. В юникоде есть зелёный слоник?

mittorn ★★★★★
()
Ответ на: комментарий от Dron

Ну ты ж уже всё написал :) Остаось добавить считывание инструкций из файла.

Задание со звездочой: прикрутить opencv для распознавания инструкций.

invy ★★★★★
()
Ответ на: комментарий от invy

Но слоник то у меня не получился :D Я нарисовал точки и всё. Можно к примеру добавить пост обработку соединяющую эти точки к примеру для более адекватного вывода конечного результата )) Никто не хочет делать Нappy Sunday Programming :D

Dron ★★★★★
() автор топика
Ответ на: комментарий от invy

Видимо надо было объявить призовой фонд в баррелях нефти и по окончании треда, создать голосование где был бы выявлен победитель и выдан приз на webmoney/paypal/qiwi/etc ::D

Споооонсооорыыы, вы гдеее :D

Dron ★★★★★
() автор топика
#!/usr/bin/env ruby

module Draw
  MOVE_DIRECTIONS = %i(left right up down).freeze

  Move = Struct.new('Move', :dir, :len)
  Pos = Struct.new('Pos', :x, :y)

  class Canvas
    def initialize(width, height, bg: ' ', fg: '@')
      @height = height
      @width = width
      @bg = bg
      @fg = fg

      reset
    end

    def reset
      @canvas = Array.new(@width) do
        Array.new(@height, @bg)
      end
    end

    def draw(start, drawing)
      pos = start

      drawing.each do |move|
        method(move.dir).call(pos, move.len)
      end
    end

    def render
      @canvas.map(&:join).join("\n")
    end

    private

    MOVES = {
      down: ->(pos) { pos.y += 1 },
      up: ->(pos) { pos.y -= 1 },
      left: ->(pos) { pos.x -= 1 },
      right: ->(pos) { pos.x += 1 }
    }.freeze

    MOVE_DIRECTIONS.each do |dir|
      # TODO: validate moves (i.e., range checks)
      define_method(dir) do |pos, len|
        len.times do
          @canvas[pos.y][pos.x] = @fg
          update(pos, dir)
        end
      end
    end

    def update(pos, dir)
      MOVES.fetch(dir).call(pos)
    end
  end

  module IntegerExt
    refine Integer do
      MOVE_DIRECTIONS.each do |dir|
        define_method(dir) do
          Move.new(dir, self)
        end
      end
    end
  end

  using IntegerExt

  ELEPHANT = [
    2.right, 6.down, 2.right, 1.up, 1.right, 1.up, 1.right, 1.up, 1.right,
    1.up, 4.right, 1.down, 1.right, 1.down, 1.right, 3.down, 7.right, 1.down,
    3.right, 7.down, 1.left, 6.down, 3.left, 5.up, 6.left, 5.down, 3.left,
    7.up, 3.left, 1.up, 2.left, 1.up, 1.left, 2.up, 2.left, 1.up,
    2.left, 9.up
  ].freeze
end

canvas = Draw::Canvas.new(22, 22)
canvas.draw(Draw::Pos.new(0, 0), Draw::ELEPHANT)
puts canvas.render
λ nameless@laptop /tmp → ./elephant
@@@                   
@ @                   
@ @    @@@@@          
@ @   @@   @@         
@ @  @@     @@        
@ @ @@       @        
@ @@@        @        
@            @@@@@@@@ 
@                   @@@@
@@@                   @
  @@@                 @
    @                 @
    @@                @
     @@@              @
       @@@@           @
          @           @@
          @  @@@@@@@  @
          @  @     @  @
          @  @     @  @
          @  @     @  @
          @  @     @  @
          @@@@     @@@@
theNamelessOne ★★★★★
()
Ответ на: комментарий от Dron

Никто не хочет делать Нappy Sunday Programming :D

Нам в воскресенье божечка не велит. Так и говорит - в понедельник всё равно переделывать будешь, смысл?

d_a ★★★★★
()
Ответ на: комментарий от theNamelessOne

Воуу, мужик! Вот оно как должно выглядеть оказывается! ::)

Dron ★★★★★
() автор топика
Ответ на: комментарий от d_a

В понедельник надо будет прикручивать компьютерное зрение для автоматического распознавания ::)

Dron ★★★★★
() автор топика
Ответ на: комментарий от d_a

:D у меня при себе ЭМИ если что рядом лежит, ты реализацию давай, надо опередить скайнет!

Dron ★★★★★
() автор топика
Последнее исправление: Dron (всего исправлений: 1)
#!/usr/bin/env python3
import turtle

RIGHT = 0
UP = 90
LEFT = 180
DOWN = 270

COMMANDS = ((2, RIGHT), (6, DOWN), (2, RIGHT), (1, UP), (1, RIGHT), (1, UP), (1, RIGHT), (1, UP), (1, RIGHT),
    (1, UP), (4, RIGHT), (1, DOWN), (1, RIGHT), (1, DOWN), (1, RIGHT), (3, DOWN), (7, RIGHT), (1, DOWN),
    (3, RIGHT), (7, DOWN), (1, LEFT), (6, DOWN), (3, LEFT), (5, UP), (6, LEFT), (5, DOWN), (3, LEFT),
    (7, UP), (3, LEFT), (1, UP), (2, LEFT), (1, UP), (1, LEFT), (2, UP), (2, LEFT), (1, UP), (2, LEFT), (9, UP))

if __name__ == '__main__':
    screen = turtle.Screen()
    turtle.pendown()
    prev_dir = RIGHT
    for steps, direction in COMMANDS:
        turtle.left(direction - prev_dir)
        turtle.forward(steps * 10)
        prev_dir = direction
    turtle.penup()
    screen.mainloop()



Вообще, гораздо интереснее было бы это все проапроксимировать какими-нибудь сплайнами, но это уже задача не на 10 минут вечерком.

unikoid ★★★
()
Ответ на: комментарий от theNamelessOne

Ты сподвигнул меня всё же довести дело до ума

#include <stdio.h>

enum { U,D,L,R }; /*Command => UP,DOWN,LEFT,RIGHT */

  #define SURFACE_SIZE  44 //box surface!
  static char surface [SURFACE_SIZE][SURFACE_SIZE]; 
  char paint_symbol = '@'; 
  char background = ' '; 
  int pose_x =0; // point start paint x position
  int pose_y =0; // point start paint y position
  
#define DATA_SIZE 38 //specific elefan data size array
#define COMMAND 0    //command position in array 
#define DATA 1       //data position in array

static int elefan[DATA_SIZE][2] = {
    
    {R,2},{D,6},{R,2},{U,1},{R,1},{U,1},{R,1},
    {U,1},{R,1},{U,1},{R,4},{D,1},{R,1},{D,1},
    {R,1},{D,3},{R,7},{D,1},{R,3},{D,7},{L,1},
    {D,6},{L,3},{U,5},{L,6},{D,5},{L,3},{U,7},
    {L,3},{U,1},{L,2},{U,1},{L,1},{U,2},{L,2},
    {U,1},{L,2},{U,9}
 };


int main(int argc, char *argv[])
{

/*create surface*/
for (int i = 0; i < SURFACE_SIZE; ++i) 
{
    for (int y = 0; y < SURFACE_SIZE; ++y) 
    {
        surface[i][y]=background;
    };  
};

/*paint elefan*/
for (int i = 0; i < DATA_SIZE; i++)
{
    switch (elefan[i][COMMAND])
    {
        case U:  for(int move = 0; move < elefan[i][DATA];move++)
                    {
                      surface[pose_x--][pose_y]=paint_symbol;
                    };
                    break;
        case D:  for(int move = 0; move < elefan[i][DATA];move++)
                    {
                      surface[pose_x++][pose_y]=paint_symbol;
                    };
                    break;
        case L:  for(int move = 0; move < elefan[i][DATA];move++)
                    {
                        surface[pose_x][pose_y--]=paint_symbol;
                    };                                                                                           surface[pose_x][pose_y]=paint_symbol;
                    break;
        case R: for(int move = 0; move < elefan[i][DATA]; move++ )
                    {
                        surface[pose_x][pose_y++]=paint_symbol;
                    };
                    break;
        default:    break;
    };
}
/*print elefan*/
for (int i = 0; i < SURFACE_SIZE  ; i++)
{
       for(int y=0; y < SURFACE_SIZE; y++)
       {
            putchar(surface[i][y]);
       };
       putchar('\n');
}
    return 0;
}

dron@gnu:~$ gcc slonik.c -o slonik ;./slonik
@@@                                         
@ @                                         
@ @    @@@@@                                
@ @   @@   @@                               
@ @  @@     @@                              
@ @ @@       @                              
@ @@@        @                              
@            @@@@@@@@                       
@                   @@@@                    
@@@                    @                    
  @@@                  @                    
    @                  @                    
    @@                 @                    
     @@@               @                    
       @@@@            @                    
          @           @@                    
          @  @@@@@@@  @                     
          @  @     @  @                     
          @  @     @  @                     
          @  @     @  @                     
          @  @     @  @                     
          @@@@     @@@@                     
                                                           
dron@gnu:~$ 

Dron ★★★★★
() автор топика
#!/usr/bin/bash

ELEPHANT=(
	2→ 6↓ 2→ 1↑ 1→ 1↑ 1→ 1↑ 1→ 1↑ 4→ 1↓ 1→ 1↓ 1→ 3↓ 7→ 1↓ 3→ \
	7↓ 1← 6↓ 3← 5↑ 6← 5↓ 3← 7↑ 3← 1↑ 2← 1↑ 1← 2↑ 2← 1↑ 2← 9↑ \
)

echo -ne "\033[0;0H\033[0;0H\033[2J"
echo -ne "\033[$(($(tput lines)/4))B"
echo -ne "\033[$(($(tput cols)/4))C"
for MV in ${ELEPHANT[@]}
do
	for (( I=0; I<${MV%[[:graph:]]}; I++ ))
	do
		case "${MV#[[:digit:]]*}" in
			"↑") echo -en "@\033[1D\033[1A" ;;
			"↓") echo -en "@\033[1D\033[1B" ;;
			"→") echo -en "@\033[1D\033[1C" ;;
			"←") echo -en "@\033[1D\033[1D" ;;
		esac
	done
done
echo -ne "\033[0;0H\033[0;0H"

exit 0


$ ./elephant.sh 

                  @@@
                  @ @
                  @ @    @@@@@
                  @ @   @@   @@
                  @ @  @@     @@
                  @ @ @@       @
                  @ @@@        @
                  @            @@@@@@@@
                  @                   @@@@
                  @@@                    @
                    @@@                  @
                      @                  @
                      @@                 @
                       @@@               @
                         @@@@            @
                            @           @@
                            @  @@@@@@@  @
                            @  @     @  @
                            @  @     @  @
                            @  @     @  @
                            @  @     @  @
                            @@@@     @@@@

ArcFi
()
Ответ на: комментарий от unikoid
dron@gnu:~$ ./pp.py
Traceback (most recent call last):
  File "/usr/lib/python3.5/tkinter/__init__.py", line 36, in <module>
    import _tkinter
ImportError: No module named '_tkinter'

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "./pp.py", line 2, in <module>
    import turtle
  File "/usr/lib/python3.5/turtle.py", line 107, in <module>
    import tkinter as TK
  File "/usr/lib/python3.5/tkinter/__init__.py", line 38, in <module>
    raise ImportError(str(msg) + ', please install the python3-tk package')
ImportError: No module named '_tkinter', please install the python3-tk package
dron@gnu:~$ 

ты бы результат добавил

проапроксимировать какими-нибудь сплайнами

Я таких слов даже не знаю ::)))

Dron ★★★★★
() автор топика
Ответ на: комментарий от ArcFi

Обнаружен фаворит состязанья. Если, конечно, не будет версии на лиспе расте, то просто дайте этому парню приз и мы пойдём домой.

d_a ★★★★★
()
Ответ на: комментарий от theNamelessOne

Дык код возврата же аля return, видимо чтобы всё было по правилам и имело законченный вид, а не тяп ляп.

Dron ★★★★★
() автор топика
Ответ на: комментарий от Dron

Дык код возврата же аля return

А если его не будет, то скрипт вернёт 42?

видимо чтобы всё было по правилам и имело законченный вид, а не тяп ляп

Спорно.

theNamelessOne ★★★★★
()
Последнее исправление: theNamelessOne (всего исправлений: 1)
Ответ на: комментарий от unikoid

проапроксимировать какими-нибудь сплайнами

# -*- encoding: utf-8 -*-
from scipy.interpolate import spline
import matplotlib.pyplot as plt
import numpy as np

a = "2→ 6↓ 2→ 1↑ 1→ 1↑ 1→ 1↑ 1→ 1↑ 4→ 1↓ 1→ 1↓ 1→ 3↓ 7→ 1↓ 3→ " + \
    "7↓ 1← 6↓ 3← 5↑ 6← 5↓ 3← 7↑ 3← 1↑ 2← 1↑ 1← 2↑ 2← 1↑ 2← 9↑"

x = []; y = []; cx = 0; cy = 0
for q in a.split():
    k = int(''.join(c for c in q if c.isdigit()))
    direction = ''.join(c for c in q if not c.isdigit())
    if direction == "→":   cx += k;
    elif direction == "←": cx -= k;
    elif direction == "↓": cy -= k;
    elif direction == "↑": cy += k;
    x.append(cx); y.append(cy)

t = np.linspace(0, len(x), len(x))
t_new = np.linspace(0, len(x), 10*len(x))
x_new = spline(t, x, t_new)
y_new = spline(t, y, t_new)

plt.plot(x_new, y_new, 'r')
plt.plot(x, y, 'b')
plt.axis('off')
plt.show()
i-rinat ★★★★★
()
Ответ на: комментарий от theNamelessOne

Код возврата это код возврата последней команды, если у echo есть аварийная ситуация с выходом по -42 то значит будет 42, exit это же опционал, хотя конкретно тут он что есть что нет.

Dron ★★★★★
() автор топика
Ответ на: комментарий от Dron

если у echo есть аварийная ситуация с выходом по -42

... то значит, по-хорошему, что exit 0 в конце скрипта тут уже не к месту.

theNamelessOne ★★★★★
()
Ответ на: комментарий от theNamelessOne

ну да, тут вручную заданно что даже в случае ошибки внутри скрипта код возврата возврата самого скрипта будет успешен, хотя в случае ошибки до exit дело и не дойдёт :D Вроде да, вроде не к месту.

Dron ★★★★★
() автор топика
Ответ на: комментарий от FiXer

Я решил петушка не добавлять в задания, ну нафиг этих петушков :D

Dron ★★★★★
() автор топика
Ответ на: комментарий от i-rinat

Отличный результат, местами даже симпатичный.

unikoid ★★★
()

Пожалуйста, объясните кто-нибудь мне где-на этих рандомно раскиданных символах нарисован слон.

omnomnomnus
()
Ответ на: комментарий от omnomnomnus

Ты тред полистай тут доделанные слоники есть, а не только в шапке мой огрызок

Dron ★★★★★
() автор топика

Сатанинский javascript врывается в этот тред

<html>
<head lang="en">
    <meta charset="UTF-8">
</head>
<body>
<canvas id="c" width="800" height="800"></canvas>
<script type="text/javascript">

function d(c,s,x,y,m){
	!s?function(){}():function(){
		s[0]==0?function(){		
			d(c,s.slice(2),x,y,m)
		}():function(){
			c.strokeText("@",x,y);
			d(c,(parseInt(s[0])-1)+s.slice(1),x+m[s[1]][0],y+m[s[1]][1],m);
		}()
		}()
}

window.onload=function(){
	d(document.getElementById("c").getContext("2d"),
		'2→6↓2→1↑1→1↑1→1↑1→1↑4→1↓1→1↓1→3↓7→1↓3→7↓1←6↓3←5↑6←5↓3←7↑3←1↑2←1↑1←2↑2←1↑2←9↑',50,50,
		{'→':[30,0],'←':[-30,0],'↓':[0,30],'↑':[0,-30]})
}

</script>
</body>
</html>

arax ★★
()
Ответ на: комментарий от arax

Так чуть более извращенно:

<html>
<head lang="en">
    <meta charset="UTF-8">
</head>
<body>
<canvas id="c" width="800" height="800"></canvas>
<script type="text/javascript">

function d(c,s,x,y,m){
	!s?s:(s[0]==0?(d(c,s.slice(2),x,y,m)):(c.strokeText("@",x,y),d(c,(parseInt(s[0])-1)+s.slice(1),x+m[s[1]][0],y+m[s[1]][1],m)))
}

window.onload=function(){
	d(document.getElementById("c").getContext("2d"),
		'2→6↓2→1↑1→1↑1→1↑1→1↑4→1↓1→1↓1→3↓7→1↓3→7↓1←6↓3←5↑6←5↓3←7↑3←1↑2←1↑1←2↑2←1↑2←9↑',50,50,
		{'→':[30,0],'←':[-30,0],'↓':[0,30],'↑':[0,-30]})
}

</script>
</body>
</html>

arax ★★
()

Такие занятия рекомендуются детям от 4 до 12 лет, хотя могут быть интересны и более старшим. Это упражнение развивает внимание, пространственное восприятие, мелкую моторику.

Лошадка, лошадка...

Чего-то у меня не то получается. http://imgur.com/a/ZU6Uh

fornlr ★★★★★
()
Последнее исправление: fornlr (всего исправлений: 1)
Ответ на: комментарий от fornlr

Вот не по ТЗ рисовал, одна жопа только и получилась :D

Dron ★★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.