Dating agency: Difference between revisions

From Rosetta Code
Content added Content deleted
Line 19: Line 19:
This task is intended as a bit of fun as well as a simple exercise in object modelling so hopefully it won't offend anyone!
This task is intended as a bit of fun as well as a simple exercise in object modelling so hopefully it won't offend anyone!
<br><br>
<br><br>
=={{header|Phix}}==
{{trans|Wren}}
Nowt fancy here, but at least I made some notes as I was translating things:<br>
Fields are private by default and need to be made explicitly public, whereas methods
are the other way round and need to be made explicitly private when that is wanted.
Phix classes don't really play nice with functions like apply and filter, hence the need
for several little shims (new_lady/lady_names/sailor_love). There is no equivalent to the
implicit "toString", and no plans for one, though you could easily write an explicit one.
The "Lady lady = ladies[i]; lady.name" programming style is generally preferred: trying to
use say "ladies[i].name" simply will not work, instead "class x = ladies[i]; x.name" is
the correct way to write generic class code in Phix, should you genuinely need that.
No attempt has even been started on transpilation of class based code to JavaScript.
Booleans in Phix are just integers, and need to be printed with %t rather than %s.
Of course all this is open source, yada-yada-ya.
<!--<lang Phix>(phixonline)-->
<span style="color: #008080;">without</span> <span style="color: #008080;">javascript_semantics</span>
<span style="color: #008080;">include</span> <span style="color: #000000;">structs</span><span style="color: #0000FF;">.</span><span style="color: #000000;">e</span>
<span style="color: #008080;">function</span> <span style="color: #000000;">digital_root</span><span style="color: #0000FF;">(</span><span style="color: #004080;">integer</span> <span style="color: #000000;">n</span><span style="color: #0000FF;">)</span>
<span style="color: #7060A8;">assert</span><span style="color: #0000FF;">(</span><span style="color: #000000;">n</span><span style="color: #0000FF;">>=</span><span style="color: #000000;">0</span><span style="color: #0000FF;">)</span>
<span style="color: #008080;">while</span> <span style="color: #000000;">n</span><span style="color: #0000FF;">></span><span style="color: #000000;">9</span> <span style="color: #008080;">do</span>
<span style="color: #004080;">integer</span> <span style="color: #000000;">tot</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">0</span>
<span style="color: #008080;">while</span> <span style="color: #000000;">n</span><span style="color: #0000FF;">></span><span style="color: #000000;">0</span> <span style="color: #008080;">do</span>
<span style="color: #000000;">tot</span> <span style="color: #0000FF;">+=</span> <span style="color: #7060A8;">remainder</span><span style="color: #0000FF;">(</span><span style="color: #000000;">n</span><span style="color: #0000FF;">,</span><span style="color: #000000;">10</span><span style="color: #0000FF;">)</span>
<span style="color: #000000;">n</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">floor</span><span style="color: #0000FF;">(</span><span style="color: #000000;">n</span><span style="color: #0000FF;">/</span><span style="color: #000000;">10</span><span style="color: #0000FF;">)</span>
<span style="color: #008080;">end</span> <span style="color: #008080;">while</span>
<span style="color: #000000;">n</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">tot</span>
<span style="color: #008080;">end</span> <span style="color: #008080;">while</span>
<span style="color: #008080;">return</span> <span style="color: #000000;">n</span>
<span style="color: #008080;">end</span> <span style="color: #008080;">function</span>
<span style="color: #008080;">class</span> <span style="color: #000000;">Lady</span>
<span style="color: #008080;">public</span> <span style="color: #004080;">string</span> <span style="color: #000000;">name</span>
<span style="color: #008080;">function</span> <span style="color: #000000;">lovable</span><span style="color: #0000FF;">()</span>
<span style="color: #008080;">return</span> <span style="color: #7060A8;">odd</span><span style="color: #0000FF;">(</span><span style="color: #7060A8;">sum</span><span style="color: #0000FF;">(</span><span style="color: #000000;">name</span><span style="color: #0000FF;">))</span>
<span style="color: #008080;">end</span> <span style="color: #008080;">function</span>
<span style="color: #008080;">function</span> <span style="color: #000000;">love</span><span style="color: #0000FF;">(</span><span style="color: #008080;">class</span> <span style="color: #000000;">s</span><span style="color: #0000FF;">)</span>
<span style="color: #008080;">if</span> <span style="color: #000000;">get_struct_name</span><span style="color: #0000FF;">(</span><span style="color: #000000;">s</span><span style="color: #0000FF;">)!=</span><span style="color: #008000;">"Sailor"</span> <span style="color: #008080;">then</span> <span style="color: #008080;">return</span> <span style="color: #004600;">null</span> <span style="color: #008080;">end</span> <span style="color: #008080;">if</span> <span style="color: #000080;font-style:italic;">// indeterminate</span>
<span style="color: #008080;">return</span> <span style="color: #000000;">digital_root</span><span style="color: #0000FF;">(</span><span style="color: #7060A8;">sum</span><span style="color: #0000FF;">(</span><span style="color: #000000;">name</span><span style="color: #0000FF;">))</span> <span style="color: #0000FF;">></span> <span style="color: #000000;">4</span>
<span style="color: #008080;">end</span> <span style="color: #008080;">function</span>
<span style="color: #008080;">end</span> <span style="color: #008080;">class</span>
<span style="color: #008080;">function</span> <span style="color: #000000;">new_lady</span><span style="color: #0000FF;">(</span><span style="color: #004080;">string</span> <span style="color: #000000;">name</span><span style="color: #0000FF;">)</span>
<span style="color: #008080;">return</span> <span style="color: #7060A8;">new</span><span style="color: #0000FF;">(</span><span style="color: #000000;">Lady</span><span style="color: #0000FF;">,{</span><span style="color: #000000;">name</span><span style="color: #0000FF;">})</span>
<span style="color: #008080;">end</span> <span style="color: #008080;">function</span>
<span style="color: #008080;">function</span> <span style="color: #000000;">lady_names</span><span style="color: #0000FF;">(</span><span style="color: #004080;">sequence</span> <span style="color: #000000;">ladies</span><span style="color: #0000FF;">)</span>
<span style="color: #004080;">sequence</span> <span style="color: #000000;">res</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">repeat</span><span style="color: #0000FF;">(</span><span style="color: #000000;">0</span><span style="color: #0000FF;">,</span><span style="color: #7060A8;">length</span><span style="color: #0000FF;">(</span><span style="color: #000000;">ladies</span><span style="color: #0000FF;">))</span>
<span style="color: #008080;">for</span> <span style="color: #000000;">i</span><span style="color: #0000FF;">=</span><span style="color: #000000;">1</span> <span style="color: #008080;">to</span> <span style="color: #7060A8;">length</span><span style="color: #0000FF;">(</span><span style="color: #000000;">res</span><span style="color: #0000FF;">)</span> <span style="color: #008080;">do</span>
<span style="color: #000000;">Lady</span> <span style="color: #000000;">lady</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">ladies</span><span style="color: #0000FF;">[</span><span style="color: #000000;">i</span><span style="color: #0000FF;">]</span>
<span style="color: #000000;">res</span><span style="color: #0000FF;">[</span><span style="color: #000000;">i</span><span style="color: #0000FF;">]</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">lady</span><span style="color: #0000FF;">.</span><span style="color: #000000;">name</span>
<span style="color: #008080;">end</span> <span style="color: #008080;">for</span>
<span style="color: #008080;">return</span> <span style="color: #7060A8;">join</span><span style="color: #0000FF;">(</span><span style="color: #000000;">res</span><span style="color: #0000FF;">,</span><span style="color: #008000;">", "</span><span style="color: #0000FF;">)</span>
<span style="color: #008080;">end</span> <span style="color: #008080;">function</span>
<span style="color: #008080;">class</span> <span style="color: #000000;">Sailor</span>
<span style="color: #008080;">public</span> <span style="color: #004080;">string</span> <span style="color: #000000;">name</span>
<span style="color: #008080;">function</span> <span style="color: #000000;">love</span><span style="color: #0000FF;">(</span><span style="color: #000000;">Lady</span> <span style="color: #000000;">l</span><span style="color: #0000FF;">)</span>
<span style="color: #008080;">if</span> <span style="color: #000000;">get_struct_name</span><span style="color: #0000FF;">(</span><span style="color: #000000;">l</span><span style="color: #0000FF;">)!=</span><span style="color: #008000;">"Lady"</span> <span style="color: #008080;">then</span> <span style="color: #008080;">return</span> <span style="color: #004600;">null</span> <span style="color: #008080;">end</span> <span style="color: #008080;">if</span> <span style="color: #000080;font-style:italic;">// indeterminate</span>
<span style="color: #008080;">return</span> <span style="color: #000000;">l</span><span style="color: #0000FF;">.</span><span style="color: #000000;">lovable</span><span style="color: #0000FF;">()</span>
<span style="color: #008080;">end</span> <span style="color: #008080;">function</span>
<span style="color: #008080;">end</span> <span style="color: #008080;">class</span>
<span style="color: #008080;">constant</span> <span style="color: #000000;">names</span> <span style="color: #0000FF;">=</span> <span style="color: #0000FF;">{</span><span style="color: #008000;">"Ada"</span><span style="color: #0000FF;">,</span> <span style="color: #008000;">"Crystal"</span><span style="color: #0000FF;">,</span> <span style="color: #008000;">"Elena"</span><span style="color: #0000FF;">,</span> <span style="color: #008000;">"Euphoria"</span><span style="color: #0000FF;">,</span> <span style="color: #008000;">"Janet"</span><span style="color: #0000FF;">,</span> <span style="color: #008000;">"Julia"</span><span style="color: #0000FF;">,</span> <span style="color: #008000;">"Lily"</span><span style="color: #0000FF;">,</span> <span style="color: #008000;">"Miranda"</span><span style="color: #0000FF;">,</span> <span style="color: #008000;">"Perl"</span><span style="color: #0000FF;">,</span> <span style="color: #008000;">"Ruby"</span><span style="color: #0000FF;">},</span>
<span style="color: #000000;">ladies</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">apply</span><span style="color: #0000FF;">(</span><span style="color: #000000;">names</span><span style="color: #0000FF;">,</span><span style="color: #000000;">new_lady</span><span style="color: #0000FF;">)</span>
<span style="color: #000000;">Sailor</span> <span style="color: #000000;">sailor</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">new</span><span style="color: #0000FF;">({</span><span style="color: #008000;">"Pascal"</span><span style="color: #0000FF;">})</span>
<span style="color: #004080;">sequence</span> <span style="color: #000000;">eligibles</span> <span style="color: #0000FF;">=</span> <span style="color: #0000FF;">{}</span>
<span style="color: #008080;">function</span> <span style="color: #000000;">sailor_love</span><span style="color: #0000FF;">(</span><span style="color: #000000;">Lady</span> <span style="color: #000000;">lady</span><span style="color: #0000FF;">)</span>
<span style="color: #008080;">return</span> <span style="color: #000000;">sailor</span><span style="color: #0000FF;">.</span><span style="color: #000000;">love</span><span style="color: #0000FF;">(</span><span style="color: #000000;">lady</span><span style="color: #0000FF;">)</span>
<span style="color: #008080;">end</span> <span style="color: #008080;">function</span>
<span style="color: #7060A8;">printf</span><span style="color: #0000FF;">(</span><span style="color: #000000;">1</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"%-10s %-12s %s\n"</span><span style="color: #0000FF;">,</span> <span style="color: #0000FF;">{</span><span style="color: #008000;">"lady"</span><span style="color: #0000FF;">,</span> <span style="color: #008000;">"loves sailor"</span><span style="color: #0000FF;">,</span> <span style="color: #008000;">"lovable"</span><span style="color: #0000FF;">})</span>
<span style="color: #7060A8;">printf</span><span style="color: #0000FF;">(</span><span style="color: #000000;">1</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"%-10s %-12s %s\n"</span><span style="color: #0000FF;">,</span> <span style="color: #0000FF;">{</span><span style="color: #008000;">"----"</span><span style="color: #0000FF;">,</span> <span style="color: #008000;">"------------"</span><span style="color: #0000FF;">,</span> <span style="color: #008000;">"-------"</span><span style="color: #0000FF;">})</span>
<span style="color: #008080;">for</span> <span style="color: #000000;">i</span><span style="color: #0000FF;">=</span><span style="color: #000000;">1</span> <span style="color: #008080;">to</span> <span style="color: #7060A8;">length</span><span style="color: #0000FF;">(</span><span style="color: #000000;">ladies</span><span style="color: #0000FF;">)</span> <span style="color: #008080;">do</span>
<span style="color: #000000;">Lady</span> <span style="color: #000000;">lady</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">ladies</span><span style="color: #0000FF;">[</span><span style="color: #000000;">i</span><span style="color: #0000FF;">]</span>
<span style="color: #004080;">bool</span> <span style="color: #000000;">lovesSailor</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">lady</span><span style="color: #0000FF;">.</span><span style="color: #000000;">love</span><span style="color: #0000FF;">(</span><span style="color: #000000;">sailor</span><span style="color: #0000FF;">)</span>
<span style="color: #008080;">if</span> <span style="color: #000000;">lovesSailor</span> <span style="color: #008080;">then</span> <span style="color: #000000;">eligibles</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">append</span><span style="color: #0000FF;">(</span><span style="color: #000000;">eligibles</span><span style="color: #0000FF;">,</span><span style="color: #000000;">lady</span><span style="color: #0000FF;">)</span> <span style="color: #008080;">end</span> <span style="color: #008080;">if</span>
<span style="color: #7060A8;">printf</span><span style="color: #0000FF;">(</span><span style="color: #000000;">1</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"%-10s %-12t %t\n"</span><span style="color: #0000FF;">,</span> <span style="color: #0000FF;">{</span><span style="color: #000000;">lady</span><span style="color: #0000FF;">.</span><span style="color: #000000;">name</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">lovesSailor</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">lady</span><span style="color: #0000FF;">.</span><span style="color: #000000;">lovable</span><span style="color: #0000FF;">()})</span>
<span style="color: #008080;">end</span> <span style="color: #008080;">for</span>
<span style="color: #7060A8;">printf</span><span style="color: #0000FF;">(</span><span style="color: #000000;">1</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"\nBased on this analysis:"</span><span style="color: #0000FF;">)</span>
<span style="color: #7060A8;">printf</span><span style="color: #0000FF;">(</span><span style="color: #000000;">1</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"\nThe dating agency should suggest the following ladies:\n"</span><span style="color: #0000FF;">)</span>
<span style="color: #7060A8;">printf</span><span style="color: #0000FF;">(</span><span style="color: #000000;">1</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"%s\n"</span><span style="color: #0000FF;">,</span><span style="color: #000000;">lady_names</span><span style="color: #0000FF;">(</span><span style="color: #000000;">eligibles</span><span style="color: #0000FF;">))</span>
<span style="color: #7060A8;">printf</span><span style="color: #0000FF;">(</span><span style="color: #000000;">1</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"\nand %s should offer to date these ones:\n"</span><span style="color: #0000FF;">,{</span><span style="color: #000000;">sailor</span><span style="color: #0000FF;">.</span><span style="color: #000000;">name</span><span style="color: #0000FF;">})</span>
<span style="color: #7060A8;">printf</span><span style="color: #0000FF;">(</span><span style="color: #000000;">1</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"%s\n"</span><span style="color: #0000FF;">,</span><span style="color: #000000;">lady_names</span><span style="color: #0000FF;">(</span><span style="color: #7060A8;">filter</span><span style="color: #0000FF;">(</span><span style="color: #000000;">eligibles</span><span style="color: #0000FF;">,</span><span style="color: #000000;">sailor_love</span><span style="color: #0000FF;">)))</span>
<!--</lang>-->
{{out}}
<pre>
lady loves sailor lovable
---- ------------ -------
Ada false false
Crystal true false
Elena true true
Euphoria false true
Janet false false
Julia true true
Lily true false
Miranda true false
Perl true true
Ruby false false

