O TEMA DO FÓRUM ESTÁ EM MANUTENÇÃO. FEEDBACKS AQUI: ACESSAR

Snippets - Venha treinar sua lógica!

Iniciado por Raizen, 10/03/2017 às 11:43

10/03/2017 às 11:43 Última edição: 10/03/2017 às 16:55 por Raizen

[box2 class=green title=O que são]Snippets são pequenos trechos de código que tem como principal objetivo o reuso. Um snippet serve para economizar o tempo tendo funções pré-definidas, snippets também são comumente criadas na aprendizagem de programação. Em geral os snippets por serem menores e mais diretos, é muito bom se eles forem mais eficientes possíveis. Exemplos de snippets:
  • Somar números em uma array
  • retornar os números primos
  • retornar o próximo número par
  • Criar uma área circular[/box2]

    [box2 title=Objetivo do tópico] O objetivo do tópico é que criem e coloquem os snippets que criaram, assim podemos aumentar o nosso banco de snippets. Desse modo os desenvolvedores podem buscar snippets que já estão prontos nesse tópico, e esse tópico também tem como intuito avaliação dos snippets para melhorar a performance deles, se quiser ser avaliado por um snippet, basta pedir na resposta ao mandar o snippet para avaliarem.[/box2]

    [box2 class=red title=Ruby]
    Somar Números na Array
    Autor: Raizen
    Descrição:O script soma valores dentro de uma array, depois de declarado a array basta usar o método sum
    # [1, 2, 3, 5].sum
    class Array
      def sum
        add = 0
        self.each {|interator| add += interator }
        return add
      end
    end
    
    [close]
    Word Wrapper

    Autor: Alisson
    Descrição: O Word Wrap serve para você obter um texto com quebra de linha (\n) caso ele ultrapasse a largura definida.
    def wrap_text(text, width)
      bitmap = Bitmap.new(width, 24)
      result = ""
      words = text.split(" ")
      pointer = 0
      for w in words
        word_width = bitmap.text_size(w).width
        space_width = bitmap.text_size(" ").width
        if pointer < width
          if pointer + word_width > width
            result << "\n" << w << " "
            pointer = word_width + space_width
          else
            result << w << " "
            pointer += word_width + space_width
          end
        else
          result << "\n" << w << " "
          pointer = word_width + space_width
        end
      end
      return result
    end
    
    [close]
    Distancia Entre 2 pontos
    Autor:Raizen
    Descrição: Mede a distancia entre 2 coordenadas
    def distanceBetweenPoints(x, y, x2, y2)
      Math.sqrt((x2-x)**2 + (y2-y)**2)
    end
    
    [close]
    Numero Primo

    Autor:Raizen
    Descrição: Valida se um número é primo ou não
    class Integer
    	def isPrime?
    		self.times.count {|num| self % (num + 1) == 0} < 3
    	end
    end
    
    [close]
    [/box2]

    [box2 class=blue title=JavaScript]
    Word Wrapper

    Autor: Alisson
    Descrição: O Word Wrap serve para você obter um texto com quebra de linha (\n) caso ele ultrapasse a largura definida.
    function WrapText (text, width) {
        var bitmap = new Bitmap(width, 28);
        var result = "";
        var words = text.split(" ");
        var pointer = 0;
        for (var element of words) {
            var wordWidth = bitmap.measureTextWidth(element);
            var spaceWidth = bitmap.measureTextWidth(" ");
            if (pointer < width) {
                if (pointer + wordWidth > width) {
                    result += "\n";
                    pointer = 0;
                    result += element;
                    result += " ";
                    pointer += wordWidth + spaceWidth;
                } else {
                    result += element;
                    result += " ";
                    pointer += wordWidth + spaceWidth;
                }
            } else {
                result += "\n";
                pointer = 0;
                result += element;
                result += " ";
                pointer += wordWidth + spaceWidth;
            }
        }
        return result;
    };
    
    [close]
    [/box2]


    Para mandar um snippet, pode usar o template abaixo:

    [spoiler=NomeDoSnippet][code]#Autor: Seu Nome
    # O que faz o snippet
    Seu código
    [/code][/spoiler]

10/03/2017 às 14:13 #1 Última edição: 10/03/2017 às 14:16 por Alisson
Direto do meu core.
[box2 class=red title=Word Wrap]Autor: Alisson
Descrição: O Word Wrap serve para você obter um texto com quebra de linha (\n) caso ele ultrapasse a largura definida.
def wrap_text(text, width)
  bitmap = Bitmap.new(width, 24)
  result = ""
  words = text.split(" ")
  pointer = 0
  for w in words
    word_width = bitmap.text_size(w).width
    space_width = bitmap.text_size(" ").width
    if pointer < width
      if pointer + word_width > width
        result << "\n" << w << " "
        pointer = word_width + space_width
      else
        result << w << " "
        pointer += word_width + space_width
      end
    else
      result << "\n" << w << " "
      pointer = word_width + space_width
    end
  end
  return result
