Gå til innhold

6-linjers 99 bottles of beer; feedback forespørsel


Anbefalte innlegg

Kan korte ned enda mer:

class b{static{<dinkode>}}

den vil krasje etter kjøring, men virke så langt.

 

class b{static{<kode>;System.exit(0);}}

denne vil avslutte riktig

 

Ikke pent, men er det snakk om antall tegn tror jeg det er det meste man klarer å presse det rundt ned før det ikke vil kjøre.

Endret av Matsemann
  • Liker 1
Lenke til kommentar
Videoannonse
Annonse

Som tidligere nevnt så kan du droppe flere "String" ved å bruke komma:

(...)

 

De to if setningene kan kortes ned litt:

(...)

 

Golfet utgave:

 

String b=" of beer",c=" on the wall",a=" bottles",d=" Take one down and pass it around";

 

d=(i==0?" Go to the store, buy some more");
a=(i==0?a+'s':i==1?" bottle":a);

Lenke til kommentar

Oppdatering:

class x {
public static void main (String[] y) {
   String b = " of beer", c = " on the wall", a = " bottles", d = " Take one down and pass it around";
   for (int i = 99; i > -1; --i) {
     d = (i == 0 ? " Go to the store, buy some more" : d);
     a = (i == 0 ? a + 's' : i == 1 ? " bottle" : a);
     System.out.println(i + a + b + c + ',' + " " + i + a + b + '.' + d + ',' + " " + (i == 0 ? 99 : i-1) + a + b + c + '.');
   }
 }
}

443 tegn, kan sikkert gjøre det kortere ved å fjerne de fleste mellomrom, men det teller vel ikke? :p

Lenke til kommentar
class a{public static void main(String[]x){String o=" bottle",r=" of beer",m=
" more",a=o+"s"+r,b=1+o+r,d=" on the wall",c=".\n",g="o"+m+a,i="n"+g,e=c+"Take "
+"one down and pass it around, ",h=d+", ",f="Go to the store and buy some"+m+
", 99"+a+d+".";for(int z=99;z>1;)System.out.println(z>2?z+a+h+z+a+e+--z+a+d+c:z+
a+h+z--+a+e+b+d+c+"\n"+b+h+b+e+i+d+c+"\nN"+g+h+i+c+f);}}

Om vi teller tegn var den jeg leverte som "golfet" vesjon på obligen 370 tegn, på 5 linjer.

 

<...>

 

Det er juks å sette sammen linjer og allikevel telle dem som én linje. Egentlig er koden din slik:

 

 

public class bob{
   public static void main(String[] args){
       String a=" bottles of beer";
       String b="1 bottle of beer";
       String d=" on the wall";
       String c=".\n";
       String e=c+"Take one down and pass it around, ";
       String h=d+", ";
       String f="Go to the store and buy some more, 99"+a+d+".";
       String g="o more"+a;
       String i="n"+g;
       for(int z=99;z>2;z--) System.out.println(z+a+h+z+a+e+(z-1)+a+d+c);
       System.out.println("2"+a+h+"2"+a+e+b+d+c+"\n"+b+h+b+e+i+d+c+"\nN"+g+h+i+c+f);
   }
}

 

 

...som er femten linjer. Ekte golfere teller dessuten antall tegn :)

Det var førsteposten i tråden, ikke den jeg endte opp med :)

 

Er det objektorientert programmering ved NTNU? Stusser litt på at dere har en 99 bottles of bear innlevering.

Objektorientert programmering ved HiBu Kongsberg. Linje Dataingeniør - Embedded Systems

 

Ble ganske fornøyd med min egen nå, tror den blir kortere tegnmessig enn de andre foreslått.

 

public class bottles {
 public static void main (String[] args) {
   String b = " of beer";
   String c = " on the wall";
   String a = " bottles";
   String d = " Take one down and pass it around";
   for (int i = 99; i > -1; --i) {
     if (i == 0) {
       d = " Go to the store, buy some more";
       a = a + 's';
     }
     if (i == 1) {
       a = " bottle";
     }
     System.out.println(i + a + b + c + ',' + " " + i + a + b + '.' + d + ',' + " " + i + a + b + c + '.');
   }
 }
}

 

Den printer ikke ut "no more" men 0, som også var et poeng med oppgaven.

 

Oppdatering:

 

class x {
public static void main (String[] y) {
   String b = " of beer", c = " on the wall", a = " bottles", d = " Take one down and pass it around";
   for (int i = 99; i > -1; --i) {
     d = (i == 0 ? " Go to the store, buy some more" : d);
     a = (i == 0 ? a + 's' : i == 1 ? " bottle" : a);
     System.out.println(i + a + b + c + ',' + " " + i + a + b + '.' + d + ',' + " " + (i == 0 ? 99 : i-1) + a + b + c + '.');
   }
 }
}

 

