Mais um blog inútil.

Arvorezinha

Maio 27, 2010

Arvorezinha - HP Precision Architecture (aka PA-RISC aka DEMONIO)

Arquivado em: arvorezinha, assembly, coding, useless — paf @ 16:36

E ca fica mais uma arvorezinha, desta vez numa arquitectura demoniaca.

hpux$ cat arvorezinha.S
        .LEVEL 1.1							; cenas gays do hpux
        .SPACE $PRIVATE$						; o HPPA funciona por spaces, ler arch book
        .SUBSPA $DATA$,QUAD=1,ALIGN=8,ACCESS=31				; pra mais informacoes ou esquizofrenia antecipada
        .SUBSPA $BSS$,QUAD=1,ALIGN=8,ACCESS=31,ZERO,SORT=82
        .SPACE $TEXT$
        .SUBSPA $LIT$,QUAD=0,ALIGN=8,ACCESS=44
        .SUBSPA $CODE$,QUAD=0,ALIGN=8,ACCESS=44,CODE_ONLY
        .IMPORT $global$,DATA
        .IMPORT $$dyncall,MILLICODE
        .IMPORT write,CODE						; eh mais simpatico fazer imports
        .IMPORT exit,CODE
        .IMPORT __main,CODE
        .SPACE $TEXT$
        .SUBSPA $LIT$

        .align 4
STAR
        .STRING "\x2a\x00"
LF
        .STRING "\x0a\x00"
        .SPACE $TEXT$
        .SUBSPA $CODE$

        .align 4
        .NSUBSPA $CODE$,QUAD=0,ALIGN=8,ACCESS=44,CODE_ONLY
        .EXPORT main,ENTRY,PRIV_LEV=3,RTNVAL=GR				; a cena dos privilege levels eh funny
main
        .PROC
        .CALLINFO FRAME=64,CALLS,SAVE_RP,SAVE_SP,ENTRY_GR=3
        .ENTRY
        .CALL
        xor     %r4,%r4,%r4						; aka meter %r4 a zero :)

arewedoneyet
        comib,=,n 5,%r4,kk10xbai					; se %r4 for 5, BAI NAO!
        nop
        xor     %r3,%r3,%r3						; inicializar o counter do segundo loope

letsdothis
        comb,<=,n %r3,%r4,estrela					; se o %r3 for menor ou igual a %r4
        xor %r1,%r1,%r26						; sim, isto eh um nop							

        ldi 1,%r26							; escolher o fd (1 eh stdout)
        ldil LR'LF,%r19							; copiar a stringue com
        ldo RR'LF(%r19),%r25						; paneleirices...
        ldi 1,%r24							; length da stringue
        .CALL ARGW0=GR,ARGW1=GR,ARGW2=GR
        bl write,%r2
        xor %r1,%r2,%r3							; sim, isto eh um nop

        addi    1,%r4,%r4						; incrementar o %r4
        b       arewedoneyet
        shladd %r4,2,%r8,%r15						; sim, isto eh um nop

estrela
        ldi 1,%r26							; ver outro write
        ldil LR'STAR,%r19						; eh a mm merda
        ldo RR'STAR(%r19),%r25
        ldi 1,%r24
        .CALL ARGW0=GR,ARGW1=GR,ARGW2=GR
        bl write,%r2
        add %r13,%r14,%r15						; sim, isto eh um nop

        addi    1,%r3,%r3
        b       letsdothis
        nop								; adivinha...

kk10xbai
        ldi 0,%r26
        .CALL ARGW0=GR
        bl exit,%r2
        shrpw %r8,%r7,8,%r9     ; nop nop nop
        subi,OD  42,%r3,%r12    ; nop nop nop nopppppp! :D
        .EXIT
        .PROCEND
hpux$ gcc arvorezinha.S
*
**
***
****
*****
hpux$

jah agora para esclarecer um pouco certas esquisitisses desta arquitectura, para loadar uma word (32 bits), como todas as instruções têm de ter 32bits eh obvio que nao da para meter um endereço com esse tamanho e ainda gastar 6 bits num opcode. entao o que estes genios da computacao fizeram foi primeiro loadar 21 bits e depois os 11 bits restantes.

