Mais um blog inútil.

Arvorezinha

Abril 23, 2009

Arvorezinha .NET

Arquivado em: arvorezinha, coding, useless — spico @ 15:22

Não é ASP.NET .. Mas sim PAINT.NET

Dcoder e falso, fica ai o desafio para optimizarem esta arvorezinha em Paint.NET

arvorezinha

Abril 22, 2009

Arvorezinha - Malbolge

Arquivado em: arvorezinha — falso @ 01:32

Ora viva amigos!
Para quem duvidou, aqui está a arvorezinha em Malbolge (provavelmente a linguagem de programação mais difícil de todos os tempos), versão lame, sem ciclos, só prints. Como a versão em brainfuck.

('&%#^"!~|X9876543210/.-,+*)('&%$#z!~>v{^:K77o54VTSShmPe+MLJJH%$#!
mB}A\zyxed:976q542m~k/ig,fevcb``#^>~}Z|{z10TSuts*)Momll)jh~Df{dcb=

Usei uma batota para chegar a este código, mas acho que ninguém vai chegar la :-P
Até la, fiquem bem, e joguem muito!

EDIT:

O sir dongs optimizou ainda mais, fez uma em 104 caracteres, quando a minha usava 133 caracteres. Aqui vai, optimizadissimo:

('B%#^"!~|Y{zy0/SuQrrppnKmkk"FEDfedb?a<_:L87I654E20|
nmPN+))JfI^$#E!~}|\?ZwvvP9T7R4n3m~//JhBGdvcb<;@^>J[

EDIT2:
E ainda mais optimizado pelo sir Dcoder de novo, agora com 98 caracteres:

(&<;_#"~[}|3z1UTv3,+Oqpo&%IHGig}|Bdyxwv<:L9qv6543
210{Q,+NMLK'I%G#"!C|A/?>xwvtO8&654n21FEiI+A*(>=a_

Abril 21, 2009

ArveZinHa em LOLCODE

Arquivado em: arvorezinha, coding, useless — drune @ 20:13

Olá a todos,

Estava eu também a acompanhar esta saga maravilhosa da criação da arvorezinha em tudo o que é possível e decidi dar o meu contributo na medida do possível.
Então decidi pegar numa linguagem bastante usada o LOLCODE e numa implementação ainda mais usada o LOLPYTHON e escrever uma arvorezinha nesta maravilhosa linguagem. Ora o interpretador desta coisa fantástica é apenas um ficheiro e serve para tudo e mais alguma coisa.

A linguagem que vos vou mostrar de seguida é perigosa e não deve ser tentada em casa. Além de ser necessário chafurdar no source code do interpretador, ainda é necessário muito tempo para saber o que é um CHEEZBURGER.

Então aqui teem a beldade. Divirtam-se:

I CAN HAZ CHEEZBURGER
L CAN HAS 6
Z CAN HAS CHEEZBURGER
K CAN HAZ ''
WHILE I CUTE?
  Z CAN HAZ Z ALONG WITH CHEEZBURGER
  IZ L BIG LIKE Z?
   K CAN HAZ K ALONG WITH '*'
   VISIBLE K
  NOPE?
   KTHXBYE

VISIBLE 'zZ (LOLArvezinha v0.1 - Dedicated to BLOL.ORG) zZ '

O resultado é qualquer coisa assim:

arvlol

Obrigado a todos

Arvorezinha dBASE

Arquivado em: arvorezinha, coding, useless — mirage @ 15:28

Olá caros jardineiros. Tenho assistido com agrado à proliferação de arvorezinhas (deveras ecológico), todavia não tenho tido disponibilidade para vos acompanhar, o que me tem entristecido. Não mais! Eis uma arvorezinha em dBASE (não confundir com clipper), a correr na versão IV, que tive o prazer de usar na escola secundária. Apraz-me o print implícito das variáveis, o que obrigou a modificar ligeiramente a lógica habitual das arvorezinhas. Aqui está um screenshot do dBASE IV para reavivar a memória:
dBASE IV
dBASE IV

O arvorezi.prg consiste apenas no seguinte:

a = "*"
do while len(a) < 5
a = a + "*"
enddo
wait

Eis o resultado:
Arvorezinha no dBASE IV
Arvorezinha no dBASE IV

Abril 20, 2009

arvorezinha em x86 2.0 - boot sector

Arquivado em: arvorezinha, assembly, coding, fail — dcoder @ 10:09

Olá sirs,

Para completar a colecção fiz a arvorezinha como boot sector, sem recorrer a chamadas ao sistema ou à BIOS. Assim até podem usar uma BIOS opensource e a arvorezinha continua a funcionar!

Eis o código:

BITS 16
ORG 0x7C00

start:
mov ax, 0xb800
mov es, ax
mov ax, 0x072a
mov bx, 5
mov dx, 1
xor di, di
_loop1:
mov cx, dx
rep stosw
add di, 160
sub di, dx
sub di, dx
inc dx
cmp dx, bx
jbe _loop1

_loop2:
in al,0x60 ; read from keyboard
cmp al, 1 ; is it escape?
jnz _loop2

jmp 0xFFFF:0000 ; reboot ;-)

; pad to 512
times 510-($-$$) db 0
dw 0xAA55 ; magic boot value

Assemblem com o NASM, e guardem o output de 512 bytes no sector 0 de um disco ou disquete ou CD. As últimas instruções antes do padding servem para esperar que o utilizador carregue na tecla ESC; após isto, reinicia.

Output testada no VMWare:

boot

Abril 19, 2009

Árvore-completa em "Logo"

Arquivado em: arvorezinha, useless — ali-o-kimiku @ 21:53

Não fiquei satisfeito com o programa da árvorezinha em “Logo”. Não era fiel à linguagem (uma vez que esta se baseia no desenho). Aqui está a versão da árvorezinha desenhada  em Logo.

# ali-o-kimiku (c) 2009
learn estrela $L {
# estrela
# 90+36=126
turnleft 126
repeat 5
{
forward $L
# 180-36=144
turnright 144
}
penup
turnright 126
}
learn avancah $H {
penup
turnleft 90
#espaço horizontal
forward $H
turnright 90
pendown
}
learn avancav $V {
penup
forward $V
pendown
}
# Programa Principal
reset
#spritehide
$n=ask "Quantos raminhos ?"
$i=1
$lado=30
$delta=4
#sin(72)=0.951056516
#cos(72)=0.309016994
#c72=0.309016994
#s72=0.951056516
$avh=$lado
$avv=$lado
$navv=0-$lado
$navh=0-$lado
go $lado,$lado/2
repeat $n {
 repeat $i {
  estrela $lado
  avancah $avh+$delta
 }
 $i=$i+1
 avancav $navv
 avancah $i*($navh-$delta)
}
penup
spriteshow

Arvorezinha completamente desenhada no kturtle
Arvorezinha completamente desenhada no kturtle

Arvorezinha - 6502 Assembly (NES)

Arquivado em: arvorezinha — falso @ 19:44

Olá jovens garotos!

Desde sexta-feira que andei com ideias de fazer uma arvorezinha para a clássica NES, comecei então a minha jornada de ver como funcionava esta maravilha da minha juventude!
Achei o site nesdev que tem montes de informação sobre a consola, e tambem tem alguns sores para algumas roms, mas não achei nada que printasse texto para o ecrã, que é o pretendido. Num dos textos que li vi uma referência ao canal #nesdev da efnet, então lá fui eu, e não é que existe uma grande comunidade de pessoal que percebe e ama isto, e pelos vistos são todos amigaveis, falei la com uns deles, e um deles (não me recordo do nick…) enviou me um zipzinho com 4 tutoriais, e o ultimo deles escreve “Hello World” pro ecrã, copiei descaradamente do codigo desse.

Aqui segue o sores:

.include "nes.h"

POS1 = $0300 ; Endereço de memoria onde vai guardar o primeiro byte da posição de print inicial 0x21cd
POS2 = $0301 ; segundo byte

COUNTER1 = $0310 ; primeiro contador
COUNTER2 = $0311 ; segundo contador

TEMP1 = $0320 ; variavel temporaria usada para comparar com 5

CURBG = $0325 ; utilizado pra guardar o indice actual da palete para a cor do background

; The iNES header tells the emulator which circuit board to emulate.
; The emulator can see it, but the emulated NES cannot.
.segment "INESHDR"
  .byt "NES", $1A  ; these four bytes identify a file as an NES ROM
  .byt 1  ; size of PRG, in 16384 byte units
  .byt 1  ; size of CHR, in 8192 byte units
  .byt 0, 0  ; mapper, mirroring, etc.  You'll learn these later.

.segment "ZEROPAGE"
; Reserve 1 byte for the variable 'retraces', used to detect
; the vertical blanking interrupt
retraces: .res 1

; Now the NMI routine actually does something!
.segment "VECTORS"
  ; NMI vector is at $FFFA, reset at $FFFC, IRQ at $FFFE
  .addr nmi, reset, irq

.segment "CODE"
.proc reset
; inicializar variaveis!!!
; variaveis pelos vistos começam em $c000
;posicao: .byte $21, $CD
  lda #$21
  sta POS1
  lda #$cd
  sta POS2
;counter1:	.byte $00
  lda #$00
  sta COUNTER1
;counter2:	.byte $00
  lda #$00
  sta COUNTER2
; define o currbg
  lda #$05
  STA CURBG

  ; Turn off PPU
  lda #0
  sta PPUCTRL  ; turn off NMI
  sta PPUMASK  ; turn off display

  ; Set up stack pointer
  ldx #$FF
  txs

  ; Wait for PPU to stabilize
  warmup1:
    lda PPUSTATUS
    bpl warmup1
  warmup2:
    lda PPUSTATUS
    bpl warmup2

  ; define palete
  lda #$3F
  sta PPUADDR
  lda #$00
  sta PPUADDR

  lda #$3A ; VERDE posicao 0
  sta PPUDATA

  lda #$3B ;
  sta PPUDATA

  lda #$3C;
  sta PPUDATA

  lda #$30
  sta PPUDATA

  lda #$16
  sta PPUDATA

  ; If you're going to turn on rendering, you don't need to reset the
  ; VRAM address.  Setting the scroll position does this for you.
  ; Turn on vblank notification
  lda #VBLANK_NMI
  sta PPUCTRL

  ; Wait for a vblank before turning the screen on
  jsr wait_vblank

  ; PPUMASK controls whether sprites are displayed and whether the
  ; background is displayed.  Here, display only the background.
  lda #BG_ON
  sta PPUMASK

  nop
  nop

  lda #CH_ALL ; ligar o chip de som
  sta SND_CHN

  lda #15 | SQ_1_2
  sta SQ1_VOL  ; for pulse 1
  lda #SWEEP_OFF
  sta SQ1_SWEEP  ; for pulse 1  

_ciclo1:
  ldx #$05 ; le o valor 5 para X - $c063
  stx TEMP1 ; grava X em TEMP1
  lda COUNTER1 ; le o contador 1 para A
  cmp TEMP1 ; compara A com TEMP1 (5)
  beq _fim ; se for igual -> _fim
  lda #$00 ; le 0 para A
  sta COUNTER2 ; define counter2 a 0

_ciclo2:
  lda COUNTER1 ; le coutner1 para A
  cmp COUNTER2 ; compara c1 com c2
  bcs _estrela ; se for menor -> estrela

  jsr proxima_linha ; manda mudar de linha

  lda COUNTER1 ; le o c1 para A
  clc ; limpa a carry
  adc #$01 ; adiciona 1 a A
  sta COUNTER1 ; guarda A em c1
  jmp _ciclo1 ; salta para o _ciclo1

_estrela:
  jsr imprime ; imprime *
  jsr proximo_char ; move a posição para o prox char

  lda COUNTER2 ; le o c2 para A
  clc ; limpa a carry
  adc #$01 ; adiciona 1 a A
  STA COUNTER2 ; guarda A em c2
  jmp _ciclo2 ; salta para _ciclo2

  _fim:

  jsr barulhinho1

  ; Wait for a few vblanks.
  jsr wait_vblank
  jsr wait_vblank
  jsr wait_vblank
  jsr wait_vblank
  jsr wait_vblank

  ; Under most circumstances, we can only update the VRAM through
  ; PPUADDR and PPUDATA at one of two times: when rendering is turned
  ; off, and in the first 2200 or so cycles after vblank starts.
  ; The PPU is continuously accessing VRAM at all other times,
  ; so the CPU has to keep its hands off.
  ; But a vblank has just started, so we're safe.
  jsr barulhinho2

  ; Spin until power off
  forever:
  jsr mudabackground
  jsr wait_vblank ; aguarda um pouco senao nem se nota
  jsr wait_vblank
  jsr wait_vblank
  jsr wait_vblank

  jmp forever

.endproc

.proc mudabackground
  ; define o endereço da cor do bg
  lda #$3F
  sta PPUADDR
  lda #$00
  sta PPUADDR

  lda CURBG ; le o curbg inicial 0x03
  sta PPUDATA
  EOR #$01
  STA CURBG

  jsr actualiza_ppu

  rts
.endproc

.proc imprime

  lda POS1
  sta PPUADDR

  lda POS2
  sta PPUADDR

  lda #'*'
  sta PPUDATA

  jsr mudabackground

  jsr actualiza_ppu
  jsr wait_vblank ; aguarda um pouco
  jsr wait_vblank
  jsr wait_vblank

  rts
.endproc

.proc proxima_linha

  ; MUDAR DE LINHA
  clc ; limpa o carry
  lda POS2 ; le o segundo byte da posição2
  adc #$20 ; incrementa 0x20 (32) , se der a volta mete o carry a 1
  sta POS2 ; guarda

  lda POS1 ; le o primeiro byte da posicao
  adc #$0 ; incrementa 0 + carry
  sta POS1 ; guarda

  ; REMOVER O NUMERO DE ESTRELAS IMPRESSAS, PARA IR PRO X INICIAL
  sed
  lda POS2 ; le o segundo byte da posição
  sec ; define o carry
  sbc COUNTER2 ; remove-lhe o numero de estrelas printadas
  sta POS2 ; guarda

  lda POS1 ; le o primeiro byte da posicao
  sbc #$0 ; remove 0 - carry
  sta POS1 ; guarda

  jsr barulhinho2 

  rts
.endproc

.proc proximo_char
  clc ; limpa a carry
  lda POS2 ; le o segundo byte da posicao para A
  adc #$01 ; incrementa 1 a A, se der a volta mete o carry a 1
  sta POS2 ; guarda em POS2 o valor de A

  lda POS1 ; le a primeira posição para A
  adc #$0 ; incrementa 0 + carry (se houver)
  STA POS1 ; guarda POS1

  jsr barulhinho1

  rts ; volta a onde foi chamado
.endproc

.proc actualiza_ppu
  ; Set the scroll position of the background by writing (x, y)
  ; pixel coordinates to PPUSCROLL.   This should always be done
  ; as the last thing before turning on rendering.
  ; The earliest programs will always scroll to (0, 0), so write
  ; 0 twice.

  ; Again, reset the VRAM address by writing to PPUCTRL and
  ; PPUSCROLL.  We need to do this every time we use PPUADDR and
  ; PPUDATA to load something into VRAM.
  lda #VBLANK_NMI
  sta PPUCTRL
  lda #0
  sta PPUSCROLL
  sta PPUSCROLL
  rts
.endproc

.proc barulhinho1
  ; The E above that B is 1318.5 Hz.
  lda #84  ; (111860.8 / 1318.5) - 1
  sta SQ1_LO
  lda #%00001000
  sta SQ1_HI
  rts
.endproc

.proc barulhinho2
  ; The B nearly two octaves above middle C is 987.77 Hz.
  ;lda #112  ; (111860.8 / 987.77) - 1
  lda #50  ; (111860.8 / 987.77) - 1
  sta SQ1_LO
  lda #%00001000
  sta SQ1_HI
  rts
.endproc

; When the PPU is told to generate interrupts on vertical blank,
; it sends a signal to the CPU that sends it here.
.proc nmi
  ; Set the 'retraces' variable up by 1 so that the main program
  ; can see that a vblank has happened.
  inc retraces

  rti
.endproc

; We don't use IRQ so don't do anything
.proc irq
  rti
.endproc

; This subroutine waits for the NMI handler to change retraces.
.proc wait_vblank
  lda retraces

  ; The 'cmp' (compare) instruction reads a value from a memory
  ; location and then performs a subtraction: register A minus the
  ; value from memory.  Then it discards the value, but it sets the
  ; minus flag based on bit 7 of the result, and it sets the equal
  ; flag if the result was zero.  So this loop will spin until
  ; the new value of retraces has become different from the old
  ; value, which indicates that the NMI handler has run.
  loop:
    cmp retraces
    beq loop

  ; To jump to the instruction after the 'jsr' that called a
  ; subroutine, use the 'rts' (return from subroutine, or return
  ; to saved) instruction.
  rts
.endproc

; Include a font.  Without a font, the NES isn't going to display
; anything.
.segment "CHR"
.incbin "ascii.chr"

Podem fazer download do sores completo, licença WTFPL. É preciso ter instalado o cc65 para assemblar.
Download da rom em ficheiro .nes para correr nos emuladores arvorezinha.nes. Utilizei os emuladores fceux e o nintendulator porque têm debuggers fixes.

Segue aqui um videozinho do que esta arvorezinha é capaz!

E já que pus suporte para videos no blol, aqui vai mais um da arvorezinha a correr num emulador de NES da Nintendo DS.

Se alguém se julgar com suficientes pelos no peito, capaz de queimar isto num cartucho e correr numa nes de verdade e filmar só pelo lulz, ofereco-lhe duas internets.

Bem hajas, e até à proxima, talvez agora para a Super Nintendo!

Arvorezinha - Smalltalk

Arquivado em: arvorezinha — falso @ 03:53

Submetido por trodrigues.

Olá falsinho. Aqui vai a versão da árvorezinha numa linguagem que aprendi na universidade e que sempre me fascinou, o Smalltalk.

| n |
n := 5.
1 to: n do: [ :i |
    i timesRepeat: [
        Transcript show: '*'].
    Transcript cr].

Para correr este código, pode-se instalar o Squeak, um ambiente de Smalltalk multiplataforma que parece ter sido feito para miúdos de 5 anos. Depois, no menu de tools do lado direito, arrastar uma janela de Transcript e outra de Workspace para a área principal e colocar o código na janela de Workspace. Por fim basta seleccionar o código todo com o rato e fazer Alt+D ou middle click -> Do it

Abracinhos e beijinhos.

Abril 18, 2009

Arvorezinha - Logo

Arquivado em: arvorezinha — falso @ 01:16

Mais uma submissão do ali-o-kimiku. Desta vez com uma linguagem de 1967.

Olá Falsinho-do-meu-coração
Junto envio mais uma árvore desta vez em Logo uma linguagem que sempre me fascinou desde a primeira vez que vi em miúdo.

# (c) ali-o-kimiku 2009
reset
spritehide
$n=ask "Quantos raminhos ?"
$i=1
$e="*"
repeat $n
{ repeat $i
{print $e}
penup
backward 10
$e=$e+"*"
}
turnright 180
forward 20
spriteshow

Isto foi feito no kturtle que é uma implementação de Logo para KDE embora com o nome de turtlescript ou algo do género.
O Logo era usado para ensinar o básico de programação a miúdos e como tal é completamente inútil … Acho que fica bem dentro do blol !
Ah segue a bela da pic da árvorezinha dentro do kturtle
um grande bem-haja

kturtle

Abril 17, 2009

Arvorezinha - Fortran

Arquivado em: arvorezinha — falso @ 10:28

Submetido por ali-o-kimiku

Olá amiguinhos
Dentro do espirito da inutilidade vigente neste blol decidi acrescentar mais dois programas da arvorezinha.
O primeiro é o clássico escrito em Fortran 90/95/2003

! (c) ali-o-kimiku 2009
program arvore
implicit none
integer :: i,ii,n
write(*,*) "Qual a dimensao da arvore?"
read(*,*)n
do i=1,n
    write(*,*)("*",ii=1,i)
end do
end program arvore
gfortran arvorezinha.f90 -o arvorezinha
./arvorezinha
 Qual a dimensao da arvore?
10
 *
 **
 ***
 ****
 *****
 ******
 *******
 ********
 *********
 **********

Claro que não contente com isto decidi fazer algo para homenagear o nosso Dcoder. Aqui está a minha versão da árvore de Fibonacci:

! (c) ali-o-kimiku 2009
program arvoref
  implicit none
  integer :: i,ii,n,fb
  write(*,*) "Qual a dimensao da arvore?"
  read(*,*)n
  do i=1,n
     fb=fibb(i)
     write(*,*)("*",ii=1,fb)
  end do
contains
  function fibb(n)
    implicit none
    integer :: n, fibb
    real :: g,l,s5
    s5=sqrt(5.0)
    g=(1+s5)/2
!    l=(g**n-(1-g)**n)/s5
!    fibb=int(l)
    fibb=int(g**n/s5+0.5)
  end function fibb
end program arvoref
gfortran arvorezinhaf.f90 -o arvorezinhaf
./arvorezinhaf
 Qual a dimensao da arvore?
10
 *
 *
 **
 ***
 *****
 ********
 *************
 *********************
 **********************************
 *******************************************************

Um grande bem-haja

“desde que deixei de ir ao mirc comecei a ter mais sexo”
“desde que deixei de ir ao mirc comecei a ter mais sexo”