Mais um blog inútil.

Abril 10, 2009

Arvorezinha - Java Bytecode [e optimizado]

Arquivado em: arvorezinha — falso @ 14:58

Ora viva amigos.
Tive alta submissão por amigo meu e colega de trabalho de uma arvorezinha numa coisa mesmo verdadeiramente inutil. Tive mesmo de blogar sobre isso!
Esta arvorezinha é em java bytecode, só mesmo para quem ama!

.class public Avorezinha
.super java/lang/Object

.method public <init>()V
   aload_0
   invokenonvirtual java/lang/Object/<init>()V
   return
.end method

.method public static main([Ljava/lang/String;)V
	; set limits used by this method
	.limit locals 4
	.limit stack 3

	; setup local variables:
	;    1 - the PrintStream object held in java.lang.System.out
	getstatic java/lang/System/out Ljava/io/PrintStream;
	astore_1

	;    2 - the integer 10 - the counter used in the loop
	bipush 1
	istore_2

	; now loop 10 times printing out a number

Loop1:
	goto InitLoop2
endLoop1:
	aload_1    ; push the PrintStream object
	ldc ""
	invokevirtual java/io/PrintStream/println(Ljava/lang/String;)V

	; decrement the counter and loop
	iinc 2 1
	iload_2
	bipush 6
	isub
	ifne Loop1
	goto exit

InitLoop2:
	iload_2
	istore_3
Loop2:
	aload_1    ; push the PrintStream object
	ldc "*"
	invokevirtual java/io/PrintStream/print(Ljava/lang/String;)V
	iinc 3 -1
	iload_3
	ifne Loop2

	goto endLoop1

exit:
	; done
	return
.end method

Ele disse me que se tem de usar o assemblador Jasmin. Espero que amem porque esta eu amei mesmo bues!

EDIT: Estive a ver os comentarios, ele submeteu uma versao mais optizada aqui vai o código completo, copiado dos comentarios.

Aqui fica uma versão melhorada:
.class public Arvorezinha
.super java/lang/Object

.method public static main([Ljava/lang/String;)V
.limit locals 4
.limit stack 3

bipush 1
istore 1 ; int i=1

InicioFor1:
iload 1
bipush 5
if_icmpgt SairFor1 ; i
bipush 0
istore 2 ; int j=0

InicioFor2:
iload 2
iload 1
if_icmpge SairFor2 ; j

getstatic java/lang/System/out Ljava/io/PrintStream;
ldc "*"
invokevirtual java/io/PrintStream/print(Ljava/lang/String;)V ; System.out.print("*")

iinc 2 1 ; j++
goto InicioFor2
SairFor2:
getstatic java/lang/System/out Ljava/io/PrintStream;
invokevirtual java/io/PrintStream/println()V ; System.out.println()

iinc 1 1 ; i++
goto InicioFor1

SairFor1:
return
.end method

8 comentários a “Arvorezinha - Java Bytecode [e optimizado]”

  • [...] gostei da outra versão (está nos comentários) ... estava pouco ML like. Espero que gostes desta [...]
  • fuck
    este gajo em vez de tar ca gaja vai fazer codigo
    fds....
  • jsaramago
    Mas a arvorezinha em java bytecode bate tudo. :D
  • jsaramago
    Aqui fica uma versão melhorada:
    .class public Arvorezinha
    .super java/lang/Object

    .method public static main([Ljava/lang/String;)V
    .limit locals 4
    .limit stack 3

    bipush 1
    istore 1 ; int i=1

    InicioFor1:
    iload 1
    bipush 5
    if_icmpgt SairFor1 ; i
  • jsaramago
    bipush 0
    istore 2 ; int j=0

    InicioFor2:
    iload 2
    iload 1
    if_icmpge SairFor2 ; j<i></i>
  • jsaramago
    getstatic java/lang/System/out Ljava/io/PrintStream;
    ldc &quot;*&quot;
    invokevirtual java/io/PrintStream/print(Ljava/lang/String;)V ; System.out.print(&quot;*&quot;)

    iinc 2 1 ; j++
    goto InicioFor2
    SairFor2:
    getstatic java/lang/System/out Ljava/io/PrintStream;
    invokevirtual java/io/PrintStream/println()V ; System.out.println()

    iinc 1 1 ; i++
    goto InicioFor1

    SairFor1:
    return
    .end method
  • jsaramago
    Aqui fica tb a arvorezinha em ml(ocaml):
    let rec arvorezinha_aux x =
    match x with
    5 -&gt; print_string "*";
    |_ -&gt; print_string "*"; arvorezinha_aux (x+1)
    ;;

    let rec arvorezinha a =
    match a with
    1 -&gt; arvorezinha_aux a;
    |_ -&gt; arvorezinha_aux a; print_string "\n";arvorezinha (a-1)
    ;;

    arvorezinha 5;;
  • karpa
    ok mas falta a arvorezinha em PostgreSQL:

    select repeat('*',generate_series(1,5)) as arvorezinha;