tipo ali em cima
ldil LR’STAR,%r19
ldo RR’STAR(%r19),%r25
LR’ saca 21 bits da string STAR para o %r19
RR’ saca os 11 bits que faltam…

digam la, HPPA nao eh uma arquitectura magnifica ? (FUCK NO!)

Maio 25, 2010

Arvorezinha - SPARC!

Arquivado em: arvorezinha, assembly, coding, useless — paf @ 15:10

Btw, esta arch é meio intragável….

solaris$ cat arvore.S
.section  ".rodata1"
.align    4
.L0:
        .ascii           "*\0"
.L1:
        .ascii          "\n\0"

.L2:
        .ascii          "bla\n\0"

        .section        ".text"
        .global         main
main:
        save            %sp,-96,%sp
        mov 0,%g2

arewedoneyet:
        cmp %g2,5       ! comparar com RFC_MAX pois claro, n eh preciso registry pra isto
        be weredonefaggot

        mov 0,%g3       ! inicializar counter1

estrelitas:
        cmp %g3,%g2     ! ah e tal, compara-me a pissa, less or equal?
        ble estrela

        set .L1,%o0     ! meter LF no output register, e mandar printar
        call printf

        inc %g2         ! increasar o counter2
        ba arewedoneyet

estrela:
        set     .L0,%o0 ! printar estrelinha
        call    printf

        inc %g3
        ba estrelitas

weredonefaggot:
        nop
        restore

solaris$ gcc arvore.S -o arvorezinha
solaris$ ./arvorezinha
*
**
***
****
*****
solaris$

Arvorezinha - melhor arquitectura do mundo (Alpha)

Arquivado em: arvorezinha, assembly, coding, useless — paf @ 12:53

Como se lê no subject, fica aqui uma arvorezinha na melhor arquitectura à face do planeta. Em breve na terceira melhor arquitectura à face do planeta…(SPARC)

true64> gcc arvore.S -o arvorezinha
true64> ./arvorezinha
*
**
***
****
*****
true64> cat arvore.S
.data
LF:             .ascii          "\n\0"
GAY:            .ascii          "*"

.text
        .align  4
        .set    noreorder
        .arch   ev4
        .globl  main
        .ent    main

main:
        ldgp    $gp,0($27)		# load ao global pointer
        stq     $26,0($sp)			# inicializar o stack pointer (só naquela)

        lda $10,5                       	# RFC_MAX para o loop principal
        lda $9,0				# counter do loop1

loop1:
        cmpeq $9,$10,$7			# se $9 igual $10, branchar para o final
        bne $7,final

        lda $11,0				# counter para o loop2

loop2:
        cmple $11,$9,$7			# se $11 menor ou igual q $9, estrelar!
        bne $7,estrela

        lda $16,LF				# new line pl0x
        jsr $26,printf
        ldgp $gp,0($26)

        lda $9,1($9)			# uma maneira gay de incrementar
        br loop1

estrela:
        lda     $16,GAY			# printar estrelinha...
        jsr     $26,printf			# é sempre preciso fazer reset ao $gp
        ldgp    $gp,0($26)		# depois de usar uma função

        addq $11,1,$11			# outra maneira gay de incrementar :p
        br loop2

final:
        mov     $31,$0                  # return = 0
        ldq     $26,0($sp)              # limpar a stacka, se bem q nao foi usado mas pronto..
        ret     $31,($26),1             # returnarrrrrrrrr
        .end    main

true64>

Arvorezinha - C++ Templates

Arquivado em: arvorezinha, useless — dcoder @ 11:07

A pedido de várias famílias, aqui está uma versão da árvorezinha em C++, sem loops. Os loops são avaliados durante a compilação; o código final contém apenas a sequência de caracteres impressos.

#include <iostream>

enum
{
	LIMIT = 5+1
};

template <int x>
void inner(void)
{
	std::cout << '*';
	inner<x-1>();
}

