Secret Santa challenge noslēdzies!

Vispār kaut kā nedaudz dīvaini sanāca ar pasākumu, kurš tika pie nosaukuma ‘Secret Santa challenge‘. Kad es attiecīgo ierakstu rakstīju, nebiju īsti izdomājis ko vēlētos redzēt noslēgumā. T.i. – mērķis bija neskaidrs. Zināju, ka būtu interesanti redzēt citu programmētāju pieeju vienas un tās pašas problēmas risināšanai. Tā kā pats parasti runāju par PHP, tad sagaidīju, ka šī valoda būs plašāk pārstāvēta (ja vispār kāds piedalīsies). Bet izrādījās, ka Secret Santa challenge tapa par poliglotu salidojumu. 13 valodas (bija 14, bet viens risinājums atsaukts). Daudzām pa 1 risinājumam. Populārākā Python (4 risinājumi), bet otrā un trešā vieta dalīta starp C# un PHP.

Lielu daļu no iesniegtajiem risinājumiem es pat nespētu novērtēt un saprast cik pieeja laba, jo attiecīgajā valodā neorientējos. Tādēļ nevērtēšu arī tās valodas, kuras saprotu. Tā vietā vienkārši dodu sarakstu ar iesniegtajiem risinājumiem un ļauju jums pašiem skatīties, mācīties, vērtēt. Vienu brīdi bija ienākusi doma, ka varētu taisīt kādu balsošanu par smukāko risinājumu. Bet to atmetu. Ja kādam ir vēlme izteikt uzslavas, tad komentāros.

Vēl tapa skaidras vairākas lietas. Komentāri nav labākā vieta kur iesniegt kodus. Pazudis formatējums, reizēm daļa no koda utt. Gist, Pastebin, vpaste un tamlīdzīgi resursi ir labākā vieta kodam. Ja kāds vēl kādreiz taisa līdzīgu pasākumu, iesaku nedaudz precīzāk definēt uzdevumu. Ņemot vērā daudzos komentārus un manus skaidrojumus tur, nebiju uzdevuma augstumos šajā sakarā.

Ja runājam par pašu uzdevumu, tad tas bija interesants vairāku iemeslu dēļ. Lai gan sākumā tas šķiet elementārs, tā gluži nav. Protams, tas nav arī sarežģīts. Bet viņam ir pāris knifi, kurus ir jāparedz. Neesmu pārbaudījis vai iesniegti varianti ar to tiek galā vai nē. Bet tā kā vairākiem kodiem tika iesniegti labojumi, ir skaidrs, ka gluži triviāli nebija. Izmantotās pieejas bija vairākas. Piemēram, sakārtot visas personas vienā sarakstā un tad iet cauri, paņemot blakus esošos kā dāvinātāju un apdāvināmo. Ja pamana aizliegtu kombināciju blakus, pārģenerē sarakstu. Otrs variants (ar dažādām variācijām), ir taisīt divus sarakstus. Viens ar saņēmējiem, viens ar dāvinātājiem. Tad ejot cauri vienam un otram sarakstam sameklēt atbilstošos variantus. Ja izmanto divu sarakstu pieeju un ar katru izvēlēto pāri tos samazina par 1, tad jāņem vērā, ka beigās var uztrāpīt uz vienu no divām problēmām. Pirmā – katrā sarakstā paliek pa 1 personai (tātad A un A). Otrā – katrā sarakstā paliek pa 2 personām, kuras ir aizliegtais pāris. Un šajā gadījumā vajadzētu pāru meklēšanu sākt no jauna. Cik skatījos, citi to dara. Citi izmet paziņojumu ka īsti nesanāca. Es teiktu, ka skriptam vajadzēja pašam automātiski saprast, ka nav sanācis un veikt pārģenerēšanu. Pieļauju, ka ir arī citas pieejas, bet kā jau teicu – neesmu poliglots.

Iesniegtie varianti sakārtoti alfabētiskā secībā bez vērtējuma no manas puses. Ja kāds bija iesniedzis kodu komentārā vai caur email, tad attiecīgo kodu es ieliku savā Gist kontā ar atsauci uz personu. Ja ir vēlme samainīt uz kādu savu saiti – raksti komentāros.

Šur un tur pavīdēja jautājums par to, kas tad balvā… Nekas taustāms: citu programmētāju atzinība un/vai iespēja apgūt kādu jaunu pieeju attiecīgās problēmas risināšanai!

C#
Mārcis Pinnis https://gist.github.com/Endijs/946addb84f54b24d8433
Pēteris https://gist.github.com/pdonald/85a0877d691e48de01bb (saitē redzams C# un Rust)
Valters http://vpaste.net/Dk7XD

Clojure
Raitis Stengrevics https://gist.github.com/daGrevis/b4b002fe13fec7c7b043

Haskell
Aleksejs Ivanovs https://gist.github.com/ivanovsaleksejs/0048d95401ffa459cd4d

JavaScript
Mareks http://jsfiddle.net/chendler/zx5kmnop/ un http://jsfiddle.net/chendler/gxycxfeg/
Jānis http://pastebin.com/Shd1sqse

Pascal
Mr. V http://vpaste.net/yZE28

Perl
Ramūns Usovs https://gist.github.com/ramuuns/96aa39bdacf96f290f64

PL/SQL
Andris Buhanovskis http://pastebin.com/kFUQh41p

PHP
Briedis https://gist.github.com/briedis/7c5d7da87b6612355e8b
Endijs Lisovskis https://gist.github.com/Endijs/832a1b952f32b48e1e66
Kaspars Foigts https://gist.github.com/laacz/10423b5c3cabef780494

Python
Aigars Mahinovs https://gist.github.com/aigarius/2c99ede12539ca536849
Aija https://gist.github.com/AijaLi/d1bf82baf4a31f36acc6
Fedja https://gist.github.com/anonymous/d1d5aa99efd263597206
Ieva https://gist.github.com/IevaZarina/e48f71d096a59a903a42

R
Aleksis Jurševskis https://gist.github.com/Endijs/22f397dfa8008d69e580 (ar piebildi: Ceru, ka kāds izdomās variantu bez atkārtotas ģenerēšanas, man pietrūka pacietības.)

Ruby
Gatis Tomsons https://gist.github.com/gacha/466a9c45e7386283f5f3

Rust
Pēteris https://gist.github.com/pdonald/85a0877d691e48de01bb (saitē redzams C# un Rust)

Swift
Jānis Kiršteins http://pastebin.com/haPXSsp5