443 tegn, kan sikkert gjøre det kortere ved å fjerne de fleste mellomrom, men det teller vel ikke? :p

Whitespace teller ikke som tegn. Mellomrom teller om det er en del av en string.

Koden printer fortsatt 0 og ikke "no more".

 

Jeg har eksamen i programmering den 15. og regner med jeg kommer til å gå over 99 bottles of beer og "kode-golfe" den igjen en gang til før det. Om jeg får kortet den ned under 370 tegn poster jeg oppdatering.

Endret av GullLars
Lenke til kommentar

Vel, putter du koden din inn i det jeg postet øverst på siden, tror jeg du vil miste en del tegn.

 

Men tror ikke det å golfe er særlig nyttig mtp eksamen, spesielt ikke når faget er oop. Da bør det være arv, interface, abstract, static, public osv. som bør kunnes. Det er også mye viktigere om man ser lenger frem i tid.

Lenke til kommentar

Men tror ikke det å golfe er særlig nyttig mtp eksamen, spesielt ikke når faget er oop. Da bør det være arv, interface, abstract, static, public osv. som bør kunnes. Det er også mye viktigere om man ser lenger frem i tid.

Siden vi har java som introduksjonsfag til programmering i første semester nå går vi ikke så dypt inn i tingene. Interface (GUI) kommer det ikke oppgaver om, klasser og arv er det noe av, og public/private og static forventes det at vi kan.

 

Jeg gjør litt kodegolfing en gang i blandt for morro skyld, og for å demonstrere for meg selv at jeg kan analysere (faktorisere) strukturen av oppgaven.

 

Jeg satt en time nå og fikk optimalisert koden til 354 tegn, ikke medregnet whitespace utenfor stringer. Med auto-format og linjebryting for lettere lesing ser det slik ut:

class a {

   public static void main(String[] x) {
       String a = " bottles of beer",
               b = "1 bottle of beer",
               c = " on the wall",
               d = c + ", ",
               e = c + ".\n",
               f = e + "Take one down and pass it around, ",
               g = "o more " + a;

       for (int z = 99; z > 1;) {
           System.out.println(z > 2 ? z + a + d + z + a + f + --z + a + e
                   : z + a + d + z-- + a + f + b + e + "\n" + b + d + b + f
                   + "n" + g + e + "\nN" + g + d + "n" + g
                   + ".\nGo to the store and buy some more, 99" + a + c + ".");
       }
   }
}

 

og uten whitespace med linjebryting mellom klasse/metode, string definisjoner, og loop ser det slik ut:

class b{public static void main(String[] x){
String a=" bottles of beer",b="1 bottle of beer",c=" on the wall",d=c+", ",e=c+".\n",f=e+"Take one down and pass it around,",g="o more "+a;
for(int z=99;z>1;)System.out.println(z>2?z+a+d+z+a+f+--z+a+e:z+a+d+z--+a+f+b+e+"\n"+b+d+b+f+"n"+g+e+"\nN"+g+d+"n"+g+".\nGo to the store and buy some more, 99"+a+c+".");}}

Endret av GullLars
Lenke til kommentar

 

Jeg satt en time nå og fikk optimalisert koden til 354 tegn, ikke medregnet whitespace utenfor stringer. Med auto-format og linjebryting for lettere lesing ser det slik ut:

 

 

Da skal jeg klare å fjerne noen få :thumbup:

 

Edit: 345;

 

class x {

public static void main(String[]u) {
   String b = " of beer",
     c = " on the wall",
     a = " bottle",
     d = " Take one down and pass it around",
     e = "No more";

   for (int i = 99; i > -1;) {
     String k = (i != 1 ? a + 's' : a),
       r = (i == 0 ? e : ""+i);
     System.out.println(r+ k + b + c + ',' + " " + r.toLowerCase() + k + b + '.' + (i == 0 ? " Go to the store, buy some more" : d) + ',' + " " + (i-- == 0 ? 99 : i) + k + b + c + '.');
   }
 }
}

Endret av SpinozaSittSkjegg
Lenke til kommentar

 

Jeg satt en time nå og fikk optimalisert koden til 354 tegn, ikke medregnet whitespace utenfor stringer. Med auto-format og linjebryting for lettere lesing ser det slik ut:

 

 

Da skal jeg klare å fjerne noen få :thumbup:

 

Edit: 345;

 