Based on this analysis:
The dating agency should suggest the following ladies:
Crystal, Elena, Julia, Lily, Miranda, Perl

and Pascal should offer to date these ones:
Elena, Julia, Perl
</pre>

=={{header|Wren}}==
=={{header|Wren}}==
{{libheader|Wren-math}}
{{libheader|Wren-math}}

Revision as of 14:58, 10 November 2021

Dating agency is a draft programming task. It is not yet considered ready to be promoted as a complete task, for reasons that should be found in its talk page.
Scenario

A sailor signs up to a dating agency hoping to find a suitable mate.

The dating agency has 10 ladies on its books who may be suitable and uses the algorithm "all the nice girls love a sailor" to decide which ones to put forward for the sailor's consideration.

The sailor uses a different algorithm ("lady is lovable") to decide which ladies to actually date.

Task

Model this scenario in your language.

Give the sailor and ladies some names.

Use some arbitrary method based on the ladies' names to determine whether they're nice and/or lovable. For preference, choose a method where the outcomes are (more or less) equally likely.

Hence, determine which ladies the dating agency should suggest and which of these the sailor should offer to date.

Note

This task is intended as a bit of fun as well as a simple exercise in object modelling so hopefully it won't offend anyone!

Phix

Translation of: Wren

Nowt fancy here, but at least I made some notes as I was translating things:
Fields are private by default and need to be made explicitly public, whereas methods are the other way round and need to be made explicitly private when that is wanted. Phix classes don't really play nice with functions like apply and filter, hence the need for several little shims (new_lady/lady_names/sailor_love). There is no equivalent to the implicit "toString", and no plans for one, though you could easily write an explicit one. The "Lady lady = ladies[i]; lady.name" programming style is generally preferred: trying to use say "ladies[i].name" simply will not work, instead "class x = ladies[i]; x.name" is the correct way to write generic class code in Phix, should you genuinely need that. No attempt has even been started on transpilation of class based code to JavaScript. Booleans in Phix are just integers, and need to be printed with %t rather than %s. Of course all this is open source, yada-yada-ya.