template <>
void inner<0>(void){}

template <int x>
void outer(void)
{
	inner<x>();
	std::cout << std::endl;
	outer<x+1>();
}

template<>
void outer<LIMIT>(void){}

int main(int argc, char **argv)
{
	outer<1>();
	return 0;
}

Maio 23, 2010

Arvorezinha - REXX

Arquivado em: arvorezinha, coding, useless, windows — falso @ 03:35

Olá de novo, o meu caro amigo cardinal já há uns dias que me tem dito que para eu ser verdadeiramente inútil tinha de fazer uma arvorezinha em AREXX. Fui então pesquisar o que é isso era e descobri que o AREXX é uma implementação para Amiga da linguagem REXX criada pela IBM em 1979 (pelo menos segundo a Wikipedia).
O cardinal disse-me para experimentar o AROS (que é uma implementação do AmigaOS para outras arquitecturas) numa maquina virtual, mas aquilo pareceu-me bues de arcaico. Então fui foi à procura dum interpretador de REXX para Windows, e achei o BREXX (o site é mesmo belo, por isso é que partilhei o urle) e como não há uma sem duas, decidi fazer mais esta arvorezinha hoje, então aqui vai.

/* this script can never fail */
MAX = 5
do i = 1 to MAX by 1
	linha = ""
	do x = 1 to i by 1
		linha = linha || "*"
	end
	say linha
end

E aqui está a prova dos nove.

Arvorezinha - Google Go

Arquivado em: arvorezinha, coding, linux, useless — falso @ 02:54

Olá amigos, estava aqui aborrecido e já a pensar em ir-me deitar porque não tinha series para ver nem nada para fazer, e então lembrei-me que não havia arvorezinha na linguagem de programação Go da Google, então pus mãos à obra, e foi tão simples que até pensei não vir aqui blogar sobre isso, mas como não tinha nada para fazer, aqui vai o sores.

/* this crap can never fail */

package main

import "os"

func main() {
	var RFC_MAX int = 5
	for i := 1; i <= RFC_MAX; i++ {
		for x := 0; x < i; x++ {
			os.Stdout.WriteString("*")
		}
		os.Stdout.WriteString("\n")
	}
}

E a tal pic que toda a gente gosta, como prova!

Maio 16, 2010

Arvorezinha 68K Assembly

Arquivado em: arvorezinha, assembly, coding, useless — falso @ 22:36

Hoje devido aos posts de hoje do falco sobre arvorezinhas ganhei um pouco de moral e fui à procura de arquitecturas que ainda não tivesse feito em assembly e lembrei-me dos Motorola 68K, os que eram usados nos MACs antigos.
Decidi então meter as mãos à obra, e fui procurar um emulador/simulador ou algo do género para este processador e achei o Easy68K que é um três-em-um, Editor, Assembler e Debugger.
Fiquem bem e joguem muito.

* -------------------------------------------can never fail-
* Program    : arvorezinha
* Written by : Pedro de Oliveira
* Date       : 16/05/2010
* Description: Implementação da arvorezinha em 68K assembly 
*-----------------------------------------------------------
        ORG     $1000
START:                          ; first instruction of program

main:
        MOVE.B  #5,d7           ; maximo de linhas/asteriscos
                                ; está a usar o RFC standard 5
        MOVE.B  #0,d5           ; inicializa o counter1 (d5) a 0

ciclo1:
        CMP.B   d5,d7           ; verifica se chegamos o fim
                                ; comparando o counter1 ao maximo
        BEQ     final           ; se for igual salta para o fim
	
        MOVE.B  #0,d6           ; inicializa o counter2 (d6) a 0

ciclo2:
        CMP.B   d5,d6           ; compara o counter1 com o counter2
        BEQ     estrela         ; se for igual
        BLT     estrela         ; ou menor imprime um asterisco
	
        LEA     newline,a1      ; imprime uma newline
        JSR     print
	
        ADD     #1,d5           ; incrementa o counter1
        JMP     ciclo1          ; salta para o ciclo1