class x {

public static void main(String[]u) {
   String b = " of beer",
     c = " on the wall",
     a = " bottle",
     d = " Take one down and pass it around",
     e = "No more";

   for (int i = 99; i > -1;) {
     String k = (i != 1 ? a + 's' : a),
       r = (i == 0 ? e : ""+i);
     System.out.println(r+ k + b + c + ',' + " " + r.toLowerCase() + k + b + '.' + (i == 0 ? " Go to the store, buy some more" : d) + ',' + " " + (i-- == 0 ? 99 : i) + k + b + c + '.');
   }
 }
}

Du hadde glemt linjebryting av teksten som skulle printes. Jeg la til det ".\n" i stedet for '.' 2 steder, og flyttet ',' + " " sammen til ", " 2 steder, og droppet mellomrom før Go to the store og Take one down, sparte 4 tegn over det du hadde -> 341.

Jeg likte optimaliseringen med k/r inne i loopen (noen grunn til de navnene?), fler conditionals i stedet for 99-3 : rest, og r.toLowerCase() for å spare på "No/no more".

 

Ny kode (med linjebryting på 80 tegn)



class x {

   public static void main(String[]u) {
   String b = " of beer",
     c = " on the wall",
     a = " bottle",
     d = "Take one down and pass it around",
     e = "No more";

   for (int i = 99; i > -1;) {
     String k = (i != 1 ? a + 's' : a),
       r = (i == 0 ? e : ""+i);
     System.out.println(r+ k + b + c +  ", " + r.toLowerCase() + k + b + ".\n"
             + (i == 0 ? "Go to the store, buy some more" : d) + ", "
             + (i-- == 0 ? 99 : i) + k + b + c + ".\n");
   }
 }
}

 

EDIT: sparte 4 tegn, ikke 2. -> 341 tegn.

Endret av GullLars
Lenke til kommentar

Ny kode (med linjebryting på 80 tegn)

 

EDIT: sparte 4 tegn, ikke 2. -> 341 tegn.

 

329 tegn :p

 

class x { 

 public static void main(String[]u) {
   String b = " of beer",
     c = " on the wall",
     a = " bottle",
     e = "No more",
     z = a+'s';  

   for (int i = 99; i > -1;) {
     String r = (i == 0 ? e : ""+i),
       k = (i != 1 ? z : a);
     System.out.printf("%s%s%s%s, %s%s%s.\n%s%s%s.\n\n",  
                       r, k, b, c, r.toLowerCase(), k, b,  
                       (i-- == 0 ? "Go to the store, buy some more, 99" +z 
                          : "Take one down and pass it around, " 
                          +i +(i == 1? a : z)), b, c);             
   }
 }
}

Endret av SpinozaSittSkjegg
Lenke til kommentar

Her er en direkte konvertering av en PHP-versjon jeg skrev for lenge siden:

 

String b="",c=b;
for(int i=199,z=0; --i>0; System.out.println((i%2>0) ? i>2 ? "Take one down and pass it around, " + --z + c + ".\n" : "Go to the store and buy some more, 99" + c :(z=i/2) + c + ", " + z + b + "." ))
c = (b = " bottle" + (i-2!=0 && i-3!=0 ? "s" : "") + " of beer") + " on the wall";

Ganske stygg, men den virker.

 

Er kanskje litt annerledes enn de andre i denne tråden. Slutten på denne versjonen går sånn:

 

3 bottles of beer on the wall, 3 bottles of beer.
Take one down and pass it around, 2 bottles of beer on the wall.

2 bottles of beer on the wall, 2 bottles of beer.
Take one down and pass it around, 1 bottle of beer on the wall.

1 bottle of beer on the wall, 1 bottle of beer.
Go to the store and buy some more, 99 bottles of beer on the wall

Lenke til kommentar

Deklarer r og k sammen med resten, tror du da sparer et tegn. Og prøv koden jeg postet på toppen av siden.

 

Fikk det ikke til å kompilere i drJava, skal prøve i Eclipse når jeg er ved den stasjonære. Sparte 2 tegn på å initiere r og k sammen med resten, men de må deklareres i for-løkken. Eller kanskje jeg blander begrepene.

Endret av SpinozaSittSkjegg
Lenke til kommentar

Deklarer r og k sammen med resten, tror du da sparer et tegn. Og prøv koden jeg postet på toppen av siden.

 

Fikk det ikke til å kompilere i drJava, skal prøve i Eclipse når jeg er ved den stasjonære. r og k må deklareres innenfor for-løkken, jeg kunne ha flyttet alle de andre deklarasjonene til for-løkken, men det blir vel ekstremt ugunstig med tanke på kjøretid?

Jeg tror han mente slik:


class y {

