Скажите моим друзьям, к какому «клубу запятых» они принадлежат

16

Вдохновленные сценами Силиконовой долины "клуб с тремя запятыми", такими как эта , в этом вызове вы расскажете десяти людям о "клубе запятых", к которому они принадлежат.

Если вы не знакомы с термином «клуб запятых», позвольте мне объяснить: вы находитесь в клубе с запятыми, если ваши деньги находятся в диапазоне от 1000,00 до 999 999,99 долларов США; вы находитесь в клубе с двумя запятыми, если он находится в диапазоне от 1 000 000,00 до 999 999 999,99 долларов США; эти "клубы" повторяются через клуб с тремя запятыми, поскольку ни один человек на Земле (AFAIK) не владеет более чем одним триллионом долларов США (японская иена очень быстро станет другой историей). Таким образом, число запятых на вашем банковском счете, в соответствии со стандартами обозначений, наиболее распространенными в Соединенных Штатах и ​​Великобритании, обозначает клуб запятых, к которому вы принадлежите. Те же правила «запятых» применяются к отрицательным числам (хотя вы не хотели бы быть в клубе с отрицательными запятыми): отрицательные суммы в включающем диапазоне [-0,01, -999.

Тестовые случаи

Friend    Amount
John      100000
Jamie     0.05
Kylie     1549001.10
Laura     999999999.99
Russ      986000000
Karla     1
Reid      99.99
Mark      999.99
Manson    1000.01
Lonnie    999999999999.00
Nelly     -123.45

Правильные ответы:

John is in the 1-comma club.
Jamie is in the 0-comma club.
Kylie is in the 2-comma club.
Laura is in the 2-comma club.
Russ is in the 2-comma club.
Karla is in the 0-comma club.
Reid is in the 0-comma club.
Mark is in the 0-comma club.
Manson is in the 1-comma club.
Lonnie is in the 3-comma club.
Nelly is in the 0-comma club.

Какие бы настройки массива вам ни понадобились, чтобы получить friendsмассив, amountsмассив не учитывается при подсчете очков. Так что для Python следующий код не считается:

f = ['John', 'Jamie', 'Kylie', 'Laura', 'Russ', 'Karla', 'Reid', 'Mark', 'Manson', 'Lonnie']
a = ['100000', '0.05', '1549001.10', '999999999.99', '986000000', '1', '99.99', '999.99', '1000.01', '999999999999.00']

Изменить: Пожалуйста, смотрите пересмотренные тестовые случаи

Я удалил фактические строковые запятые из тестовых случаев, чтобы сделать все немного сложнее, а не просто считать запятые.

BlackSite
источник
2
Я не думаю, что вы сделали формат вывода очень четким. Является ли что-то вроде "Name number,Name number,..."приемлемым?
FryAmTheEggman
2
Записи в f гарантированно будут положительными или -$1,234.56также будут в клубе с 1 запятой?
Джонатан Аллан
2
@not_a_robot Не могли бы вы ответить на комментарий Фрая? Достаточно ли выводить пары имени и номера в любом формате?
Мартин Эндер
1
@FryAmTheEggman Нет, вывод должен быть в формате"<name> is in the <number of commas>-club."
blacksite
1
Контрольные примеры не являются спец. И даже если бы они были, нет никакого теста, покрывающего проблему больших негативов, поднятых Джонатаном Алланом выше.
Питер Тейлор

Ответы:

10

JavaScript (ES6), 80 байт

a=>a.map(([s,n])=>s+` is in the ${n.toFixed(n<0?3:4).length/3-2|0}-comma club.`)

Принимает массив массивов [friend, amount] и возвращает массив "friend in n-comma club". строки. Работает, добавляя дополнительные конечные нули, так что длина составляет 6-8 для клуба с 0 запятыми, 9-11 для клуба с 1 запятой, 12-15 для клуба с 2 запятыми и т. Д.

https://jsfiddle.net/cau40vmk/1/

Нил
источник
Я не думаю, что это работает для отрицательных чисел. Например, это поместило бы Нелли (-123,45) в клуб с 1 запятой. Я бы предложил короче Math.log10(n*n)/6|0.
Арно
@Arnauld Ах да, я забыл обрезать |0до нуля, так что это дает правильный ответ для Джейми.
Нил
8

PostgreSQL, 61 байт

SELECT f||' is in the '||div(log(@a),3)||'-comma club.'FROM p

@xявляется абсолютным значением x, log(x)является логарифмом по основанию-10 и div(y, x)вычисляет целочисленное отношение y / x.


Настроить:

CREATE TEMP TABLE p AS
SELECT * FROM (VALUES
    ('John', 100000),
    ('Jamie', 0.05),
    ('Kylie', 1549001.10),
    ('Laura', 999999999.99),
    ('Russ', 986000000),
    ('Karla', 1),
    ('Reid', 99.99),
    ('Mark', 999.99),
    ('Manson', 1000.01),
    ('Lonnie', 999999999999.00),
    ('Nelly', -123.45)
) AS p (f, a)

Выход:

            ?column?            
--------------------------------
 John is in the 1-comma club.
 Jamie is in the 0-comma club.
 Kylie is in the 2-comma club.
 Laura is in the 2-comma club.
 Russ is in the 2-comma club.
 Karla is in the 0-comma club.
 Reid is in the 0-comma club.
 Mark is in the 0-comma club.
 Manson is in the 1-comma club.
 Lonnie is in the 3-comma club.
 Nelly is in the 0-comma club.
(11 rows)
kennytm
источник
Приятно видеть конкурентный ответ SQL - молодец!
Тоби Спейт
6

Желе , 34  32 байта

AḞbȷL’⁶;“£ṙƬs⁾`¬ụṂ“¢<ỴȦ8£l»jµ€⁹żY

Двоичная ссылка (функция), которая принимает список банковских балансов в виде чисел (десятичных / целых) и список имен в виде строк и возвращает список строк.

Попробуйте онлайн! - нижний колонтитулçYпросто вызывает функцию и объединяет результирующий список с переводами строки, чтобы он имел хороший результат при запуске в качестве полной программы.

Как?

AḞbȷL’⁶;“£ṙƬs⁾`¬ụṂ“¢<ỴȦ8£l»jµ€⁹żY - Main link: bankBalances, names
                             €    - for each bankBalance:
A                                 - absolute value (treat negatives and positives the same)
 Ḟ                                - floor (get rid of any pennies)
  bȷ                              - convert to base 1000
    L                             - length (number of digits in base 1000)
     ’                            - decrement by one
      ⁶;                          - concatenate a space with that   ...because -------.
        “         “       »       - compressed list of strings:                       ↓
         £ṙƬs⁾`¬ụṂ                -     " is in the"  ← cannot compress a trailing space :(
                   ¢<ỴȦ8£l        -     "-comma club."
                           j      - join that list of strings with the "number plus space"
                            µ     - monadic chain separation (call that result L)
                              ⁹   - right argument (names)
                               ż  - zip with L
Джонатан Аллан
источник
4

PHP, 76 74 байта

// data as associative array
$d=[Poorman=>-1234,John=>100000,Jamie=>0.05,Kylie=>1549001.10,Laura=>999999999.99,Russ=>1000000000,Karla=>1,Reid=>99.99,Mark=>999.99,Manson=>1000.01,Lonnie=>999999999999.00];
// code
foreach($d as$n=>$a)printf("$n is in the %d-comma club.
",log($a*$a,1e6));

К счастью, мне не нужно приводить к int (как это было бы в C); PHP делает это неявно для %d.

Titus
источник
Гы! Я первый здесь, чтобы вычислить вместо подсчета символов?
Тит
4

Mathematica (86 байт)

Установка (с именами в виде строк, деньги в виде чисел):

n = {"John", "Jamie", "Kylie", "Laura", "Russ", "Karla", "Reid", "Mark", "Manson", "Lonnie", "Nelly"};
m = {100000, 0.05, 1549001.10, 999999999.99, 1000000000, 1, 99.99, 999.99, 1000.01, 999999999999.00, -123.45}

Попытка:

MapThread[#~~" is in the "~~ToString@Max[Floor@Log[10^3,#2],0]~~"-comma club."&,{n,m}]

Все строковые функции Mathematica включают в себя «String», поэтому я думаю, что журналы короче. Max[...,0]Должно иметь дело с числами досадной отрицательными или отрицательной бесконечностью для людей , которые имеют между -1 и 1 долларами. Журнал отрицательного числа включает в себя мнимые вещи, но Mathematica услужливо игнорирует это при взятии Floor!

Не дерево
источник
4

Japt , 36 байт

Это принимает в качестве суммы в качестве первого ввода, имя в качестве второго.

V+`   e {w0 x4 l /3-2|0}-¬mµ club

объяснение

V+`   e {w0 x4 l /3-2|0}-¬mµ club
V+                                   // Second input +
  `                                  // compressed string:
      e                              // " is in the " 
        {              }             // Insert here:
         w0                          //   The larger of 0 and the first input
            x4                       //   Rounded to the 4th decimal
               l                     //   Length
                        -¬mµ club    // "-comma club"
                                     // A closing backtick is auto-inserted at the end of the program

Japt использует библиотеку shoco для сжатия строк.

Вдохновленный @ Нила решения .

Сохранено 7 байт благодаря @ETHproductions

Попробуйте онлайн!

Оливер
источник
1
Я думаю, что вы можете просто сделать Vw0 x4 l /3-2|0в средней части, сохранив 6 байтов :-)
ETHproductions
1
Я думаю, что вы можете сохранить байт, взяв входные данные в обратном порядке:V+`...{w0...
ETHproductions
3

MATL, 50 48 43 байта

`j' is in the 'i|kVn3/XkqV'-comma club'&hDT