estrela:
        LEA     _estrel,a1      ; imprime um asterisco
        JSR     print
	
        ADD     #1,d6           ; incrementa o counter2
        JMP     ciclo2          ; salta para o ciclo2

final:
        MOVE.B  #9,D0
        TRAP    #15             ; halt simulator

print:
        MOVE.B  #14,d0
        TRAP    #15
        RTS

* Variables and Strings

_estrel	DC.B    '*',0
newline DC.B    $0D,$0A,0

        END     START           ; last line of source

Mais três arvorezinhas

Arquivado em: arvorezinha, coding, useless — falco @ 11:19

Em Bash:

#!/bin/bash

ramo="*";
tam="7";
i="1";

while [ $i -lt $tam ]; do
j="1";
while [ $j -lt $i ]; do
printf "$ramo"
j=$[$j+1]
done
printf "\n"
i=$[$i+1]
done

printf "\n\n"

Em Tea:

#!/home/diogo/Tea/tea-3.2.5/bin/tsh

#   Esta é uma arvorezinha escrita em Tea,
#   de acordo com o rfc da arvorezinha praticado
#   em http://www.blol.org/

#   version 0.1

#   This script can never fail!

define arvorezinha ""
define estrelinha "*"
define fiter 1

while { < $fiter 6 } {
define siter 0
while { < $siter $fiter } {
set! arvorezinha [str-cat $arvorezinha $estrelinha]
set! siter [+ $siter 1]
}
set! arvorezinha [str-cat $arvorezinha "\n"]
set! fiter [+ $fiter 1]
}

echo $arvorezinha

Em Tea, com POO

#!/home/diogo/Tea/tea-3.2.5/bin/tsh


#   Esta é uma arvorezinha escrita em Tea,
#   de acordo com o rfc da arvorezinha praticado
#   em http://www.blol.org/

#   version 0.2
#   Changes:
#	* now with an OOP paradigm



#   This script can never fail!



class LitleTree (
    _max_size
    _branch
)

method LitleTree constructor () {
    #Blol.org Arvorezinha RFC COMPLIANT
    set! _max_size 5
    set! _branch "*"
}

method LitleTree PleaseSaveSortelha () {
    echo "Por favor, salva a Sortelha!!!"
    echo "http://vamossalvarsortelha.blogspot.com/"
}

method LitleTree PlantLitleTree () {
    define small_tree
    set! small_tree ""
    define i 0

    while { < $i $_max_size  } {
	set! i [ + $i 1 ]
	define f 0
    	while { < $f $i } {
	    set! f [+ $f 1]
	    set! small_tree [str-cat $small_tree $_branch]
	}
	set! small_tree [str-cat $small_tree "\n"]
    }

    echo $small_tree
}




#serious business:
define litle_tree [ new LitleTree ]
$litle_tree PleaseSaveSortelha
echo "\n"
$litle_tree PlantLitleTree

Historia resumida das Arvorezinhas

Arquivado em: arvorezinha, useless — falco @ 11:00