   public static void main(String[] u) {
       String b = " of beer",
               c = " on the wall",
               a = " bottle",
               e = "No more",
               r, k,
               z = a + 's';

       for (int i = 99; i > -1;) {
           r = (i == 0 ? e : "" + i);
           k = (i != 1 ? z : a);
           System.out.printf("%s%s%s%s, %s%s%s.\n%s%s%s.\n\n",
                   r, k, b, c, r.toLowerCase(), k, b,
                   (i-- == 0 ? "Go to the store, buy some more, 99" + z
                   : "Take one down and pass it around, "
                   + i + (i == 1 ? a : z)), b, c);
       }
   }
}

Du slipper da å skrive "string" 2 ganger. Du har deklarert at r og k er string, men har ikke gitt de innhold.

Det er en bugg med denne printen da, den gir:

"Take one down and pass it around, 0 bottles of beer on the wall."

Det skal være "no more" i stedet for 0 der.

 

Jeg er ikke kjent med printf. Hva er fordelene med å bruke den over print/println ?

 

 

@milktea:

Hele poenget med denne oppgaven var nettop å få helte teksten korrekt tegn for tegn ;)

 

@Matsemann:

Jeg ser ikke hva du mener i den øverste posten på siden. Sikkert min feil som ny i Java. Kan du forklare litt mer om den?

Lenke til kommentar

[/code]

Du slipper da å skrive "string" 2 ganger. Du har deklarert at r og k er string, men har ikke gitt de innhold.

Det er en bugg med denne printen da, den gir:

"Take one down and pass it around, 0 bottles of beer on the wall."

Det skal være "no more" i stedet for 0 der.

 

Jeg er ikke kjent med printf. Hva er fordelene med å bruke den over print/println ?

 

Ja, jeg så den buggen nå, måtte øke antall tegn litt igjen for å få den til å kjøre riktig, men her har jeg en ny versjon:

 

printf gjør at du kan formatere utskriften i en print-setning.

Eksempelvis kan du ha en double x (345,2523) som du bare vil vise de 2 første desimalene i:

printf("%.2f", x); //Gir utskriften: 345,25

Automatisk omforming til store bokstaver:

printf("%S", "hei"); //Gir utskriften HEI

 

Det finnes utrolig mange forskjellige måter å formatere utskriften på, vel og merke har jeg bare hatt et semester med java foreløpig, så det kan hende bruksområdet er videre enn dette :p

class x { 

 public static void main(String[]u) {
       int i = 99;
   String b = " of beer",
     c = " on the wall",
     a = " bottle",
     e = "o more",
     z = a + 's',
     k,
     r;

   while(i > -1){
       k = (i != 1 ? z : a);
       r = (i != 0 ? ""+i : 'N'+e);
     System.out.printf("%s, %s.\n%s.\n\n",  
                       r+ k+ b+ c, r.toLowerCase()+ k+ b,  
                       (i-- == 0 ? "Go to the store, buy some more, 99" +z 
                          : "Take one down and pass it around, "+ 
                        (i == 0? "n"+e+z : i+a))+ b+ c);             
   }
 }
}

Endret av SpinozaSittSkjegg
Lenke til kommentar
  • 2 år senere...

Driver med et lite program for å generere tekst (hovedsaklig med tanke på generering av SQL-setninger for å legge inn testdata i databaser), og kom på denne gamle tråden når jeg testet programmet. Her er kommandolinjen for å generere '99 bottles of beer'. Relativt kryptisk kommando, kanskje, men ganske artig :-)

>java textgen.TextGen "i=99..0" 100 "@set(B| bottle@if(@neq(%i%|1)|s) of beer)@set(W| on the wall)@uc(@set(n|@if(@eq(%i%|0)|no more|@card(%i%)))%n%|1)%B%%W%,\n%n%%B%.\n@set(B| bottle@if(@neq(%i%|2)|s) of beer)@if(@eq(%i%|0)|Go to the store and buy some more|Take one down, pass it around),\n@set(n|@if(@eq(%i[+1]%|0)|no more|@card(%i[+1]%)))%n%%B%%W%.\n"
Her er resultatet av kjøringen:
Ninety-nine bottles of beer on the wall,
ninety-nine bottles of beer.
Take one down, pass it around,
ninety-eight bottles of beer on the wall.

Ninety-eight bottles of beer on the wall,
ninety-eight bottles of beer.
Take one down, pass it around,
ninety-seven bottles of beer on the wall.

...

Two bottles of beer on the wall,
two bottles of beer.
Take one down, pass it around,
one bottle of beer on the wall.

One bottle of beer on the wall,
one bottle of beer.
Take one down, pass it around,
no more bottles of beer on the wall.

No more bottles of beer on the wall,
no more bottles of beer.
Go to the store and buy some more,
ninety-nine bottles of beer on the wall.
Endret av jonny
  • Liker 1
Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
  • Hvem er aktive   0 medlemmer

    • Ingen innloggede medlemmer aktive
×
×
  • Opprett ny...