Programmētāji – kā būtu ar nelielu skriptu?

Tuvojas Ziemassvētki un līdz ar tiem arī ikgadējā apdāvināšanās. Populāra apdāvināšanas metode ir “Secret Santa” jeb latviskojot “nezināmais dāvinātājs”, “slepenais dāvinātājs” utt. Lai tas varētu notikt, ir jāveic izlozi, kuras rezultātā tiek noskaidrotas dāvinātāju un apdāvināmo kombinācijas. Citi to dara metot lapiņas ar vārdiem cepurē, citi uzraksta tam speciāli paredzētu skriptu. Te nu ir mans aicinājums programmētājiem. Padalamies ar skriptiem, kuri veiktu attiecīgo uzdevumu. Tālāk par dažiem nosacījumiem.

  • Lai gan reāls skripts veiktu arī izlozes rezultātu nosūtīšanu uz e-mail katram dāvinātājam, tas šoreiz nav vajadzīgs. Mani interesē algoritms/pieeja pašas izlozes veikšanai.
  • Noteiksim, ka izlozē piedalās 15 cilvēki.
  • Ir iespējams definēt pārus, kuri nedrīkst tikt pieļauti. Šis punkts ir noderīgs izlozēs radu vidū, lai, piemēram, izslēgtu iespējamību, ka izlozes rezultātā dāvanu saņem vīrs no sievas vai tamlīdzīgi (pāri lai apdāvinās paši savā starpā). Tātad, ja 15 cilvēku vidū ir Jānis un Līga un nevēlamies, lai Jānis dāvinātu dāvanu Līgai, tad nodefinējam šo kā aizliegtu pāri. Pieņemsim, ka 15 cilvēku vidū ir 3 šādi pāri.
  • Skripts izpildoties izdrukā pārus formātā: “X dāvina dāvanu Y”, kur X aizvietots ar dāvinātāja vārdu un Y ar saņēmēja vārdu.
  • Uz katru skripta palaišanu jāsaņem citādāku izlozes sarakstu (pēc nejaušības principa).
  • Protams, pats sevi izlozēt nedrīkst.

Skriptus var iesniegt dažādos veidos. Gan rakstot pa tiešo komentārā, gan Gist (Github), gan Pastebin, gan citos. Ja izmantojat kādu ārēju resursu, tad komentārā ielieciet saiti.

Paskatīsimies, cik dažādas ir mūsu pieejas tik vienkāršam uzdevumam. Valodu ierobežojuma nav (PHP, Python, Java, JavaScript, Go, … ). Variantus gaidīšu līdz 25.11 un tad sākšu apstiprināt komentārus. Līdz 25.11 visi komentāri būs moderācijā. 25.11 nopublicēšu arī savu variantu.

INFO!

Ja jau esi iesniedzis savu variantu, tad atkārtoti to darīt nevajag. Komentāri iet uz moderēšanu, tādēļ tos neredzēt līdz 25.11. Protams, ja gribi iesniegt labojumu, to vari darīt.

Šobrīd savus variantus iesnieguši:
Kaspars Foigts
Aigars Mahinovs
Mareks
Aleksis
briedis
Pēteris
Valters
Jānis
Terminalis Vulgaris
Aleksejs Ivanovs
Aija
Raitis Stengrevics
Gatis Tomsons
Ieva
Mr. V
Jānis Kiršteins
Fedja
Mārcis
Ramūns Usovs
Andris Buhanovskis

Iesniegtie varianti: http://endijs.com/2014/11/25/secret-santa-challenge-nosledzies/

