http://www.perlmonks.org?node_id=1012832


in reply to Re: Golf: Sudoku solving
in thread Golf: Sudoku solving

$_=$`.$_.$'.<>;split//;${/[@_[map{$i-($i="@-")%9+$_,9*$_+$i%9,9*$_%26+ +$i-$i%27+$i%9-$i%3}0..8]]/o||do$0}for/0/||print..9

Dear Monks, I need your help

I don't understand the "split" statement: no return value, apparently no side effect. Reading split was not helpful... :-/

Another thing: this solver works fine on debian but loop on win xp (strawberryperl 5.14.2.1)

UPDATE (solved):Thanks to BrowserUk, tobyink and eyepopslikeamosquito. Very clear and fast answers. FYI, in my case, difference between debian and winxp was in fact, between perl 5.8.8 and 5.14.2.1.

English is not my mother tongue.
Les tongues de ma mère sont "made in France".

Replies are listed 'Best First'.
Re: split//; (Re^2: Golf: Sudoku solving)
by BrowserUk (Patriarch) on Jan 11, 2013 at 09:17 UTC

    Perhaps this explains it:

    C:\test>\perl32\bin\perl -wnle"print $]; split; print join '|', @_" Use of implicit split to @_ is deprecated at -e line 1. evry good boy deserves food 5.008009 evry|good|boy|deserves|food C:\test>\perl64\bin\perl -wnle"print $]; split; print join '|', @_" Use of implicit split to @_ is deprecated at -e line 1. the quick brown foox 5.010001 the|quick|brown|foox Terminating on signal SIGINT(2) Terminating on signal SIGINT(2) C:\test>perl -wnle"print $]; split; print join '|', @_" Useless use of split in void context at -e line 1. evry good boy deserves food 5.016001

    As you can see, in 5.8 and 5.10, split in a void context was deprecated, but it put its results into @_;

    Somewhere between 5.10 and 5.16, the deprecation was enforced and that facility was removed. Which mean your golf script no longer works.


    With the rise and rise of 'Social' network sites: 'Computers are making people easier to use everyday'
    Examine what is said, not who speaks -- Silence betokens consent -- Love the truth but pardon error.
    "Science is about questioning the status quo. Questioning authority".
    In the absence of evidence, opinion is indistinguishable from prejudice.

      The @_ feature was removed in Perl 5.12, but was mistakenly omitted from the perl5120delta perldoc page. There's an errata towards the end of perl5140delta.

      This Perl upgrade added three strokes to youreverybody's golf handicap, but in fairness the say feature from Perl 5.10 greatly improved our golfing experience, so we shouldn't be too upset.

      update: didn't mean to imply that BrowserUk in particular was upset by this change.

      perl -E'sub Monkey::do{say$_,for@_,do{($monkey=[caller(0)]->[3])=~s{::}{ }and$monkey}}"Monkey say"->Monkey::do'
        This Perl upgrade added three strokes to your golf handicap, but in fairness the say feature from Perl 5.10 greatly improved everybody's golfing experience, so we shouldn't be too upset.

        There was nothing negative about my comnnents; just statements of fact.

        Golf's fun, but about as important as cup holders to the function of a car :)


        With the rise and rise of 'Social' network sites: 'Computers are making people easier to use everyday'
        Examine what is said, not who speaks -- Silence betokens consent -- Love the truth but pardon error.
        "Science is about questioning the status quo. Questioning authority".
        In the absence of evidence, opinion is indistinguishable from prejudice.
Re: split//; (Re^2: Golf: Sudoku solving)
by eyepopslikeamosquito (Archbishop) on Jan 11, 2013 at 09:51 UTC

    For Perl up to and including 5.10, calling split in scalar or void context had the side-effect of setting @_. This mis-feature was removed in Perl 5.12. That was great news for most Perl programmers because this side-effect "feature" was unnecessary, an ugly wart. It was sad news for golfers though because side-effects are frequently useful in golf. In fact, I recently experienced a similar split annoyance in Compression in Golf: Part III, as described in the "Fun with split" section in that node.

    Simply changing @_ to @z say should fix thospel's original solution at the cost of three strokes:

    $_=$`.$_.$'.<>;@z=split//;${/[@z[map{$i-($i="@-")%9+$_,9*$_+$i%9,9*$_% +26+$i-$i%27+$i%9-$i%3}0..8]]/o||do$0}for/0/||print..9
    I expect you could do better than that, though I haven't tried.