Sida 1 av 2
Golfande golfare?
Postat: 13 feb 2010, 09:30
av dmz
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;'
Re: Golfande golfare?
Postat: 14 feb 2010, 11:32
av Katt
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.

Re: Golfande golfare?
Postat: 14 feb 2010, 13:43
av dmz
Då får du i uppdrag att skapa det första problemet.

Re: Golfande golfare?
Postat: 14 feb 2010, 14:15
av Katt
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
Re: Golfande golfare?
Postat: 14 feb 2010, 21:43
av dmz
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);'
47
Beroende på skal så kan en "\n" vara rätt fin (dock inte nödvändig!) också - jag kör dock zsh. :p
Re: Golfande golfare?
Postat: 15 feb 2010, 05:16
av Konservburk
dmz skrev:Kod: Markera allt
sub f{return$_--*&f if$_>1||return 1}print f($_=$ARGV[0]);
Hur tänkte du att man ska köra det där? Det går ju att stoppa in det i en fil enligt:
Kod: Markera allt
#!/usr/bin/perl
sub f{return$_--*&f if$_>1||return 1}print f($_=$ARGV[0]);
...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?
dmz skrev:Kod: Markera allt
perl -pe '$c="sub f{return$_--*&f if$_>1||return 1}print f($_=$ARGV[0]);";print length($c);'
Kan du förklara (för oss som inte är speciellt bevandrade i perl) var någonstans man ska stoppa in argumentet?
dmz skrev:47
Ska det där talet föreställa antalet tecken i kodstycket? Exakt vad bortser du isf ifrån?
...
Eftersom jag inte är något vidare på perl så gör jag mitt försök i ett annat språk...
Körs direkt ifrån skalet (bash eller zsh) och ska räkna ut fakulteten av 52 och dessutom visa precis alla siffror i resultatet oavsett hur många det än är.
Re: Golfande golfare?
Postat: 15 feb 2010, 06:31
av dmz
Konservburk 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:
Kod: Markera allt
#!/usr/bin/perl
sub f{return$_--*&f if$_>1||return 1}print f($_=$ARGV[0]);
...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?
Precis så. Raden med shebang utelämnas dock, och skriptet invokas istället med perl direkt,
perl fil 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?
$_ (
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:
Ska det där talet föreställa antalet tecken i kodstycket? Exakt vad bortser du isf ifrån?
Ja, vad menar du med bortser från?
Re: Golfande golfare?
Postat: 15 feb 2010, 08:43
av jens.tinfors
En version i Ruby.
Kod: Markera allt
#!/usr/bin/ruby
s=1;(1..ARGV[0].to_i).each {|x|s=x*s};puts s
Re: Golfande golfare?
Postat: 15 feb 2010, 11:33
av Katt
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
Re: Golfande golfare?
Postat: 15 feb 2010, 13:28
av Konservburk
dmz skrev:Konservburk skrev:
Kan du förklara (för oss som inte är speciellt bevandrade i perl) var någonstans man ska stoppa in argumentet?
$_ (
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.
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:Konservburk skrev:
Ska det där talet föreställa antalet tecken i kodstycket? Exakt vad bortser du isf ifrån?
Ja, vad menar du med bortser från?
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.
Re: Golfande golfare?
Postat: 15 feb 2010, 13:40
av dmz
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.
Nu är jag med; det var en bra fråga faktiskt, hm...
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.
Något gick uppenbarligen snett, givetvis är det 58 tecken, ajaj.
Re: Golfande golfare?
Postat: 15 feb 2010, 13:41
av Konservburk
Katt skrev:Kod: Markera allt
e=1;for i in $(seq $1);do let e=$i*$e;done;echo $e
Det där med
seq gav mig en ny ide...
14 tecken om man bortser från shebangen

Re: Golfande golfare?
Postat: 15 feb 2010, 14:50
av dmz
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
Re: Golfande golfare?
Postat: 15 feb 2010, 15:08
av Konservburk
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
Re: Golfande golfare?
Postat: 15 feb 2010, 15:39
av dmz
Kod: Markera allt
use List::Util qw(shuffle);print$c=shuffle(@ARGV)
Vinner nog inga priser med det inte...
Re: Golfande golfare?
Postat: 15 feb 2010, 15:54
av Katt
Konservburk skrev:Katt skrev:Kod: Markera allt
e=1;for i in $(seq $1);do let e=$i*$e;done;echo $e
Det där med
seq gav mig en ny ide...
14 tecken om man bortser från shebangen

Du är en ond kodare

den där bc måste jag spana in.
Re: Golfande golfare?
Postat: 15 feb 2010, 17:35
av Alleinsora
Får till en med 41 tecken utan shebang.
Re: Golfande golfare?
Postat: 16 feb 2010, 01:11
av Katt
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
Re: Golfande golfare?
Postat: 16 feb 2010, 10:23
av dmz
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
Re: Golfande golfare?
Postat: 16 feb 2010, 11:38
av Katt
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
Det ligger en poäng i detta. Vi skulle kunna räkna varje extra program som +10 utöver det vanliga tecknena?
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.