without javascript_semantics
include structs.e

function digital_root(integer n)
    assert(n>=0)
    while n>9 do
        integer tot = 0
        while n>0 do
            tot += remainder(n,10)
            n = floor(n/10)
        end while
        n = tot
    end while
    return n
end function

class Lady 
    public string name
    function lovable()
        return odd(sum(name))
    end function
    function love(class s)
        if get_struct_name(s)!="Sailor" then return null end if // indeterminate
        return digital_root(sum(name)) > 4
    end function
end class

function new_lady(string name)
    return new(Lady,{name})
end function

function lady_names(sequence ladies)
    sequence res = repeat(0,length(ladies))
    for i=1 to length(res) do
        Lady lady = ladies[i]
        res[i] = lady.name
    end for
    return join(res,", ")
end function

class Sailor
    public string name
    function love(Lady l)
        if get_struct_name(l)!="Lady" then return null end if // indeterminate
        return l.lovable()
    end function
end class

constant names = {"Ada", "Crystal", "Elena", "Euphoria", "Janet", "Julia", "Lily", "Miranda", "Perl", "Ruby"},
         ladies = apply(names,new_lady)
Sailor sailor = new({"Pascal"})
sequence eligibles = {}

function sailor_love(Lady lady)
    return sailor.love(lady)
