Странная система оценок


14

У Weirdo Incorporates есть странный способ сортировки своих сотрудников по количеству дней, которые они присутствовали в офисе:

  0 -  13 : F  
 14 - 170 : E
171 - 180 : D
181 - 294 : C
295 - 300 : B
301 - 365 : A

Note: The range is inclusive (i.e. 0-13 means 0 days and 13 days both will evaluate
as grade 'F').

Задача:

Напишите программу / функцию, которая выводит / возвращает оценку сотрудника за количество дней [в пределах диапазона от 0 до365], которые посетил сотрудник.

Правила:

  • Вы можете использовать ввод как строку или число, но должны выводить как строку / алфавит (вы можете выбрать либо строчные, либо прописные буквы).
  • Применяются стандартные лазейки.
  • Это , поэтому выигрывает самая короткая программа в байтах!

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

12  => F
15  => E
301 => A
181 => C

Табло:





1
@ Mr.Xcoder Я помню, что в песочнице обсуждалось, что это не обман, так как в нем нет диапазонов одинакового размера, а в суффиксах, таких как +/ -.
Эрик Outgolfer

1
Можем ли мы получить табло?
jrtapsell

Ответы:


4

Желе ,  18 17 15  14 байт

NịØAx“A©r½ɗÇ‘¤

Монадическая ссылка, принимающая число и возвращающая символ.

Попробуйте онлайн! или увидеть все пары ввода-вывода .

Как?

NịØAx“A©r½ɗÇ‘¤ - Link: number, d
N              - negate d
             ¤ - nilad followed by link(s) as a nilad:
  ØA           -   uppercase alphabet yield = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
     “A©r½ɗÇ‘  -   code-page indices = [65,6,114,10,157,14]
    x          -   times = 'A'x65+'B'*6+'C'x114+'D'x10+'E'*157+'F'*14
 ị             - index into (1-indexed & modular - hence the negation to allow all Fs
                                                   to be together at one end)

12

Javascript (ES6), 51 байт

n=>"ABCDEF"[(n<14)+(n<171)+(n<181)+(n<295)+(n<301)]

Альтернативные решения (дольше):

53 52 байта (-1 байт благодаря @Arnauld)

n=>"FEDCBA"[n>300?5:n>294?4:n>180?3:n>170?2:+(n>13)]

55 53 байта (-2 байта благодаря @Neil)

n=>"AFEDCB"[[14,171,181,295,301].findIndex(m=>n<m)+1]

55 байт

n=>"FEDCBA"[[13,170,180,294,300].filter(m=>n>m).length]

Пример кода:

f=
n=>"ABCDEF"[(n<14)+(n<171)+(n<181)+(n<295)+(n<301)]
console.log(f(12))
console.log(f(15))
console.log(f(301))
console.log(f(181))


1
Это суммирование условий, это здорово !!! Жаль, что я не мог бы поднять еще раз !!! : D
officialaimm

Я могу сэкономить два байта на одном из ваших альтернативных решений:n=>"AFEDCB"[[14,171,181,295,301].findIndex(m=>n<m)+1]
Нил

-1 байт для вашего первого альтернативного решения:n=>'FEDCBA'[n>300?5:n>294?4:n>180?3:n>170?2:+(n>13)]
Арно


6

J , 31 байт