A primeira arvorezinha de que há registo blolado (01:00 do dia 11 de Janeiro do
ano de 2008 da graça do senhor) foi feita pelo falso em Assembly. Esta
arvorezinha foi inspirada num trabalho de escola do _itensdown_ e estabeleceu o
standard para as arvorezinhas (compostas por asteriscos (n = n + 1 asteriscos,
em que n é o número de asteriscos por linha e n <= 5 na base da arvorezinha). No
mesmo dia o _itensdown_ publicou a sua arvorezinha em vb. E ainda antes do dia
terminar tinhamos a terceira arvorezinha feita com um one liner de Perl.

Durante muito tempo, as arvorezinhas foram esquecidas. Mas o falso a 4 de Abril
de 2009 (no dia em que o meu cavalo fez 5 anos), voltou a reflorestar os nossos
sistemas com uma arvorezinha feita em MIPS Assembly em IRIX e outra feita num
simulador de MIPS para window$ (PCSpim). No resto do mês de Abril seguiram-se
muitas outras arvorezinhas (mais de 30). No resto de 2009 foram criada mais seis
arvorezinhas, mas no ultimo trimestre já não houveram novas arvorezinhas.

Nem tudo na saga das arvorezinhas tem sido maravilhoso, também têm havido
dramas. Já houve um “ripanço” de uma arvorezinha em Assembly “enquanto a namorada
do ‘ripador’ tomava banho” e há várias arvorezinhas que não cumprem o RFC.
Para além disso a tradição das arvorezinhas está claramente em perigo de
extinção, por não haverem novas arvorezinhas desde aproximadamente o meio de
1.

No momento da publicação deste Post, há cinquenta e uma arvorezinhas e o mês
em que foram publicadas mais foi o mês de Abril de 2009, no qual foram
publicadas 37 arvorezinhas.

AutorLinguagem
falsoX86 Assembly
_itens_down_vb6
devnullPerl (one liner)
mirageAsus OLED (GNU/Linux)
falsoMIPS Assembly (IRIX)
falsoMIPS Assembly (PCSpim)
falsoZ80 Assembly (Spectrum)
falsoBrainfuck
_madinfo_Haskell
falsoZ80 Assembly (TI86)
falsoT-SQL (M$ SQL Server)
João SaramagoJava Bytecode
_madinfo_Ook
JuvenalTcl
João SaramagoProlog
dcoderMagma
dcoderAMD64 Assembly
falsoPowerPC Assembly
dcoderPDP-11 Assembly
g0shFortran
g0shFortran (com Fibonaci)
g0shLogo
trodriguesSmalltalk
falso6502 Assembly (NES)
g0shLogo (com desenhos)
dcoderx86 Assembly (como boot sector)
miragedBase IV
druneLOLCode (LOLPython)
falsoMalbolge
spicoPaint.net
dcoderBrainfuck (com loops)
trodriguesPython (one liner)
devnullPerl (one liner optimizado)
drunePython (one liner optimizado)
kuvalskiPaint.net (optimizada)
kuvalskiAda
kuvalskiRuby
nifanPov-Ray
spicoMOOsaico
brackhatCMD.exe (batch)
brackhatCMD.exe (cli)
devnullPascal
dcoderC Preprocessor
_Lone_Wolf_Lisp
gatunoLua
falsoARM Assembly
João SaramagoCOBOL (OpenCOBOL)
ardoRicML
João SaramagoOpenGL (com Java)
_Lone_Wolf_Lisp

Agosto 4, 2009

Arvorezinha - LISP take 2

Arquivado em: arvorezinha, coding, drama, fail, useless — falso @ 22:23

Oi!

Segundo a LISP Police, vim a saber que a primeira arvorezinha em LISP do _Lone_Wolf_ não cumpria os standards definidos pelo rfc da arvorezinha, e ele para não sofrer as consequências redimiu-se com uma versão totalmente standard. Aqui vai ela:

  i i i i i i i       ooooo    o        ooooooo   ooooo   ooooo
  I I I I I I I      8     8   8           8     8     o  8    8
  I  \ `+' /  I      8         8           8     8        8    8
   \  `-+-'  /       8         8           8      ooooo   8oooo
    `-__|__-'        8         8           8           8  8
        |            8     o   8           8     o     8  8
  ------+------       ooooo    8oooooo  ooo8ooo   ooooo   8
Welcome to GNU CLISP 2.47 (2008-10-23) <http://clisp.cons.org/>
Copyright (c) Bruno Haible, Michael Stoll 1992, 1993
Copyright (c) Bruno Haible, Marcus Daniels 1994-1997
Copyright (c) Bruno Haible, Pierpaolo Bernardi, Sam Steingold 1998
Copyright (c) Bruno Haible, Sam Steingold 1999-2000
Copyright (c) Sam Steingold, Bruno Haible 2001-2008
Type :h and hit Enter for context help.
[1]> (loop
    (loop for i from 1 to 4 do
        (loop for j from 1 to i do
            (write-char #\*)
        )
        (terpri)
    )
    (return '*****)
)
*
**
***
****
*****