49 comments

  1. Ja Jānis dāvina dāvanu Līgai, vai Ligai obligāti jādāvina dāvana Jānim? Vai Līga drīkst to darīt?

    1. Nē, nav obligāti. Apdāvināmais jāizvēlas pēc nejaušības principa ievērojot nosacījumu, ka nedrīkst būt pāris, kā arī pats sevi nedrīkst. Piemērs: A, B, C, D, E, F, G. 7 dalībnieki. Definējam ka A un C ir pāris, kā arī E un F ir pāris (draugs/draudzene, vīrs/sieva). Šajā situācijā ir atļautas visas kombinācijas atskaitot “A dāvina C”, “C dāvina A”, “E dāvina F”, “F dāvina E”. Tātad rezultāts varētu būt:
      A dāvina D
      B dāvina F
      C dāvina E
      D dāvina A
      E dāvina B
      F dāvina C

  2. Vai ir definēts, ka cilvēks var būt tikai vienā pārī, vai iespējams, ka atrodas divos “aizliegtajos” pāros?

    1. Tā kā tas netika noteikts iepriekš un jau ir iesniegti vairāki risinājumi, tad atļauju izvēlēties savu interpretāciju. Vari taisīt tā, ka var būt vairākos. Vari tā, ka atļauts vienā.
      Pieļauju, ka lielākajā daļā risinājumu šim faktoram īsti nebūs nozīmes un skripti strādās gan ar vienu variantu, gan otru.

  3. No piemēra, kur nevēlamies lai Jānis dāvinātu Līgai – tāpēc aizliegtajā pārī ieliekam “Jānis un Līga”. Vai tas automātiski nozīmē arī to, ka Līga nedrīkst dāvināt Jānim? Vai arī tad būtu jāliek “Līga un Jānis” aizliegtajā sarakstā?

    1. Ja nodefinējam pāri “Jānis – Līga”, tad tas nozīmē ka Jānis nedrīkst dāvināt Līgai UN Līga nedrīkst dāvināt Jānim. Tātad pāris darbojas abos virzienos nevis vienā.

  4. vispār jau tā nedāvināšanas tolerēšana ir ļoti sarežģīta un individuāla :) ok, vīrs ar sievu neapdāvinās (bet varbūt vajadzētu), bet ko darīt ar izbijušiem pāriem u.c. kombinācijām? vienai laime zemes virsū, saņemot dāvanu, otram iemesls neapmeklēt svētku sarīkojumu vispār. un kurš to spēs adekvāti administrēt? :)

    1. Kāpēc jātroļļo? Foršs pasākums taču izvēršas. Dažnedažādi risinājumi jau iesniegti. Katram sava pieeja. Tas taču ir interesanti. Nosacījumi visai skaidri. Ko dzīvē darītu personas kuras tiktu salozētas, ir ārpus šī uzdevuma rāmjiem.

  5. es jau netroļļoju, es vienkārši par to, ka sociālas situācijas ir sarežģītākas

    p.s.
    vai varētu izmest vienu no 3. vai 4. komentāru? jo tur bija tie pieminētie timeout, tāpēc nodublējās
    c++ sintakse arī nokliboja

    1. Jā, sociālās situācijas dažādas. Uzdevums modelēts pēc manas. Jo šo uzdevumu izpildīju pirms dažām dienām un ieinteresēja kā citi to darītu. Mums galvenais bija, lai ir randoms + lai pāri netrāpās (jo tie sevi var apdāvināt individuāli). Dalību ņem vairākas ģimenes. Un vēlamais ir, lai vienas ģimenes cilvēki dotu dāvanas citas ģimenes pārstāvjiem. Citādi sanāktu situācija – sanāk 4 ģimenes un apdāvinās ģimeņu ietvaros. Neinteresanti.

      Runājot par kodiem – kad pienāks 25.11 – es ņemšu vērā pēdējo iesniegto komentāru (vairāki iesniedz arī update versijas), kā arī svaigāko Gist versiju utml. Un tad arī veikšu cleanup komentāros.

    2. Varbūt vari iemest savu kodu pastebin vai tamlīdzīgā vietā? Citādi komentāros liktais ir ar sabojātu sintaksi un rekonstruējot negribu kaut ko pazaudēt.

  6. Skaidrs, ka rezultāts tiek izdrukāts uz ekrāna, bet kā ir ar informācijas padošanu (dalībnieki, pāri) – failā, hārdkodēts, cits variants? Tādā atrakcijā piedalos pirmo reizi, tāpēc neesmu informēts par “vispārpieņemtajiem standartiem”.

    1. Nezinu par standartiem. Manā gadījumā pēc izlozes tiek katram aizsūtīts email ar info par to, kuram tad būs jāgādā dāvanu.

      1. Nākotnei. Šāda tipa uzdevumos parasti tiek definēts ievadāmo datu formāts un veids. Piemēram – pieņemam, ka izejas dati atrodas failā fails.txt, kura katra rindiņa satur vienu dāvinātāju vai arī, ja ar komatu atdalītus pārus. Dati jāizvada uz ekrāna tādā un tādā formātā.

        Tā tiek darīts olimpiādēs, lai veikli var notestēt iesniegtos darbus.

        1. Tas jau būtu forši, ja visi rakstītu vienotā valodā. Bet ja skatās reāli, nez vai Endijam būtu kaifs veltīt stundas gatavojot vides :) citējot: (PHP, Python, Java, JavaScript, Go, … )

        2. Šobrīd ir iesniegts: PHP, Python, Visual C#.NET, R, JavaScript, Haskell, Clojure, C++ un varbūt vēl kaut kas.

        3. Ne ar vienu nebūtu problēmu. Domāju, ka pat ar C#.NET ar visu LINQ varētu uz linuxa caur Mono palaist.

        4. Viss šis pasākums bija 1 ātra ideja, bez īpaša plāna. Un jā – gan jau varētu sataisīt visu tā, lai var palaist un notestēt utt. Bet tas nebija mērķis. Nav jau kaut kādas sacensības vai codewars. Un ja es arī palaistu visus kodus un notestētu, ko tad darītu ar rezultātiem? Rakstītu, ka šie izpildīja, šiem bugi? Nē. Tā es negribu (to var darīt kāda cita projekta ietvaros, bet ne tagad). Tā vietā varētu savākt visus, dot pārējiem apskatei un varbūt uztaisīt kādu balsošanu par to kurš risinājums smukāks, interesantāks vai tml. Tādā veidā citi varētu apgūt jaunus veidus kā skatīties uz to pašu problēmu, par kuru nesen domājuši. Kā arī iepazīt kādu jaunu valodu – salīdzināt kā citā valodā risinās attiecīgā problēma. Kaut kā tā.

        5. Oh – es jau negrasos testēt. Iesniegtas lietas ir tik dažādās valodās, ka es pat daļu neatpazīstu, daļu nezinātu kā palaist utt. Ja būtu noteikts – rakstam visi PHP, tad cita lieta. Bet valodas noteikšana notiekti samazinātu iesniegto variantu skaitu. Un šoreiz mērķis nav tik daudz pārbaudīt kuram strādā un kuram nē, bet paskatīties kāda veida algoritmus / valodas konstrukcijas/ funkcijas katrs izmantojis. Kā arī kā risinājumi izskatās citās valodās.
          Vērtēt varēs citi (kuri attiecīgās valodas saprot). Neesmu poliglots. :D

  7. Biju domājis ievaddatus un to formātu. Kārtīgi pārlasīju visu vēlreiz un sapratu, ka šis ir tas, ko es meklēju “Pieņemsim, ka 15 cilvēku vidū ir 3 šādi pāri.”.

    1. Ievaddati – vienkārši pats iedefinē kādā masīvā vai kādā citā datu struktūrā un viss.

  8. Vai vienam cilvēkam var būt vairākas dāvanas?

    A -> C
    B -> C
    C -> A

        1. Pieliku solution kas apdāvina visus! \o/

  9. pašlaik lūgtu atsaukt mani no konkursa, jo mans necilais scripts netiek galā ar situāciju, kas n-1 savstarpēji ir apdāvinājušies, bet n jādāvina n

    1. Vēl ir laiks. Padomā un iesniedz labojumu. Ja neiesniegsi, tad tavu nepublicēšu. Un ja to darīsi, tad atkal caur pastebin, jo tur izskatās daudz smukāk un skaidrāk kā tas ko liec komentāros. Turklāt komentārā daļa no koda pazūd (piemēram, include tiek aprauts utml.)

  10. Atpakaļ ziņojums: Gadās arī izgāzties (programmēšanā) | Cpt. ManlyPink

Atbildēt

Jūsu e-pasta adrese netiks publicēta.

This site uses Akismet to reduce spam. Learn how your comment data is processed.