'FEDCBA'{~13 170 180 294 300&I.

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

объяснение

'FEDCBA'{~13 170 180 294 300&I.  Input: n
          13 170 180 294 300     Constant array [13, 170, 180, 294, 300]
                            &I.  Use it with interval index to find which of
                                 the intervals (-∞, 13], (13, 170], (170, 180],
                                 (180, 294], (294, 300], (300, ∞) n can be inserted at
        {~                       Index into
'FEDCBA'                         This string and return that char

Впервые я увидел диадику I.в дикой природе. Ухоженная.
Коул

@ Cole Я полагаю, что я использовал это пару раз в прошлом в Code-Golf.
миль

6

Python 3 , 50 байт

Спасибо @jferard за -4 байта.

lambda n:chr(70-sum(n>ord(x)for x in"\rª´ĦĬ"))

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

Python 3 , 54 байта

lambda n:chr(70-sum(n>x for x in[13,170,180,294,300]))

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

Сохранено 2 байта благодаря @mathmandan и косвенно благодаря @JonathanFrech.

Python 2 , 56 байт

lambda n:"ABCDEF"[sum(n<x for x in[14,171,181,295,301])]

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


1
54 байт: lambda n:chr(70-sum(n>x for x in[13,170,180,294,300])). (См. Ответ @Jonathan Frech на codegolf.stackexchange.com/a/142244/36885 )
математика


порт рубина: ->n{(70-"ĬĦ´ª\r".chars.count{|i|n>i.ord}).chr}тот же размер
Asone Tuhid

4

C 62 61 байт

Спасибо @Jonathan Frech за сохранение байта!

f(n){putchar(70-(n<14?0:n<171?1:n<181?2:n<295?3:n<301?4:5));}

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

C 57 байт

#define f(n)70-(n<14?0:n<171?1:n<181?2:n<295?3:n<301?4:5)

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

C (gcc), 54 байта

f(n){n=70-(n<14?0:n<171?1:n<181?2:n<295?3:n<301?4:5);}

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

C (gcc), 50 байтов

Используя решение @Herman Lauenstein .

f(n){n=65+(n<14)+(n<171)+(n<181)+(n<295)+(n<301);}

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



Почему бы не представить самую короткую версию в качестве основного решения?
Лохматый

@Shaggy Те, которые требуют gcc, прибегают к неопределенному поведению, так что я предпочел бы держать четко определенные вершины, и сортировка их от самой старой к самой новой и в то же время от самой длинной до самой короткой мне кажется подходящей.
Steadybox

3

Котлин , 56 байт

{v->'F'-listOf(13,170,180,294,300).filter{it<v}.count()}

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

украшенный

{ v->
    // Count the grades passed, then subtract that from F
    'F' - listOf(13,170,180,294,300)
            .filter { it < v }
            .count()
}

Тестовое задание

var x:(Int)->Char =
{v->'F'-listOf(13,170,180,294,300).filter{it<v}.count()}

fun main(args: Array<String>) {
    println(x(12))
    println(x(15))
    println(x(301))
    println(x(181))
}

+1. Я отредактировал ваш ответ в более официальном формате, надеюсь, вы не будете возражать.
officialaimm

Вовсе нет, я хотел исправить свой инструмент для вывода правильного заголовка
jrtapsell

3

Japt , 23 21 байт

'Gc-[#ªT#´D294L*3]è<U

Попытайся


Explantion

Неявный ввод целого числа U.

'Gc-

Вычесть из кодовых точек (односимвольной) строки G...

è<U

Количество элементов меньше U...

[#ªT#´D294L*3]

В массиве 170 ( ), 0 ( T), 180 ( ), 13 ( D), 294 (литерал) и 300 ( L*3) отформатированы и упорядочены таким образом, чтобы избежать использования запятых с разделителями. 0может быть удален (вычитая из кодовой точки Fвместо), но тогда нужно будет добавить запятую или C*F(12 * 15) использовать для 180, в конечном итоге не экономя байтов.


3

R , 50 44 байта

LETTERS[6-sum(scan()>c(13,170,180,294,300))]

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

такой же, как и в ответе javascript, но использует векторизацию R и встроенные LETTERS, чтобы получить немного короче.

Спасибо rturnbull за то, что сбрил последние 6 байтов.



Фактически, 44 байта , просто делая его полной программой вместо функции.
rturnbull

@rturnbull ах, я собирался сказать: «Нет, вам нужно обернуть это, catиначе использовать source(program,ec=T)и считать ec=Tкак флаг (согласно мета-консенсусу в программах на R), но другим, более новым мета-консенсусом мы не учитываем флаги дольше, так что я это совершенно правильное решение
Джузеппе


2

Recursiva , 49 30 байт

Y(++++<a301<a295<a181<a171<a14

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

Позвольте мне ответить на мой вопрос на моем родном языке. : D

  • сэкономили 19 байтов, используя технику из удивительного JS-ответа @Herman Lauenstein

Объяснение:

Y(++++<a301<a295<a181<a171<a14
      <a301<a295<a181<a171<a14 calculate true/false for all the conditions
  ++++                         sum up all the conditions to obtain n which can be either 0,1,2,3,4 or 5
 (                             yield upper-case Alphabet
Y                              Get n-th element   


2

Пайк , 28 байт

G6<13T17*180T30*294]5FhQ>)s@

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

объяснение

G6<13T17*180T30*294]5FhQ>)s@ - Full program. T is the constant for 10.

G                            - The lowercase alphabet.
 6<                          - With the letters after the index 6 trimmed.
   13                        - The literal 13.
     T17*                    - The integer 170, composed by 17 * 10, to save whitespace.
         180                 - The literal 180.
            T30*             - The integer 300, composed by 30 * 10. 
                294          - The literal 294.
                   ]5        - Create a list of 5 elements.
                     FhQ>)   - For each element in the list.
                      h      - Increment.
                       Q     - The input.
                        >    - Is smaller ^^ than ^? Yields 1 for truthy and 0 for falsy.
                         )s  - Close loop and sum.
                           @ - Get the index in the alphabet substring explained above.


1

Pyth, 30 байт

@GtlfgTQmCdc"\r ª ´ & , m"d

Сайт не кажется , чтобы показать символ с кодом пунктом 1, так что вам нужно , чтобы вставить символ с кодом точкой 1 до &, ,и mв конце

(Заменить все 1s символом с кодовой точкой 1):

@GtlfgTQmCdc"\r ª ´ 1& 1, 1m"d

1

Pyth , 25  26  байтов