end function

printf(1,"%-10s  %-12s  %s\n", {"lady", "loves sailor", "lovable"})
printf(1,"%-10s  %-12s  %s\n", {"----", "------------", "-------"})
for i=1 to length(ladies) do
    Lady lady = ladies[i]
    bool lovesSailor = lady.love(sailor)
    if lovesSailor then eligibles = append(eligibles,lady) end if
    printf(1,"%-10s  %-12t  %t\n", {lady.name, lovesSailor, lady.lovable()})
end for
printf(1,"\nBased on this analysis:")
printf(1,"\nThe dating agency should suggest the following ladies:\n")
printf(1,"%s\n",lady_names(eligibles))
printf(1,"\nand %s should offer to date these ones:\n",{sailor.name})
printf(1,"%s\n",lady_names(filter(eligibles,sailor_love)))
Output:
lady        loves sailor  lovable
----        ------------  -------
Ada         false         false
Crystal     true          false
Elena       true          true
Euphoria    false         true
Janet       false         false
Julia       true          true
Lily        true          false
Miranda     true          false
Perl        true          true
Ruby        false         false

Based on this analysis:
The dating agency should suggest the following ladies:
Crystal, Elena, Julia, Lily, Miranda, Perl

and Pascal should offer to date these ones:
Elena, Julia, Perl

