Мой представитель в форме обмена стека?


16

Предпосылка:

Ваша репутация находится в форме обмена стека, если она может быть представлена ​​путем разложения количества ваших медалей (золото, серебро и бронза, подсчитанные отдельно) на их базовые 10 цифр и объединения их в любом заданном порядке с несколькими оговорками.

Разлагая, каждый

  • Цифра золотой медали стоит три цифры.
  • Серебро стоит две цифры.
  • Бронза это одна цифра.
  • Кроме того, поскольку SE не отображает тип медали, если у вас его нет, подсчет 0 медалей для типа не приведет к a [0].

Пример:

  • [1 Gold, 2 Silvers, 3 Bronzes]будет разлагаться на [1,1,1,2,2,3]. 321112 и 213121 являются двумя примерами номера SE-формы для этих медалей.
  • [20 Golds, 0 Silvers, 20 Bronzes]будет разлагаться на [2,2,2,0,0,0,2,0]. 20002022 - это номер SE-формы.
  • [11 Golds, 0 Silvers, 0 Bronzes]будет разлагаться на [1,1,1,1,1,1]. 111111 является единственным номером SE-формы для этого.

При рассмотрении номера SE не будет начальных 0. Например, во втором примере, приведенном выше, 00002222 -> 2222номер SE-формы для [20,0,20].

Ввод, вывод:

Входные данные представляют собой список / кортеж / массив / все, [reputation, gold_medals, silver_medals, bronze_medals]что является неотрицательными целыми числами. Это предполагаемый порядок, но его можно изменить. Просто запишите в своем ответе, если вы это сделаете.

Выходными данными являются любые два согласованных значения для true и false.

Правила:

  • Ввод всегда будет действительным
  • У вас всегда будет хотя бы 1 репутация
  • У вас не может быть никаких медалей, которые всегда должны возвращать ложь.
  • Подсчет медалей не имеет никакого отношения к реальности. Хорошо иметь несколько сотен золотых и без бронзы.
  • Это поэтому выигрывает самый короткий ответ в байтах.

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

#[Rep, Gold, Silver, Bronze] -> Output
[4, 0, 0, 4]       -> True
[1447, 0, 4, 17]   -> True
[74414, 4, 0, 17]  -> True
[4444, 4, 0, 4]    -> True
[4455, 0, 54, 0]   -> True
[5355, 5, 0, 3]    -> True
[53535, 5, 3, 0]   -> True
[4444, 0, 0, 4444] -> True
[444, 4, 0, 0]     -> True
[1234, 0, 0, 1234] -> True
[1234, 0, 0, 4321] -> True

[4444, 1, 0, 1]      -> False
[5555, 5, 0, 55]     -> False
[1234, 1, 23, 4]     -> False
[1, 0, 0, 0]         -> False
[1001001, 0, 10, 10] -> False

Так что же делает репутация в контексте проблемы?
OrangeCherries

3
@OrangeCherries Механически, ничего. Это вдохновило меня на вызов, потому что у меня было 1447 представителей и 4 серебра, 17 бронз на момент написания статьи.
Веска

1
Гибкий ли ввод помимо заказа? Так мог бы я, например, взять входной список [bronze, silver, gold]и отдельный второй вход reputation?
Кевин Круйссен

1
@KevinCruijssen Да, все в порядке. Единственное, что я бы сказал, не разрешено - это принимать входные данные в виде списка списков символов / цифр, составляющих каждое число.
Веска

Допускаются ли какие-либо значения истинности / ложности для вывода или они должны быть двумя последовательными?
Ник Кеннеди

Ответы:


11

05AB1E , 16 14 13 11 10 байт

