Golfande golfare?
Golfande golfare?
Har vi några golfare bland medlemmarna här måntro? Vilket språk begagnar ni er av? Vore intressant med en golftävling tycker jag. Givetvis skall även tekniker diskuteras; bygger ni först upp ett fungerande program för att sedan, när det gör vad det skall, krympa det? Alla vägar mot framgång är bra, utom de dåliga.
För de icke ännu insatta så går codegolf ut på att lösa ett givet problem med så få tecken som möjligt. Normalt så behöver man icke begagna sig av ekvivalenter till 'use strict;', 'use warnings' i det språk man föredrar, ust på grund av att det innefattar en himla massa extra tecken - det kan dock vara en fördel under applikationens uppbyggnad.
Mer läsning och en del problem här: http://codegolf.com/
mvh / perl -pe '$_=`perldoc -qjaph`=>s`.+"(.+)".+`$1\n`s=>s`\b([^a])`\u$1`g=>print;'
För de icke ännu insatta så går codegolf ut på att lösa ett givet problem med så få tecken som möjligt. Normalt så behöver man icke begagna sig av ekvivalenter till 'use strict;', 'use warnings' i det språk man föredrar, ust på grund av att det innefattar en himla massa extra tecken - det kan dock vara en fördel under applikationens uppbyggnad.
Mer läsning och en del problem här: http://codegolf.com/
mvh / perl -pe '$_=`perldoc -qjaph`=>s`.+"(.+)".+`$1\n`s=>s`\b([^a])`\u$1`g=>print;'
ǁ A: Because it obfuscates the reading.
ǁ Q: Why is top posting so bad?
ǁ Q: Why is top posting so bad?
- Katt
- AVREGISTRERAD
- Inlägg: 625
- Blev medlem: 19 nov 2009, 11:04
- OS: Arch Linux
- Utgåva: 22.04 Jammy Jellyfish LTS
- Ort: Bohuslän
- Kontakt:
Re: Golfande golfare?
Såg du postade en liknande tråd på arclinux.org. Hade faktiskt vart riktigt skoj att köra en liten tråd om det här med (självklart med annorlunda problem), framförallt om vi också tillåter bash.
Väldigt lärorikt om inte annat.
Väldigt lärorikt om inte annat.

Det är inte lätt när det är svårt!
Re: Golfande golfare?
Då får du i uppdrag att skapa det första problemet. 

