[Rio-pm] [Golf] Função drop Haskell

Nilson Santos Figueiredo Jr. acid06 em gmail.com
Quarta Fevereiro 3 11:48:15 PST 2010


Melhorando a minha solução anterior, 85 caracteres (83 tirando o my):

sub drop{my($n,$w)=@_;$n=0
if$n<0;ref$w?@$w[$n..$#{$w}]:$n>length$w?'':substr($w,$n)}

-Nilson

2010/2/3 Nilson Santos Figueiredo Jr. <acid06 at gmail.com>:
> Uma solução, warnings and strict compliant:
>
> sub drop {
>    my ($n, $w) = @_;
>    $n = 0 if $n < 0;
>    return ( $n > length $w ? '' : substr($w,$n) ) if !ref $w;
>    @$w[$n..$#{$w}];
> }
>
> Se colocar tudo em uma linha:
>
> sub drop{my($n,$w)=@_;$n=0
> if$n<0;return($n>length$w?'':substr($w,$n))if!ref$w;@$w[$n..$#{$w}];}
>
> 96 caracteres. Deve dar pra melhorar bastante ainda. Se tirar o "my"
> pra deixar de ser strict compliant, cai pra 94.
>
> -Nilson
>
> 2010/2/3 Daniel de Oliveira Mantovani <daniel.oliveira.mantovani at gmail.com>:
>> Olá pessoal, o desafio envolve a função drop do Haskell:
>>
>> <haskell>
>> ghci> myDrop 2 "foobar"
>> "obar"
>> ghci> myDrop 4 "foobar"
>> "ar"
>> ghci> myDrop 4 [1,2]
>> []
>> ghci> myDrop 0 [1,2]
>> [1,2]
>> ghci> myDrop 7 []
>> []
>> ghci> myDrop (-2) "foo"
>> "foo"
>> </haskell>
>>
>> Eu fiz em Perl, para ficar claro:
>>
>> <perl>
>> sub drop {
>>    my ( $n, $xs ) = @_;
>>    if ( ref $_[1] ne 'ARRAY' ) {
>>        $n <= 0 ? return $_[1] : return substr( $_[1], $n );
>>    }
>>    if ( $n <= 0 || !@_ ) {
>>        return @{$xs};
>>    }
>>    else {
>>        shift @{$xs};
>>        drop( ( $n - 1 ), $xs );
>>    }
>> }
>> </perl>
>>
>> Exemplos:
>> mantovani at mantovani-desktop:~/Perl/Funcional$ perl -MHaskell -E 'say
>> $_ for drop(3,[1,2,3,4,5,6])'
>> 4
>> 5
>> 6
>>
>> mantovani at mantovani-desktop:~/Perl/Funcional$ perl -MHaskell -E 'say
>> $_ for drop(1,"ofernandoagoragolf")'
>> fernandoagoragolf
>>
>> mantovani at mantovani-desktop:~/Perl/Funcional$ perl -MHaskell -E 'say
>> $_ for drop(2,["mantovani","garu","fernando","blabos"])'
>> fernando
>> blabos
>>
>> mantovani at mantovani-desktop:~/Perl/Funcional$ perl -MHaskell -E 'say
>> $_ for drop(-1,["mantovani","garu","fernando","blabos"])'
>> mantovani
>> garu
>> fernando
>> blabos
>>
>> mantovani at mantovani-desktop:~/Perl/Funcional$ perl -MHaskell -E 'say
>> $_ for drop(-1,"mantovani")'
>> mantovani
>>
>> mantovani at mantovani-desktop:~/Perl/Funcional$ perl -MHaskell -E 'say
>> $_ for drop(10,"mantovani")'
>>
>> --
>> "If you’ve never written anything thoughtful, then you’ve never had
>> any difficult, important, or interesting thoughts. That’s the secret:
>> people who don’t write, are people who don’t think."
>> _______________________________________________
>> Rio-pm mailing list
>> Rio-pm at pm.org
>> http://mail.pm.org/mailman/listinfo/rio-pm
>>
>


Mais detalhes sobre a lista de discussão Rio-pm