end

[/box2]

Depois eu mando mais \o/

Adicionado  :wow: , muito bom esse ai heim.

Adicionei 2 meus também que fiz aqui porque quando tenho tempo no trabalho e não posso abrir nada suspeito hahah, isso parece que estou programando algo importante  :derp:

Distância entre 2 pontos
def distanceBetweenPoints(x, y, x2, y2)
  Math.sqrt((x2-x)**2 + (y2-y)**2)
end


Número Primo
class Integer
  def isPrime?
    self.times.count {|num| self % (num + 1) == 0} < 3
  end
end


Versão do Word Wrap para Javascript.
[box2 class=green title=Word Wrap]Autor: Alisson
Descrição: O Word Wrap serve para você obter um texto com quebra de linha (\n) caso ele ultrapasse a largura definida.
function WrapText (text, width) {
    var bitmap = new Bitmap(width, 28);
    var result = "";
    var words = text.split(" ");
    var pointer = 0;
    for (var element of words) {
        var wordWidth = bitmap.measureTextWidth(element);
        var spaceWidth = bitmap.measureTextWidth(" ");
        if (pointer < width) {
            if (pointer + wordWidth > width) {
                result += "\n";
                pointer = 0;
                result += element;
                result += " ";
                pointer += wordWidth + spaceWidth;
            } else {
                result += element;
                result += " ";
                pointer += wordWidth + spaceWidth;
            }
        } else {
            result += "\n";
            pointer = 0;
            result += element;
            result += " ";
            pointer += wordWidth + spaceWidth;
        }
    }
    return result;
};

[/box2]

Bacana a distância entre os pontos, tenho que usar isso qualquer dia :D

Ruby:
[box2 class=red title=Vector Normalization]Autor: Alisson
Descrição: Serve para normalizar uma linha Vector. Em sua forma mais simples, ele pega os pontos x, y e z (caso queira) e normaliza seus valores.
O processo obtém a soma de todos os elementos da linha, e retorna todos os elementos divididos pelo resultado dessa soma.
def vector_normalize(x, y, z = nil)
    length = Math.sqrt((x * x) + (y * y) + (z.nil? ? 0 : z * z))
    x /= length
    y /= length
    z /= length if z
    return [x, y, z]
  end

[/box2]

Javascript:
[box2 class=green title=Vector Normalization]Autor: Alisson
Descrição: Serve para normalizar uma linha Vector. Em sua forma mais simples, ele pega os pontos x, y e z (caso queira) e normaliza seus valores.
O processo obtém a soma de todos os elementos da linha, e retorna todos os elementos divididos pelo resultado dessa soma.
function vectorNormalize(x, y, z) {
    z = z || null
    var length = Math.sqrt((x * x) + (y * y) + (z === null ? 0 : z * z));
    x /= length;
    y /= length
    if (z) {
        z /= length;
    }
    return [x, y, z];
}

[/box2]



Eu recomendo o uso disso com o snippet da distância entre os pontos, seja lá para o que você for precisar :T

28/03/2017 às 13:32 #5 Última edição: 28/03/2017 às 15:48 por Valentine
Eu também fiz um Word Wrap:
Word Wrap
Autor: Valentine
Descrição: Quebra uma string caso ela ultrapasse a largura definida.
def word_wrap(text, width)
  bitmap = Bitmap.new(4, 4)
  return [text] if bitmap.text_size(text).width <= width
  lines = []
  line = ''
  line_size = 0
  text.each_line(' ') do |word|
    word_size = bitmap.text_size(word).width
    if word_size > width
      c = ''
      c_size = 0
      word.each_byte do |i|
        i_size = bitmap.text_size(i.chr).width
        if c_size + i_size <= width
          c << i.chr
          c_size += i_size
        else
          lines << line if line.size > 0
          lines << c
          c = i.chr
          c_size = i_size
          line = ''
        end
      end
      line << c
      next
    end
    if line_size + word_size <= width
      line << word
      line_size += word_size
    else
      lines << line
      line = word
      line_size = word_size
    end
  end
  bitmap.dispose
  lines << line
  return lines
end
[close]

Eu ainda não comparei muito o meu código e o do Alisson, mas apesar de o meu ser um pouco maior e mais lento que o dele, é mais completo. Por exemplo, se eu continuar pressionando a tecla A por um tempo (sem dar espaço), o código do Alisson não quebra a linha, enquanto o meu sim. Veja:


Acredito que o meu Word Wrap seja um pouco mais lento especialmente porque da para fazer a quebra de linha acima e, para isso, eu usei um text_size a mais que o Word Wrap do Alisson.