Wren

Library: Wren-math
Library: Wren-fmt

<lang ecmascript>import "./math" for Int, Nums import "./fmt" for Fmt

class Lady {

   construct new(name) {
       _name = name
   }
   name { _name }
   // Sum the ASCII values of the characters in the ladies' names and find the digital root.
   // If it's more than 4, they're 'nice'.
   nice {
       var sum = Nums.sum(_name.bytes)
       return Int.digitalRoot(sum)[0] > 4
   }
   // Sum the ASCII values of the characters in the ladies' names.
   // If it's odd, they're 'lovable'.
   lovable {
       var sum = Nums.sum(_name.bytes)
       return sum % 2 == 1
   }
   love(s) {
       if (!(s is Sailor)) return null // indeterminate
       return nice
   }
   toString { _name }

}

class Sailor {

   construct new(name) {
       _name = name
   }
   name { _name }
   love(l) {
       if (!(l is Lady)) return null // indeterminate
       return l.lovable
   }
   toString { _name }

}

var names = ["Ada", "Crystal", "Elena", "Euphoria", "Janet", "Julia", "Lily", "Miranda", "Perl", "Ruby"] var ladies = names.map { |n| Lady.new(n) }.toList var sailor = Sailor.new("Pascal") var eligibles = [] var format = "$-10s $-12s $s" Fmt.print(format, "lady", "loves sailor", "lovable") Fmt.print(format, "----", "------------", "-------") for (lady in ladies) {

   var lovesSailor = lady.love(sailor)
   if (lovesSailor) eligibles.add(lady)
   Fmt.print(format, lady, lovesSailor, lady.lovable)

} System.print("\nBased on this analysis:") System.print("\nThe dating agency should suggest the following ladies:") System.print(eligibles) System.print("\nand %(sailor) should offer to date these ones:") System.print(eligibles.where { |e| sailor.love(e) }.toList)</lang>

Output:
lady        loves sailor  lovable
----        ------------  -------
Ada         false         false
Crystal     true          false
Elena       true          true
Euphoria    false         true
Janet       false         false
Julia       true          true
Lily        true          false
Miranda     true          false
Perl        true          true
Ruby        false         false

Based on this analysis:

The dating agency should suggest the following ladies:
[Crystal, Elena, Julia, Lily, Miranda, Perl]

and Pascal should offer to date these ones:
[Elena, Julia, Perl]