@<G6sgRQ[13*17T180*30T294

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

объяснение

@<G6sgRQ[13*17T180*30T294 - Full program.

  G                       - The lowercase alphabet.
 < 6                      - With the letters after the index 6 trimmed. We will call "S".
        [                 - Initialise a list literal.
         13               - The literal 13.
           *17T           - The integer 170, composed by 17 * 10, so save whitespace.
               180        - The literal 180.
                      294 - The literal 294.
                  *30T    - The integer 300, composed by 30 * 10.
     gRQ                  - For each element, return 1 if is is ≥ the input. 0 otherwise.
    s                     - Sum.
@                         - Get the index into S of ^.
                          - Output implicitly.         

1

Ly , 74 байта

n(14)L["F"o;]p(171)L["E"o;]p(181)L["D"o;]p(195)L["C"o;]p(301)L["B"o;]"A"o;

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

Простой подход if-chain. Я сомневаюсь, что это можно сделать намного короче.


Требуются ли эти парантезы (...)? PS nvm, видимо они есть.
officialaimm


1

Java 8, 55 байт

n->n<14?'F':n<171?'E':n<181?'D':n<295?'C':n<301?'B':'A'

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

Альтернатива 57 байтов :

n->(char)(n<14?70:n<171?69:n<181?68:n<295?67:n<301?66:65)

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

Альтернатива 60 байтов :

n->"FEDCBA".charAt(n<14?0:n<171?1:n<181?2:n<295?3:n<301?4:5)

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

Возможно, можно найти какую-то формулу, чтобы получить 0-5 более коротким способом, чем n<14?0:n<171?1:n<181?2:n<295?3:n<301?4:5при использовании последнего подхода. Все еще расследую это.


1

PowerShell , 59 байт

(,'F'*14+,'E'*157+,'D'*10+,'C'*114+,'B'*6+,'A'*65)["$args"]

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

Аналогично ответу Jelly на Джонатана Аллена в том смысле, что мы создаем массив всех объединенных букв, а затем индексируем в этот массив входные данные $args.


1

Кролик ~ , 50 байт

(Неконкурентный, вопрос постдатчиков. Я только что закончил переводчик (ура) и хотел попытаться что-то решить. Это также моя первая игра в гольф с кодом)

=>FEDCBA$<({.0-\_-^\-&^?n&&}_}\>\{{\>:.¤})Ð"ỤṅỌrḲA

Это в основном берет различия от одного сорта до следующего 14,157,10,114,6,65 (закодировано как ỤṅỌrḲA ) и вычитает из входных данных. Если найдено отрицательное число, оно останавливается по последовательности 'FEDCBA' и выводит букву.

Небольшое объяснение этого прекрасного фрагмента синтаксиса

Кролик ~ использует сеточную память с одной или несколькими каретками, которые вы можете перемещать; это решение использует 2.

=>FEDCBA$<({.0-\_-^\-&^?n&&}_}\>\{{\>:.¤})Ð"ỤṅỌrḲA - Full program.

  FEDCBA                                           - Load bytes into grid
                                          Ð"ỤṅỌrḲA - Load bytes 14,157,10,114,6,65 into second line of data grid
=                                                  - Read input
 >       <      _ ^   ^     _  >   >               - Move caret (most instructions read from the grid below the active caret)
        $                                          - Create a new caret
          (                              )         - Loop
           {.0             } }   {{     }          - Conditional statement checking if value at caret == 0 then move active caret to next grade else print and quit
              -  -  -                              - Subtract 
               \   \          \ \                  - Cycle active caret
                     &   &&                        - Bitwise and to see if number is negative
                       ?n                          - Get negative sign bit
                                    :.             - Print value at caret as character
                                      ¤            - Terminate program

Ницца. Есть ли способ попробовать это онлайн?
officialaimm

Не сейчас ^^
Адам

1

Excel, 53 байта

Сумма условий, затем возвращает требуемый символ ASCII:

=CHAR((A1<14)+(A1<171)+(A1<181)+(A1<295)+(A1<301)+65)

Альтернативные решения:

Условия суммирования, возвращаемый индекс строки (63 байта):

=MID("ABCDEF",(A1<14)+(A1<171)+(A1<181)+(A1<295)+(A1<301)+1,1)


1

Йотлин , 48 41 байт

{v->'F'-l(13,170,180,294,300).f{a<v}.l()}

Вся программа:

var x:(Int)->Char =
{v->'F'-l(13,170,180,294,300).f{a<v}.l()}

println(x(12))
println(x(15))
println(x(301))
println(x(181))

Портировал мой предыдущий Kotlin ответ здесь .


1

V , 37 34 байта

aFEDCBA5äh113äh9äh156äh13ähÀ|vyVp

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

HexDump:

00000000: 3133 4146 1b31 3536 4145 1b39 4144 1b31  13AF.156AE.9AD.1
00000010: 3133 4143 1b35 4142 1b36 3441 411b eec0  13AC.5AB.64AA...
00000020: 7c76 7956 70                             |vyVp

Основная идея:

  • Распечатайте FEDCBA, создайте 5 копий B, 113 копий C и т. Д., Получив в результате строкуFFFFFFFFFFFFFEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEDDDDDDDDDCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCBBBBBA (возможно, есть более эффективный способ сделать это)
  • Перейти к nстолбцу th ( nэто первый аргумент), скопировать один символ и заменить на него всю строку.




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