Erlang - функция, которая возвращает количество равных трех аргументов. - PullRequest
0 голосов
/ 24 января 2019

Я только начинаю с erlang, и у меня есть задача этого класса, чтобы создать функцию, которая возвращает количество из трех равных аргументов.Пример:

  • countDuplicates (1,2,3) = 0
  • countDuplicates (1,2,2) = 2
  • countDuplicates (2,2,2) = 3

Мое решение для этого:

- module(equals).
- export([Duplicates/3]).


Duplicates(X,Y,Z)-> 
   List=[X,Y,Z],
   A=length(List),

   List2=lists:usort(List),
   B=length(List2),


if
   A-B==0 ->
      0;
   true ->
   A-B+1   
end.

Код принимает аргументы в виде списка, затем создает еще один список2, удаляя любые дубликаты, используя usort.

  • A = длина списка
  • B = длина списка2

A-B + 1 = количество дубликатов.Если AB равен 0, тогда оставайтесь 0.

Это мой новый способ решения этой проблемы.Какой самый элегантный способ сделать это?

Ответы [ 2 ]

0 голосов
/ 25 января 2019

Вы также можете использовать сопоставление с образцом в заголовке функции дубликатов:

-module(my).
-compile(export_all).

duplicates(N, N, N) -> 3;
duplicates(N, N, _) -> 2;
duplicates(N, _, N) -> 2;
duplicates(_, N, N) -> 2;
duplicates(_, _, _) -> 0.

duplicates_test() ->
    0 = duplicates(1,2,3),
    2 = duplicates(1,2,2), 
    2 = duplicates(2,2,1),
    2 = duplicates(2,1,2),
    3 = duplicates(2,2,2),
    all_tests_passed.

В оболочке:

~/erlang_programs$ erl
Erlang/OTP 20 [erts-9.3] [source] [64-bit] [smp:4:4] [ds:4:4:10] [async-threads:10] [hipe] [kernel-poll:false]
Eshell V9.3  (abort with ^G)

1> c(my).               
my.erl:2: Warning: export_all flag enabled - all functions will be exported
{ok,my}

2> my:duplicates_test().
all_tests_passed

3> 

Это тип определения функции, который известен erlangдля.

0 голосов
/ 24 января 2019

Мой путь новичка будет

countDuplicates(X, Y, Z) ->
    if
        X == Y andalso Y == Z ->
            3;
        X /= Y andalso Y /= Z andalso Z /= X ->
            0;
        true -> 2
    end.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...