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. 8)

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...

Kod: Markera allt

-()(dc<<<$1'[d1-l-x*]s<[d1<<]ds-xp');- 52
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...

Kod: Markera allt

#!/bin/sh
seq -s\* $1|bc
14 tecken om man bortser från shebangen 8)

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...

Kod: Markera allt

#!/bin/sh
seq -s\* $1|bc
14 tecken om man bortser från shebangen 8)
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.

Kod: Markera allt

A=("$@");b=$RANDOM%${#A[@]};echo ${A[$b]}

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.