@Alisson
Em relação ao seu Word Wrap, se o valor de space_width é sempre o mesmo, não seria melhor ele ficar fora do for e não dentro dele?
De todo modo, seu código parece ótimo, parabéns.

@Tópico
Gostei muito do tópico.

+ 1 ouro

Opa, e bota completo nisso, haha'
Em relação ao text_width, creio que a maior falha em ambos seja a criação de um bitmap para medir o tamanho.
Estava programando aqui várias coisas e alterei a fonte do bitmap do meu sprite para um tamanho menor, enquanto sempre que eu usava o word_wrap, ele contava com o tamanho de uma fonte diferente para realizar a quebra de linha.
Por isso na versão do meu aqui (não a do tópico) eu adicionei uma opção de utilizar um bitmap externo como base para medir o tamanho da fonte.
O problema do space_width é em relação a um bug do Ace, onde ele costuma ter um valor de medição estranho e incorreto dentro do método text_size (por isso que eu sempre adiciono um valor a mais no resultado), mas na versão de javascript ele pode ficar fora mesmo.

E sobre ele não quebrar... lol, acho que foi proposital, nem lembro aehuahe
Enfim, ótimo snippet, e realmente bem completo, por sinal. Nós só precisamos aprender a evitar o uso de << pois ele é lento demais pra processar >.>




Quem tiver mais snippets vão mandando, galera. Isso é uma fonte de informação bem valiosa no cenário da programação.

28/03/2017 às 16:50 #7 Última edição: 28/03/2017 às 22:10 por Valentine
Citação de: AlissonEm relação ao text_width, creio que a maior falha em ambos seja a criação de um bitmap para medir o tamanho.
Estava programando aqui várias coisas e alterei a fonte do bitmap do meu sprite para um tamanho menor, enquanto sempre que eu usava o word_wrap, ele contava com o tamanho de uma fonte diferente para realizar a quebra de linha.
Por isso na versão do meu aqui (não a do tópico) eu adicionei uma opção de utilizar um bitmap externo como base para medir o tamanho da fonte.
No Word Wrap que eu fiz para o Netplay Diamond, eu defino a var bitmap assim:
bitmap = self.contents == nil ? Bitmap.new(4, 4) : self.contents

Desse modo, se o Word Wrap estiver sendo usado em uma window e ela já possuir um self.contents declarado, o Word Wrap não cria outro bitmap. Além do mais, ao usar self.contents em vez de criar um novo bitmap em uma window, o text_size leva em consideração o tamanho da fonte da window e não o padrão.

Como eu fiz o Word Wrap para o Netplay Diamond, eu ainda pensei na possibilidade de o jogador digitar mais de um espaço (entre uma palavra e outra) na caixa de texto do bate-papo, então eu usei o each_line em vez de for para que o Word Wrap retorne a quantidade exata de espaços digitados. Veja:


Enfim, é ótimo poder debater isso aqui. Eu pretendo contribuir com o pouco que sei e aprender mais.

Espero que possa Java, não me excluam...

[box2 class=black title=Soma dos Quadrados]Autor: Nandikki
Descrição: Fiz para um desafio. O método retorna um inteiro que equivale a soma dos quadrados de todos os números de 1 até x. Exemplo: 1² + 2² + 3²...x².
static int somaDosQuadrados(int x) {
		
		int soma = 0; //Variável para armazenar o resultado.
		
		for (int i = 1; i <= x; i++) { // x é a quantidade de termos a serem elevados ao quadrado e somados
			soma += Math.pow(i,  2);
		}
		
		return soma;
	}

[/box2]

[box2 class=black title=Quadrado das Somas]Autor: Nandikki
Descrição: Fiz para um desafio. O método retorna um inteiro que equivale o quadrado da soma dos números 1 até x. Exemplo: (1+2+3+4+5+6...+x)².

static int quadradoDasSomas(int x) {
		
		int resultado = 0; //Variável para armazenar o resultado
		
		for (int i = 1; i <= x; i++) { // x é a quantidade de termos a serem somados
			resultado += i;
		}
		
		return (int) Math.pow(resultado, 2); // eleva a soma resultante ao quadrado.
	}

[/box2]

16/04/2017 às 03:34 #9 Última edição: 16/04/2017 às 04:17 por Alisson
[box2 class=blue title=Lerp]Autor: Alisson && aib && Eric
Descrição: Mathf.Lerp é uma maravilha pra quem mexe no Unity, e tendo isso em mente realizei um pequeno teste no RPG Maker.
Basicamente o que o Lerp faz é realizar uma transição suave (interpola) do ponto A até o ponto B pela fração F.
def lerp(a, b, f) # A e B precisam ser arrays (vectors) de 2 tamanhos contendo floats. F precisa ser a fração, obviamente em float.
  s = a.size
  return if b.size != s
  x = []
  for i in 0...s
    x.push(a[i] + f * (b[i] - a[i]))
  end
  return x