ǁ A: Because it obfuscates the reading.
ǁ Q: Why is top posting so bad?
ǁ Q: Why is top posting so bad?
- Katt
- AVREGISTRERAD
- Inlägg: 625
- Blev medlem: 19 nov 2009, 11:04
- OS: Arch Linux
- Utgåva: 22.04 Jammy Jellyfish LTS
- Ort: Bohuslän
- Kontakt:
Re: Golfande golfare?
Antagligen ett simpelt problem, men vi måste börja någonstanns.
Problem 1: Skriv ett program som tar ett valfritt tal som argument och beräknar fakulteten av detta.
* Fakulteten av 5 skrivs 5! och beräknas 5x4x3x2x1=120
* koden skall kunna köras som program "argument" där argument är en valfri siffra.
* koden skall enbart ge summan av fakulteten, dvs 120 vid 5!
* Vinnaren får komma på nästa problem
Problem 1: Skriv ett program som tar ett valfritt tal som argument och beräknar fakulteten av detta.
* Fakulteten av 5 skrivs 5! och beräknas 5x4x3x2x1=120
* koden skall kunna köras som program "argument" där argument är en valfri siffra.
* koden skall enbart ge summan av fakulteten, dvs 120 vid 5!
* Vinnaren får komma på nästa problem
Det är inte lätt när det är svårt!
Re: Golfande golfare?
Kod: Markera allt
sub f{return$_--*&f if$_>1||return 1}print f($_=$ARGV[0]);
Kod: Markera allt
perl -pe '$c="sub f{return$_--*&f if$_>1||return 1}print f($_=$ARGV[0]);";print length($c);'
Beroende på skal så kan en "\n" vara rätt fin (dock inte nödvändig!) också - jag kör dock zsh. :p
ǁ A: Because it obfuscates the reading.
ǁ Q: Why is top posting so bad?
ǁ Q: Why is top posting so bad?
- Konservburk
- Inlägg: 5919
- Blev medlem: 07 apr 2007, 22:28
Re: Golfande golfare?
Hur tänkte du att man ska köra det där? Det går ju att stoppa in det i en fil enligt:dmz skrev:Kod: Markera allt
sub f{return$_--*&f if$_>1||return 1}print f($_=$ARGV[0]);
Kod: Markera allt
#!/usr/bin/perl
sub f{return$_--*&f if$_>1||return 1}print f($_=$ARGV[0]);
Kan du förklara (för oss som inte är speciellt bevandrade i perl) var någonstans man ska stoppa in argumentet?dmz skrev:Kod: Markera allt
perl -pe '$c="sub f{return$_--*&f if$_>1||return 1}print f($_=$ARGV[0]);";print length($c);'
Ska det där talet föreställa antalet tecken i kodstycket? Exakt vad bortser du isf ifrån?dmz skrev:47
...
Eftersom jag inte är något vidare på perl så gör jag mitt försök i ett annat språk...
Kod: Markera allt
-()(dc<<<$1'[d1-l-x*]s<[d1<<]ds-xp');- 52
Re: Golfande golfare?
Precis så. Raden med shebang utelämnas dock, och skriptet invokas istället med perl direkt, perl fil 5Konservburk skrev: Hur tänkte du att man ska köra det där? Det går ju att stoppa in det i en fil enligt:
...och sedan köra ./filen.pl tal för att få det på den eftersträvade formen "program argument". Eller tänkte du dig något annat sätt?Kod: Markera allt
#!/usr/bin/perl sub f{return$_--*&f if$_>1||return 1}print f($_=$ARGV[0]);
$_ (http://www.wellho.net/mouth/969_Perl-and-.html) får värdet av $ARGV[0], dvs det första argument som ges, t.ex 5.Konservburk skrev: Kan du förklara (för oss som inte är speciellt bevandrade i perl) var någonstans man ska stoppa in argumentet?
Ja, vad menar du med bortser från?Konservburk skrev: Ska det där talet föreställa antalet tecken i kodstycket? Exakt vad bortser du isf ifrån?
ǁ A: Because it obfuscates the reading.
ǁ Q: Why is top posting so bad?
ǁ Q: Why is top posting so bad?
- jens.tinfors
- Inlägg: 49
- Blev medlem: 18 dec 2009, 17:09
- OS: Ubuntu
- Utgåva: 22.10 Kinetic Kudu
- Ort: Stockholm
- Kontakt:
Re: Golfande golfare?
En version i Ruby.
Kod: Markera allt
#!/usr/bin/ruby
s=1;(1..ARGV[0].to_i).each {|x|s=x*s};puts s
- Katt
- AVREGISTRERAD
- Inlägg: 625
- Blev medlem: 19 nov 2009, 11:04
- OS: Arch Linux
- Utgåva: 22.04 Jammy Jellyfish LTS
- Ort: Bohuslän
- Kontakt:
Re: Golfande golfare?
I bash, 51 tecken inklusive mellanrum, 45 utan:
Kod: Markera allt
e=1;for i in $(seq $1);do let e=$i*$e;done;echo $e
Det är inte lätt när det är svårt!
- Konservburk
- Inlägg: 5919
- Blev medlem: 07 apr 2007, 22:28
Re: Golfande golfare?
Det är jag med på. Vad jag däremot inte är med på är var man anger det första argument (var ska jag skriva t.ex. 5 någonstans?) om man kör koden direkt med perl -pe osv, dvs som du skrev i din andra kodruta.dmz skrev:$_ (http://www.wellho.net/mouth/969_Perl-and-.html) får värdet av $ARGV[0], dvs det första argument som ges, t.ex 5.Konservburk skrev: Kan du förklara (för oss som inte är speciellt bevandrade i perl) var någonstans man ska stoppa in argumentet?
När jag klistrade in din kod (från din första kodruta) i en fil så blev den 58 tecken stor (innan jag la till shebangen). Hur får du det då till 47? Jag är bara lite nyfiken på hur man ska räkna.dmz skrev:Ja, vad menar du med bortser från?Konservburk skrev: Ska det där talet föreställa antalet tecken i kodstycket? Exakt vad bortser du isf ifrån?
Re: Golfande golfare?
Nu är jag med; det var en bra fråga faktiskt, hm...Konservburk skrev: Det är jag med på. Vad jag däremot inte är med på är var man anger det första argument (var ska jag skriva t.ex. 5 någonstans?) om man kör koden direkt med perl -pe osv, dvs som du skrev i din andra kodruta.
Något gick uppenbarligen snett, givetvis är det 58 tecken, ajaj.Konservburk skrev: När jag klistrade in din kod (från din första kodruta) i en fil så blev den 58 tecken stor (innan jag la till shebangen). Hur får du det då till 47? Jag är bara lite nyfiken på hur man ska räkna.
ǁ A: Because it obfuscates the reading.
ǁ Q: Why is top posting so bad?
ǁ Q: Why is top posting so bad?
- Konservburk
- Inlägg: 5919
- Blev medlem: 07 apr 2007, 22:28
Re: Golfande golfare?
Det där med seq gav mig en ny ide...Katt skrev:Kod: Markera allt
e=1;for i in $(seq $1);do let e=$i*$e;done;echo $e
Kod: Markera allt
#!/bin/sh
seq -s\* $1|bc

Re: Golfande golfare?
Skall vi utse Konservburk till vinnare efter dessa tre bidrag? Detta verkar inte vara någon tråd som drar till sig folk och jag är sugen på en ny uppgift. :p
ǁ A: Because it obfuscates the reading.
ǁ Q: Why is top posting so bad?
ǁ Q: Why is top posting so bad?
- Konservburk
- Inlägg: 5919
- Blev medlem: 07 apr 2007, 22:28
Re: Golfande golfare?
Problem 2: Skapa ett program som skriver ut ett slumpmässigt argument av alla de argument som skickas med.
* program A B C ska slumpmässigt skriva ut antingen A eller B eller C
* program A ska alltid skriva ut A
* program (utan argument) ska inte skriva ut någonting alls
* program A B C ska slumpmässigt skriva ut antingen A eller B eller C
* program A ska alltid skriva ut A
* program (utan argument) ska inte skriva ut någonting alls
Re: Golfande golfare?
Kod: Markera allt
use List::Util qw(shuffle);print$c=shuffle(@ARGV)
ǁ A: Because it obfuscates the reading.
ǁ Q: Why is top posting so bad?
ǁ Q: Why is top posting so bad?
- Katt
- AVREGISTRERAD
- Inlägg: 625
- Blev medlem: 19 nov 2009, 11:04
- OS: Arch Linux
- Utgåva: 22.04 Jammy Jellyfish LTS
- Ort: Bohuslän
- Kontakt:
Re: Golfande golfare?
Du är en ond kodareKonservburk skrev:Det där med seq gav mig en ny ide...Katt skrev:Kod: Markera allt
e=1;for i in $(seq $1);do let e=$i*$e;done;echo $e
14 tecken om man bortser från shebangenKod: Markera allt
#!/bin/sh seq -s\* $1|bc

Det är inte lätt när det är svårt!
-
- Inlägg: 378
- Blev medlem: 24 maj 2007, 01:53
- OS: Ubuntu
- Utgåva: 22.04 Jammy Jellyfish LTS
- Ort: Kalmar/Luleå
- Kontakt:
Re: Golfande golfare?
Får till en med 41 tecken utan shebang.
Kod: Markera allt
A=("$@");b=$RANDOM%${#A[@]};echo ${A[$b]}
Hur jag än gör så slutar det alltid med E17 på netbooken....
- Katt
- AVREGISTRERAD
- Inlägg: 625
- Blev medlem: 19 nov 2009, 11:04
- OS: Arch Linux
- Utgåva: 22.04 Jammy Jellyfish LTS
- Ort: Bohuslän
- Kontakt:
Re: Golfande golfare?
Redigerade din kod något och kollade efter argument så att den inte ger någon output om inga ges. 55tecken med mellanslag, 49 utan.
Kod: Markera allt
if [ -n "$1" ];then A=("$@");echo ${A["$RANDOM%$#"]};fi
Det är inte lätt när det är svårt!
Re: Golfande golfare?
Hur skall vi förhålla oss till externa moduler/applikationer? Jag noterar att t.ex bc inte tillhör coreutils; är inte detta ansett som fusk, eller skall vi enbart köra på kortast möjliga kod? Om jag skulle begagna mig av en extern modul så borde ju nästan denna modulen, eller åtminstonde koden för den aktuella funktionen, även räknas? :p
ǁ A: Because it obfuscates the reading.
ǁ Q: Why is top posting so bad?
ǁ Q: Why is top posting so bad?
- Katt
- AVREGISTRERAD
- Inlägg: 625
- Blev medlem: 19 nov 2009, 11:04
- OS: Arch Linux
- Utgåva: 22.04 Jammy Jellyfish LTS
- Ort: Bohuslän
- Kontakt:
Re: Golfande golfare?
Det ligger en poäng i detta. Vi skulle kunna räkna varje extra program som +10 utöver det vanliga tecknena?dmz skrev:Hur skall vi förhålla oss till externa moduler/applikationer? Jag noterar att t.ex bc inte tillhör coreutils; är inte detta ansett som fusk, eller skall vi enbart köra på kortast möjliga kod? Om jag skulle begagna mig av en extern modul så borde ju nästan denna modulen, eller åtminstonde koden för den aktuella funktionen, även räknas? :p
O andra sidan så är det trevligt att se vad som kan ådstakommas även med externa bibliotek och applikationer. Fast det blir surt om det redan finns program som fyller funktionen vi söker.
Det är inte lätt när det är svårt!