Dating agency: Difference between revisions
(→{{header|Wren}}: Tweak.) |
|||
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
- 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
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
<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]