end

[/box2]

Com o Lerp, você pode fazer algo assim, por exemplo:

Exemplo de código (plug n' play, contanto que seja em um projeto vazio):
class Scene_Title < Scene_Base
  
  alias :test_start :start
  def start
    test_start
    @test_sprite = Moving_Sprite.new
    @test_sprite.bitmap = Bitmap.new(24, 24)
    @test_sprite.bitmap.fill_rect(0, 0, 24, 24, Color.new(255, 255, 255, 255))
    @test_sprite.z = 300
    @command_window.deactivate
    @attractor = Attractor.new
  end
  
  alias :test_update :update
  def update
    test_update
    if Input.press?(:RIGHT)
      @attractor.x += 4
    end
    if Input.press?(:LEFT)
      @attractor.x -= 4
    end
    if Input.press?(:UP)
      @attractor.y -= 4
    end
    if Input.press?(:DOWN)
      @attractor.y += 4
    end
    lerp_sprite_pos
    @test_sprite.update
    @attractor.update
  end
  
  def lerp_sprite_pos
    a = [@test_sprite.coord_x, @test_sprite.coord_y]
    b = [@attractor.x, @attractor.y]
    f = 0.05
    res = lerp(a, b, f)
    @test_sprite.coord_x = res[0]
    @test_sprite.coord_y = res[1]
  end
  
  def lerp(a, b, f)
    s = a.size
    return if b.size != s
    x = []
    for i in 0...s
      x.push(a[i] + f * (b[i] - a[i]))
    end
    return x
  end
  
end

class Moving_Sprite < Sprite
  attr_accessor :coord_x
  attr_accessor :coord_y
  
  def initialize(vp = nil)
    super
    @coord_x = 0.0
    @coord_y = 0.0
    update
  end
  
  def update
    super
    self.x = @coord_x
    self.y = @coord_y
  end
  
end

class Attractor
  
  attr_accessor :x
  attr_accessor :y
  
  def initialize
    @x = 0
    @y = 0
    @time = Time.now.sec
    @sprite = Sprite.new
    @sprite.bitmap = Bitmap.new(12, 12)
    @sprite.bitmap.fill_rect(0, 0, 12, 12, Color.new(0, 0, 0, 255))
    @sprite.z = 400
    update
  end
  
  def update
    @sprite.x = @x
    @sprite.y = @y
  end
  
end

25/05/2017 às 12:20 #10 Última edição: 26/05/2017 às 09:25 por GabrielMoon
Código em Lua;
Autor: GabrielMoon / Mochorro / Modog
Ele retorna o valor que você quer saber só tal porcetagem, por exemplo: Tenho 602 e, quero saber quanto ele irá
valer se eu tiver 25% dele. Códigos simples, fácil e também bem fácil de converter para outras linguagens.

function porcento(   valor, porcetagem  )

		resultado = valor*porcetagem/100
		
	return resultado
end
engenheiro de software e designer aposentado

Citação de: GabrielMoon online 25/05/2017 às 12:20
Código em Lua;
Ele retorna o valor que você quer saber só tal porcetagem, por exemplo: Tenho 602 e, quero saber quanto ele irá
valer se eu tiver 25% dele. Códigos simples, fácil e também bem fácil de converter para outras linguagens.


function porcento(   valor, porcetagem  )

		resultado = valor*porcetagem/100
		
	return resultado
	
end

Não seria melhor definir resultado como uma variável local ou não usá-la, assim:
function percent(value, percentage)
  return value * percentage / 100
end

Além do mais, acredito que é sempre bom criar os códigos em inglês, seguindo o design pattern.

Citação de: Valentine online 26/05/2017 às 08:15
Citação de: GabrielMoon online 25/05/2017 às 12:20
Código em Lua;
Ele retorna o valor que você quer saber só tal porcetagem, por exemplo: Tenho 602 e, quero saber quanto ele irá
valer se eu tiver 25% dele. Códigos simples, fácil e também bem fácil de converter para outras linguagens.


function porcento(   valor, porcetagem  )

		resultado = valor*porcetagem/100
		
	return resultado
	
end

Não seria melhor definir resultado como uma variável local ou não usá-la, assim:
function percent(value, percentage)
  return value * percentage / 100
end

Além do mais, acredito que é sempre bom criar os códigos em inglês, seguindo o design pattern.

É melhor sim, mas pensei no pessoal da comunidade, então, queria deixar algo que só de bater a vista seja
compreensivel e faço de passar para outra linguagem.
engenheiro de software e designer aposentado