Попробуйте это на MATL Online

объяснение

`                   % Do...While loop
  j                 % Explicitly grab the next input as a string
  ' is in the the ' % Push this string literal to the stack
  i                 % Grab the next input as a number
  |                 % Compute the absolute value
  k                 % Round towards zero
  V                 % Convert to a string
  n3/Xk             % Divide the length of the string by 3 and round up
  q                 % Subtract one
  V                 % Convert to a string
  '-comma club'     % Push this string literal to the stack
  &h                % Horizontally concatenate the entire stack
  D                 % Display the resulting string
  T                 % Push TRUE to the stack, causing an infinite loop which automatically
                    % terminates when we run out of inputs
                    % Implicit end of do...while loop
Suever
источник
3

R, 68 байт

Настройка:

f <- c('John', 'Jamie', 'Kylie', 'Laura', 'Russ', 'Karla', 'Reid', 'Mark', 'Manson', 'Lonnie', 'Nelly')
a <- c(100000, 0.05, 1549001.10, 999999999.99, 986000000, 1, 99.99, 999.99, 1000.01, 999999999999.00, -123.45)

Решение:

cat(paste0(f, " is in the ",floor(log10(abs(a))/3)),"-comma club.\n"))

Возьмите из базы 10 логарифм абсолютной стоимости счета, округлите вниз и напечатайте с именами.

Я не уверен, что он может быть меньше, если aбудет символьный вектор ...

Джо
источник
1
А как насчет дела Нелли, у которого -123,45 доллара? Этот log10вызов произведет NaNs для негативов. Похоже, log10(abs(a))будет работать.
blacksite
Ой, вы правы, пример выше не включал Нелли. И я неправильно понял спецификацию ... Я понял, что отрицательным значением должно быть 0 запятая.
Джо
Вместо abs(x)использования используйте pmax(a,1)- это займет что-то меньше 1 и сделает его 1, давая хорошие результаты для отрицательных чисел. И вместо floor(log10(...)/3)тебя можно использовать log10(...)%/%3. Я думаю, что это уменьшает до 66 байт (и исправляет негативы).
Грегор
1
Также стоит отметить, что целые 7 байтов - это cat()и \n... печать вектора со строками в нем на консоли может считаться достаточно хорошей (* ahem *, как в ответах Python).
Грегор
После 3. Это лишние скобки. Кроме того, выводится -1 клуб Джейми. Использование pmax (a, 1) исправляет это.
BLT
3

JavaScript, 59 байт

Сохранено 3 байта благодаря @ETHproductions

Сохранено 2 байта благодаря @Cyoce

n=>m=>n+` is in the ${m>1?Math.log10(m)/3|0:0}-comma club.`

демонстрация

Оливер
источник
1
Сохраните байт с помощью, `${}`и вы можете использовать функцию n=>m=>...вместо(n,m)=>...
Cyoce
2

Vim, 72 байта

:%s;\v +\-=(\d+).*;\=' is in the '.(len(submatch(1))-1)/3.' comma club'

Каким-то образом я должен показать, что есть конечный результат, но не уверен, как. Это просто основной ответ регулярного выражения, который, я уверен, может быть побежден любым языком регулярных выражений. Я бы использовал V, но я думаю, что команды замены в V используют/ по умолчанию в качестве разделителя, и я не мог понять, как заставить его не жаловаться на разделение.

Принимает ввод в качестве таблицы OP и возвращает значения в виде таблицы, но с финансовой информацией, замененной на «находится в клубе запятых X»

Попробуйте онлайн!

nmjcman101
источник
Я не думаю, что что-то \-=добавляет. Кроме того, если вы удалите лишние пробелы в своем входе и также измените регулярное выражение, \v (\d*).*;вы можете сохранить 4 байта
DJMcMayhem
2

05AB1E , 32 байта

Äï€g3/î<“-comma†Ú“«“€ˆ€†€€ “ì‚ø»

Попробуйте онлайн!

объяснение

Ä                                 # absolute value of input
 ï                                # convert to int
  €g                              # length of each
    3/                            # divided by 3
      î                           # round up
       <                          # decrement
        “-comma†Ú“«               # append string "-comma club" to each number
                   “€ˆ€†€€ “ì     # prepend string "is in the " to each number
                             ‚    # pair with second input
                              ø   # zip
                               »  # join by spaces and newlines
Emigna
источник
2

Python 2, 69 байт

Настройте наши массивы:

n = ['John', 'Jamie', 'Kylie', 'Laura', 'Russ', 'Karla', 'Reid', 'Mark', 'Manson', 'Lonnie']
a = [100000, 0.05, 1549001.10, 999999999.99, 1000000000, 1, 99.99, 999.99, 1000.01, 999999999999.00]

И наша функция может быть:

f=lambda n,a:'%s is in %s comma club'%(n,min(3,(len(str(int(a)))/3)))

Давать нам:

>>> [f(x,y) for x,y in zip(n,a)]
['John is in 2 comma club', 'Jamie is in 0 comma club', 'Kylie is in 2 comma club', 'Laura is in 3 comma club', 'Russ is in 3 comma club', 'Karla is in 0 comma club', 'Reid is in 0 comma club', 'Mark is in 1 comma club', 'Manson is in 1 comma club', 'Lonnie is in 3 comma club']

Если массив должен быть идентичен указанному в вопросе, тогда решение стоит 76 байт:

f=lambda n,a:'%s is in %s comma club'%(n,min(3,(len(str(int(float(a))))/3)))
iwaseatenbyagrue
источник
2

Powershell, 82 байта

$args[0]|%{$_[0]+" is in the "+(('{0:N}'-f$_[1]-split',').Count-1)+"-comma club."}

Предполагая ввод двумерного массива

cc.ps1 @(@("John",100000),@("Jamie",0.05),@("Kylie",1549001.10),@("Laura",999999999.99),@("Russ",986000000),@("Karla",1),@("Reid",99.99),@("Mark",999.99),@("Manson",1000.01),@("Lonnie",999999999999.00),@("Nelly",-123.45))

Выход John is in the 1-comma club. Jamie is in the 0-comma club. Kylie is in the 2-comma club. Laura is in the 2-comma club. Russ is in the 2-comma club. Karla is in the 0-comma club. Reid is in the 0-comma club. Mark is in the 0-comma club. Manson is in the 1-comma club. Lonnie is in the 3-comma club. Nelly is in the 0-comma club.

Tor
источник
2

Haskell, 71 байт

n#a=n++" is in the "++(show.truncate.logBase 1e3.abs$a)++"-comma club."

Определяет оператор '#', который дает правильный ответ. Например:

*Main> "John"#100000
"John is in the 1-comma club."

К сожалению, в Haskell нет компактной log10функции, как во многих других языках, но у нее есть полезная logBaseфункция logBase 1000 0.05, поэтому нам не нужно делить наш ответ на 3. К сожалению, это отрицательное число, поэтому нам нужно использовать дольше truncate, чем floorокруглять его.

Полная программа, включая тестовые случаи:

(#) :: (RealFrac n, Floating n) => [Char] -> n -> [Char]
n#a=n++" is in the "++(show.truncate.logBase 1e3.abs$a)++"-comma club."

testCases = [
 ("John",      100000),
 ("Jamie",     0.05),
 ("Kylie",     1549001.10),
 ("Laura",     999999999.99),
 ("Russ",      986000000),
 ("Karla",     1),
 ("Reid",      99.99),
 ("Mark",      999.99),
 ("Manson",    1000.01),
 ("Lonnie",    999999999999.00),
 ("Nelly",     -123.45)]

main = putStrLn $ unlines $ map (uncurry (#)) testCases

Дает следующие результаты:

John is in the 1-comma club.
Jamie is in the 0-comma club.
Kylie is in the 2-comma club.
Laura is in the 2-comma club.
Russ is in the 2-comma club.
Karla is in the 0-comma club.
Reid is in the 0-comma club.
Mark is in the 0-comma club.
Manson is in the 1-comma club.
Lonnie is in the 3-comma club.
Nelly is in the 0-comma club.
Жюль
источник
1

К, 66 байт

    /n is names and a is amounts
    n
    ("John";"Jamie";"Kylie";"Laura";"Russ";"Karla";"Reid";"Mark";"Manson";"Lonnie")
    a
    ("100000";"0.05";"1549001.10";"999999999.99";"1000000000";,"1";"99.99";"999.99";"1000.01";"999999999999.00")
    /the function
    {x," is in the ",($(#.q.cut[3;*"."\:y])-1)," comma club"}./:+(n;a)
    /output
    ("John is in the 1 comma club";"Jamie is in the 0 comma club";"Kylie is in the 2 comma club";"Laura is in the 2 comma club";"Russ is in the 3 comma club";"Karla is in the 0 comma club";"Reid is in the 0 comma club";"Mark is in the 0 comma club";"Manson is in the 1 comma club";"Lonnie is in the 3 comma club")
Chromozorz
источник
1

Python 2,7 , 89 86 84 байта

for g,b in zip(*input()):print g,'is in the',`(len('%d'%b)+~(b<0))/3`+'-comma club.'

Попробуйте онлайн!

Полная программа, которая принимает кортеж из двух списков - имена в виде строк, банковские балансы в виде чисел - и печатает полученные строки.

Джонатан Аллан
источник
1

C #, 125 байт

(p,n)=>{for(int x=0;x<p.Length;x++)Console.Write(p[x]+" is in the "+(n[x]<1e3?0:n[x]<1e6?1:n[x]<1e9?2:3)+"-comma club.\n");};

Анонимная функция, которая печатает результат в формате ОП.

Полная программа с тестовыми примерами:

using System;

class CommaClub
{
    static void Main()
    {
        Action<string[], double[]> f =
        (p,n)=>{for(int x=0;x<p.Length;x++)Console.Write(p[x]+" is in the "+(n[x]<1e3?0:n[x]<1e6?1:n[x]<1e9?2:3)+"-comma club.\n");};

        // test cases:
        string[] personArr = new[] {"John", "Jamie", "Kylie", "Laura", "Russ", "Karla", "Reid", "Mark", "Manson", "Lonnie", "Nelly"};
        double[] amountArr = new[] {100000, 0.05, 1549001.10, 999999999.99, 1000000000, 1, 99.99, 999.99, 1000.01, 999999999999.00, -123.45};
        f(personArr, amountArr);
    }
}
adrianmp
источник
1

Питон 3 ( 207 159 110 95 86 байт, благодаря @iwaseatenbyagrue)

Немного о настройке:

f = ['John', 'Jamie', 'Kylie', 'Laura', 'Russ', 'Karla', 'Reid', 'Mark', 'Manson', 'Lonnie', 'Nelly']
a = [100000, 0.05, 1549001.10, 999999999.99, 986000000, 1, 99.99, 999.99, 1000.01, 999999999999.00, -123.45]

Моя попытка:

['%s is in the %d-comma club.'%(p,-(-len(str(int(abs(v))))//3)-1) for p,v in zip(f,a)]

Результаты:

['John is in the 1-comma club.', 'Jamie is in the 0-comma club.', 'Kylie is in the 2-comma club.', 'Laura is in the 2-comma club.', 'Russ is in the 2-comma club.', 'Karla is in the 0-comma club.', 'Reid is in the 0-comma club.', 'Mark is in the 0-comma club.', 'Manson is in the 1-comma club.', 'Lonnie is in the 3-comma club.', 'Nelly is in the 0-comma club.']

Редактировать: преобразование всего в абсолютные значения сэкономило мне 15 байтов.

BlackSite
источник
1
Самое главное, это фрагмент кода, как правило, мы разрешаем только функции или полные программы. Что касается игры в гольф, Вы можете удалить много пробелов. Попробуйте: ["%s is in the %d-comma club."%(p,v.count(','))for p,v in zip(f,a)]Кроме того, вы должны включить количество байтов.
Конор О'Брайен
Вы можете сделать print'\n'.join([your array])и на самом деле распечатать вывод.
Elronnd
2
Добро пожаловать на сайт! Отрицательные (например -123.45) отключены на один (так как вы считаете -). Но почему бы не взять список чисел и сохранить (я неправильно истолковал?). Вам нужно было бы добавить операторы импорта, и в нынешнем виде это фрагмент кода, а не программа или функция (как по умолчанию, и изменение их не рекомендуется, если нет веской причины).
Джонатан Аллан
1
Спасибо, @JonathanAllan. В настоящее время я пытаюсь улучшить это, поэтому мне не нужно считать импорт. Я понимаю, что math.ceilфункция Python, вероятно, добавляет немного накладных расходов на мой счет.
Blacksite
2
Вы можете сохранить 9 байтов, заменив (-len(str(abs(v)).split('.')[0])на len(str(int(float(v)))). В вашем тестовом наборе нет отрицательных чисел (в примерах есть одно). Если вы хотите быть законченным, потратьте 5 байтов, len(str(abs(int(float(v)))))что сэкономит вам только 4 байта.
Iwaseatenbyagrue
1

Perl 6, 107 95 байт

for @f {printf "%s is in the %d-comma club.\n",@f[$++],(abs(@a[$++].split(".")[0]).chars-1)/3;}

Не моя гордая работа, дай мне знать, если я забыл какие-нибудь техники игры в гольф. РЕДАКТИРОВАТЬ: -12 байт благодаря @Ven

Ховард Нигорд
источник
почему вокруг ^@f.elems? Кстати, вам это не нужно .elems, for ^@fработает. Вам не нужно называть свой $x, используйте $_вместо этого. И не используйте printf, используйте "{"interpolation"}".
Ven
Я даже не понимаю, зачем тебе это нужно. Почему бы не пойти на for @f? Вы можете использовать $++в качестве индекса, чтобы идти вместе с ним (и индексировать в @a).
Ven
я буду редактировать, как только я на ПК :)
Håvard Nygård
1
@Ven спасибо за новость о $ ++. Спасает меня много неприятностей в моих "реальных" программах. Только что взял Perl 6.
Håvard Nygård
Вы уверены, что интерполяции не сохраняют байты?
Ven
1

Python 2, 87 байт

for n,a in input():print n+' is in the %dd-comma club.'%'{:20,.2f}'.format(a).count(',')

Немного старше (90 байт):

for n,a in input():print n+' is in the '+`'{:20,.2f}'.format(a).count(',')`+'-comma club.'

Вводит в виде списка кортежей (имя, количество).

Я делаю это на своем телефоне в школе, поэтому я проверю это позже.

Даниил
источник
1

постоянный ток, 56 54 байта

[P[ is in the ]Pd*vdZrX-1-3/n[-comma club.]pstz0<g]sglgx

Для этого требуется ввод из стека, который должен быть предварительно загружен с первым именем в верхней части стека, первым номером, вторым именем, вторым номером и т. Д.

Вот пример загрузки стека и запуска макроса, g:

#!/usr/bin/dc
_123.45         [Nelly]
999999999999.00 [Lonnie]
1000.01         [Manson]
999.99          [Mark]
99.99           [Reid]
1               [Karla]
986000000       [Russ]
999999999.99    [Laura]
1549001.10      [Kylie]
0.05            [Jamie]
100000          [John]
[P[ is in the ]Pd*v1/Z1-3/n[-comma club.]pstz0<g]sglgx

который производит обычный вывод,

John is in the 1-comma club.
Jamie is in the 0-comma club.
Kylie is in the 2-comma club.
Laura is in the 2-comma club.
Russ is in the 2-comma club.
Karla is in the 0-comma club.
Reid is in the 0-comma club.
Mark is in the 0-comma club.
Manson is in the 1-comma club.
Lonnie is in the 3-comma club.
Nelly is in the 0-comma club.

Вот толкование кода:

[P[ is in the ]Pd*v1/Z-1-3/n[-comma club.]pstz0<g]sglgx

[                    # begin macro string
P                    # print and pop person name
[ is in the ]P       # print and pop ' is in the '
# Get absolute value of number by squaring and square root
d*v                  # d=dup, *=multiply, v=root
1/                   # 1/ truncates to integer since scale is 0
Z                    # Z=number length
1-3/n                # n=print and pop (#digits - 1)//3
[-comma club.]p      # print '-comma club.' and newline
st                   # pop '-comma club.' off stack into register t
z0<g                 # Do macro g if 0 is less than z=stack height
]                    # end macro string
sg                   # Save macro g
lgx                  # Load g and do its initial execution

Обратите внимание, что в редактировании 1 я заменил dZrX-(d = dup, Z = длина числа, r = своп, X = дробь, - = вычесть) на 1/Z(разделить число на 1, которое по умолчанию со шкалой от нуля усекается до целого числа; затем Z = число длина), сохраняя два байта.

Джеймс Уолдби - jwpat7
источник
1

Swift , 166 158 145 байтов

var c="comma club",i=0
f.map{k,v in var a=abs(v);print(k,(1000..<1000000~=a ?1:1000000..<1000000000~=a ?2:1000000000..<1000000000000~=a ?3:0),c)}

А вот и словарь:

var f = [
    "John": 100000, "Jamie": 0.05, "Kylie" : 1549001.10,
    "Laura": 999999999.99,"Russ":1000000000,"Karla": 1,
    "Reid": 99.99,"Mark": 999.99, "Manson": 1000.01,
    "Lonnie": 999999999999.00, "Nelly": -123.45
]

Попробуй это здесь!

Мистер Xcoder
источник
0

Clojure, 108 байт

(def f ["John", "Jamie", "Kylie", "Laura", "Russ", "Karla", "Reid", "Mark", "Manson", "Lonnie", "Nelly"])
(def a ["100000", "0.05", "1549001.10", "999999999.99", "986000000", "1", "99.99", "999.99", "1000.01", "999999999999.00", "-123.45"])

(map #(str %" is in the "(quot(-(count(nth(partition-by #{\.}(drop-while #{\-}%2))0))1)3)"-comma club.")f a)

Не уверен, что работа с плавающей точкой будет короче, чем с последовательностями символов. Не уверен, что не функциональный ответ в порядке, который возвращает последовательность ответов.

NikoNyrh
источник
0

Реболь, 118 байт

d: charset"0123456789"forskip s 2[c: 0 parse s/2[opt"-"any[3 d and d(++ c)]]print[s/1"is in the"join c"-comma club."]]

Развернутый с объявлением массива:

s: [
    {John} {100000}
    {Jamie} {0.05}
    {Kylie} {1549001.10}
    {Laura} {999999999.99}
    {Russ} {986000000}
    {Karla} {1}
    {Reid} {99.99}
    {Mark} {999.99}
    {Manson} {1000.01}
    {Lonnie} {999999999999.00}
    {Nelly} {-123.45}
    {Baz} {1.12345678}     ;; added extra Baz test case
]

d: charset "0123456789"
forskip s 2 [
    c: 0
    parse s/2 [
        opt "-"
        any [3 d and d (++ c)]
    ]
    print [s/1 "is in the" join c "-comma club."]
]

Выход:

John is in the 1-comma club.
Jamie is in the 0-comma club.
Kylie is in the 2-comma club.
Laura is in the 2-comma club.
Russ is in the 2-comma club.
Karla is in the 0-comma club.
Reid is in the 0-comma club.
Mark is in the 0-comma club.
Manson is in the 1-comma club.
Lonnie is in the 3-comma club.
Nelly is in the 0-comma club.
Baz is in the 0-comma club.
draegtun
источник
0

Java 8 154 141 байт

m.keySet().stream().map(k->k+" is in the "+(((""+Math.abs(m.get(k).longValue()))).length()-1)/3+"-comma club.").forEach(System.out::println);

Ungolfed

public static void main(String[] args) {
    Map<String, Number> m = new LinkedHashMap<String, Number>(){{
        put("John", 100000);
        put("Jamie", 0.05);
        put("Kylie", 1549001.10);
        put("Laura", 999999999.99);
        put("Russ", 1000000000);
        put("Karla", 1);
        put("Reid", 99.99);
        put("Mark", 999.99);
        put("Manson", 1000.01);
        put("Lonnie", 999999999999.00);
        put("Nelly", -123.45);
    }};
    m.keySet().stream().map(k->k+" is in the "+(((""+Math.abs(m.get(k).longValue()))).length()-1)/3+"-comma club.").forEach(System.out::println);
}
Anacron
источник
1
Вы можете удалить String.valueOfи использовать (((""+Math.abs(m.get(k).longValue())).length()-1)/3)вместо.
Кевин Круйссен
1
И вы также можете удалить скобки вокруг k->.
Кевин Круйссен,