∞×0KJ‚€{íË

Принимает входные медали в порядке [bronze, silver, gold]первого ввода и reputationвторого ввода.

-1 байт благодаря @Grimy .

Попробуйте онлайн или проверьте все контрольные примеры .

Объяснение:

           # Push an infinite positive list: [1,2,3,...]
 ×          # Repeat the values in the (implicit) input-list that many times as string
            # (since the input-list contains just 3 values, the rest of the infinite
            #  list is ignored)
  0K        # Remove all 0s (so all "0", "00" and "000")
    J       # Join the strings in the list together
           # Pair this string with the (implicit) second input
      €{í   # Sort the digits in both strings in descending order
         Ë  # And check if both are now equal
            # (after which the result is output implicitly as result)

1
3L-> для -1.
Grimmy

1
@Grimy Иногда полезно, чтобы списки урезались до самых маленьких. :) Благодарность!
Кевин Круйссен

Это 19 байтов в utf-8, а не 10 байтов.
Ли Райан

@LieRyan Вы правы, это действительно 19 байтов в UTF-8. 05AB1E использует (например, Jelly and Charcoal) пользовательскую кодовую страницу , где каждые 256 символов, которые он знает, кодируются в 1 байт каждая. Байты в этой 10-байтовой версии в шестнадцатеричной форме \x19\xd7\x30\x4b\x4a\x82\x80\x7b\xec\xcb: Должна быть возможность запуска этих шестнадцатеричных байтов с --osabieфлагом, но я не уверен, как это сделать в версии 05AB1E Elixir, чтобы быть полностью честным (но я спрошу некоторые другие проверят и свяжутся с вами с ответом).
Кевин Круйссен

@LieRyan В версии 05AB1E (прежняя версия) Python это можно сделать следующим образом (это, конечно, другая программа для другой задачи), но она должна дать вам представление о том, как выполняются шестнадцатеричные байты.
Кевин Круйссен

7

JavaScript (ES6),  92  74 байта

Принимает вход как (['gold','silver','bronze'])('rep'). Возвращает логическое значение.

b=>r=>[...b.map((n,i)=>n.repeat(+n&&3-i)).join``].sort()+''==[...r].sort()

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


JavaScript (ES6), 74 байта

Принимает вход как (gold, silver, bronze, 'rep'). Возвращает логическое значение.

(g,s,b,r)=>(F=s=>[...s].sort()+0)(r)==F([g,g,g,s,s,b].filter(x=>x).join``)

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


7

MATL , 28 байтов 20 байтов 16 байтов 13 байтов

Возвращает 0 для false и 1 для true. Это может определенно быть в гольфе.

[1,3,2,1]Y"t2:7)XzVXzY@Ums0>

Уменьшение до 16 байт, если оценка репутации может быть взята отдельно, а порядок [бронза, серебро, золото], репутация.
До 13 байтов благодаря Луису Мендо.

3:Y"XzVXzY@Um

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




5

Japt , 14 13 12 байт

íp fn ¬á øUg

Принимает вход как [rep, bronze, silver, gold]

Попробуйте или проверьте все тесты

Sample input: U = [1447, 17, 4, 0]
íp            Repeats each value of U by it's index amount e.g. ["","17","44","000"]
  fn          Remove all falsy values when converted to a number e.g. ["17","44"]
    ¬         Concatenate e.g. "1744"
     á        All permutations e.g. ["1744","1744","1474","1447","1474","1447","7144","7144","7414","7441","7414","7441","4174","4147","4714","4741","4417","4471","4174","4147","4714","4741","4417","4471"]
      øUg     Does it contain the first item of the input? 

Я сделал несколько ударов по этому поводу с нескольких разных точек зрения, но не смог сделать лучше, чем 13.
Лохматый

@ Shaggy Оказывается, Åбыло ненужным, так fnкак избавился бы от первого значения. Удаление Åделает это 12 байтов
Воплощение Невежества

Это 16 байтов в utf-8, а не 12 байтов.
Ли Райан

@LieRyan Некоторые языки гольфа используют свои собственные кодировки; Джапт использует ISO-8859-1`
Воплощение неведения

@EmbodimentofIgnorance, Ах, черт возьми, почему я не заметил это ?! Я действительно чувствую себя не в своей тарелке с тех пор, как взял этот месяц в качестве открытой награды за Джапта.
Лохматый

4

Сетчатка 0.8.2 , 45 байт

,0
,
,(\d*),(\d*),
¶$1$1$1$2$2
%O`.
^(.+)¶\1$

Попробуйте онлайн! Ссылка включает тестовый набор. Объяснение:

,0
,

Удалить ноль баллов.

,(\d*),(\d*),
¶$1$1$1$2$2

Разверните счетчики золота и серебра и преобразуйте разделитель в новую строку.

%O`.

Сортируйте репутацию и расширенные баллы отдельно.

^(.+)¶\1$

Сравните отсортированные цифры.



4

Ракетка, 149 107 98 байт

(λ(r b s g[h(λ x(sort(string->list(apply ~a(remq*'(0)x)))char<?))])(equal?(h r)(h b s s g g g)))

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

Первый раз играю в гольф в ракетке, поэтому все еще ищу улучшения ...

Пояснение (оригинальной более длинной версии, но та же идея):

(λ(r b                              ; take rep and badges as arguments
     [g(λ(x)                        ; helper function g which takes a string
         (sort                      ; and returns the sorted
           (string->list x)         ; list of characters
           char<?))])               ; (sort by ascii code)
  (equal?                           ; compare...
    (g(~a r))                       ; g called on the rep converted to string
    (g                              ; and g called on...
      (string-join                  ; the concatenation of
        (map ~a                     ; the stringified elements of
             (append*               ; the flattened list given by
               (filter              ; the elements of the following list where
                 (λ(x)(>(car x)0))  ; the badge count is nonzero:
                 (map make-list     ; repeat the badge counts
                      '(1 2 3)b)))) ; 1, 2, and 3 times respectively
        ""))))

2

Древесный уголь , 24 байта

1F⁴F↨NχFι⊞υκFχ¿⁻№υι№θIι⎚

Попробуйте онлайн! Ссылка на подробную версию кода. Принимает вход в порядке повтор, бронза, серебро, золото и выводит, 1если ответ действителен. Объяснение:

1

Предположим, что ответ действителен.

F⁴F↨NχFι⊞υκ

Цикл по четырем входным значениям. Нажмите каждую цифру каждого значения iраз, где iнаходится индекс с 0 индексами значения. Числовое базовое преобразование используется здесь, поскольку оно преобразует 0в пустой массив.

Fχ¿⁻№υι№θIι⎚

Проверьте, что число каждой цифры в массиве совпадает со значением в первом входе. Если они отличаются, очистите холст.


Это 60 байтов в utf-8, а не 24 байта.
Ли Райан

@LieRyan Я не говорил, что это были байты UTF-8.
Нил

2

Желе , 18 байт

DẋṠƊ€ẋ"3RU¤FṢ⁼⁴DṢ¤

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

это немного плохо


Это 37 байтов в utf-8, а не 18 байтов.
Ли Райан

@LieRyan Jelly (и многие другие языки гольфа) используют свою собственную кодовую страницу, так что все 256 однобайтовых кодов соответствуют одному из символов, используемых языком.
HyperNeutrino


Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.