Целая оценка в класс


30

Учитывая положительное целое число (0 и выше, не максимум), преобразуйте его в оценку, следуя этим правилам:

A = 100+  
B = 90 - 99  
C = 80 - 89  
D = 70 - 79  
E = 60 - 69  
F = 59 and less.

Это было немного скучно, поэтому сделайте оценку a, +если она равна 7,8 или 9, и a, -если она равна 0,1 или 2. Игнорируйте это для случаев F и A.

Пример:

Входные данные:

65

Выход:

E

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

0  -> F
20 -> F
65 -> E
72 -> D-
75 -> D
80 -> C-
99 -> B+
102 -> A
864 -> A

Нет пробелов. Одна новая строка после вывода в порядке, но сохраняйте ее последовательной. Функции и полные программы в порядке.

Это код гольф, поэтому выигрывает самый короткий код. Это было вдохновлено вопросом Ask Ubuntu: как написать сценарий оболочки для присвоения буквенных оценок числовым диапазонам? , Ответы в Bash и Python, так что немного спойлеры.


Leaderboard:

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

Чтобы убедиться, что ваш ответ обнаружен, начните его с заголовка, используя следующий шаблон уценки:

# Language Name, N bytes

где Nразмер вашего представления. Если вы улучшите свой счет, вы можете сохранить старые результаты в заголовке, вычеркнув их. Например:

# Ruby, <s>104</s> <s>101</s> 96 bytes


1
Не было бы A+и A-? Я не понимаю, почему мы их игнорируем.
ASCIIThenANSI

1
@ASCIIThenANSI делает более интересным иметь исключения, и для A нет максимума, так что нет+
Тим

1
У этой классификационной доски есть ошибка: рыбная версия старше, и мой ответ перед ней.
Исмаэль Мигель

@IsmaelMiguel Это было написано, когда самая ранняя публикация еще не была прерывателем связей по умолчанию (таким образом, это не заказывает связи вообще). Я постараюсь исправить это в какой-то момент (вероятно, не для этой задачи, но, по крайней мере, источник на мета).
Мартин Эндер

@ MartinBüttner Я просто указывал на это.
Исмаэль Мигель

Ответы:


21

Python 2, 72 70 62 байта

lambda n:"FA"[n>59:1+n/100]or chr(75-n/10)+"+-"[(n+3)%10/3::2]

Это анонимная функция, которая принимает int и возвращает оценку в виде строки.

(спасибо @ MartinBüttner, @grc и @TheNumberOne за советы)


4
"EDCB"[n/10-6]->chr(75-n/10)
grc

Какой умный способ выбрать символ, который может быть пустым!
xnor

11

CJam, 34 33 32 байта

riAmd)4/"- +"=S-\Ae<5e>_~'L+o5%<

Хорошо, я попробовал несколько подходов сейчас и не могу получить это ниже 33, поэтому здесь идет объяснение:

ri                                 e# Read the input and convert to integer
  Amd                              e# Take divmod of the input with 10. This leaves the
                                   e# number/10 and number%10 on stack
     )4/                           e# Increment the mod by 1 and integer divide by 4.
        "- +"=S-                   e# This converts 0,1,2 to 0 and 7,8,9 to 2. Pick - or +
                                   e# respectively and remove space in case of 3,4,5 and 6
                \Ae<5e>            e# To the divisor by 10 scope it to range of [5,10]
                       _~          e# Take a copy and do number * -1 - 1
                         'L+       e# Add it to char L. This gets us the required grade
                            o      e# Output the grade. This removes it from stack
                             5%    e# We now have scoped divisor on stack. Do mod with 5
                               <   e# Both 5 and 10 will return 0, in which case, we don't
                                   e# want the + or -. So we do a substr(0, 0).
                                   e# 5 represents F and 10, A. For others, it will do
                                   e# substr(0,X) where X > 0. Since the string is only
                                   e# 1 char long, it doesn't affect at all.

ОБНОВЛЕНИЕ : 1 байт сохранен благодаря указателю Денниса

Попробуйте онлайн здесь


Что делает s?
Деннис

@Dennis конвертирует char + / - / пробел в строку для последнего<
Оптимизатор

Это не должно быть необходимым. Character String -толкает строку
Денис

@ Денис Ах, ты прав. Я думаю, что для какой-то предыдущей версии использование было другим.
Оптимизатор

8

Retina, 43 + 15 = 58 байт

...+
A
.[012]
$&-
.[789]
$&+
^9.
B
^8.
C
^7.
D
6.
E
\d.*
F

Retina - это язык регулярных выражений, созданный Мартином Бюттнером, где файлы с нечетными номерами - это регулярные выражения, с которыми нужно сопоставлять, а файлы с четными номерами - это то, что нужно заменить. Каждая строка представляет собой отдельный файл, поэтому я добавил 15 байтов для каждого дополнительного файла.

объяснение

Он начинается с создания чего-либо с 3 или более цифрами A. Он добавляет, -если это двузначное число, заканчивающееся на 0, 1 или 2, и +если оно заканчивается на 7, 8 или 9. Числа затем сопоставляются с их оценка (например, число, начинающееся с 9, обозначается буквой B). Любое оставшееся число автоматически становится F. К сожалению, ;`для подавления промежуточного вывода необходимо добавить перед всеми, кроме последнего регулярного выражения. Обновление: в версии 0.5.0 промежуточный вывод по умолчанию отключен, что позволяет сэкономить несколько байтов.


Вы уверены, что он не выводит + и - для случая F?
Тим

1
@Tim Это не должно быть, потому что \d.*соответствует и заменяет всю строку, +включая.
NinjaBearMonkey

Ах, ладно - теперь я это вижу! :)
Тим

8

C, 99 байтов

Я новичок здесь, я надеюсь, что я следую правилам.

char b[3];char*f(n){b[1]=0;n<60?*b=70:n>99?*b=65:(*b=75-n/10,b[1]=n%10<3?45:n%10>6?43:0);return b;}

Эта функция принимает метку в качестве параметра и возвращает оценку в виде строки с нулевым символом в конце.

объяснение

Добавлены пробелы:

char b[3];

char *f(n) {
    b[1] = 0;
    n<60 ? *b = 70 :
    n>99 ? *b = 65 :
    (
        *b = 75 - n / 10,
        b[1] = n % 10 < 3 ? 45 : n % 10 > 6 ? 43 : 0
    );

    return b;
}

Глобальные переменные автоматически обнуляются, поэтому b заполняется значениями NULL. Поскольку касаются только первые два символа, нам нужно беспокоиться только о том, чтобы поставить значение NULL в b [1], если в оценке только один символ. Этот NULL вставляется в самом начале функции. Параметр n неявно int. Если оценка меньше 60, то она установлена ​​на «F», если она больше 99, на «A». В других случаях базовый класс задается как 'E' - (n - 60) / 10, что упрощает до 75 - n / 10. n % 10получает цифру единицы измерения. Если оно меньше 3, то добавляется a -, если оно больше 6, добавляется a +, в противном случае b [1] обнуляется (что уже было).

Контрольные примеры

#include <stdio.h>

char b[3];char*f(n){b[1]=0;n<60?*b=70:n>99?*b=65:(*b=75-n/10,b[1]=n%10<3?45:n%10>6?43:0);return b;}

int main() {
    printf("  0 -> %s\n", f(0));
    printf(" 20 -> %s\n", f(20));
    printf(" 65 -> %s\n", f(65));
    printf(" 72 -> %s\n", f(72));
    printf(" 75 -> %s\n", f(75));
    printf(" 80 -> %s\n", f(80));
    printf(" 99 -> %s\n", f(99));
    printf("102 -> %s\n", f(102));
    printf("864 -> %s\n", f(864));

    return 0;
}

Output:
  0 -> F
 20 -> F
 65 -> E
 72 -> D-
 75 -> D
 80 -> C-
 99 -> B+
102 -> A
864 -> A

Отлично :) Ничего плохого там нет.
Тим

разница между твоим кодом и моим - это одно слово "printf", которое должно сохранять больше 3 байтов в случае игнорирования :)
Abr001am

7

Pyth, 33 байта

+C-75K@S[/QTT5)1<-@"- +"/heQ4d%K5

Попробуйте онлайн: демонстрация или тестовый набор

Объяснение:

                                     implicit: Q = input
        [/QTT5)                      create the list [Q/10, 10, 5]
       S                             sort
      @        1                     take the element in the middle
     K                               store in K (this results in a number between 5 and 10)
  -75K                               75 - K
 C                                   char with ASCII-value ...
                  @"- +"/heQ4        "- +"[(Q%10 + 1) / 4]
                 -           d       remove spaces
                <             %K5    slice [:K%5]
+                                    add these two chars and print

7

> <> (Рыба), 78 71 байт

iii0)?/:0({:'6'(@@+?/'{'01.
;$-o:'4'(?\'7'(?;'+'o
 ;o'A'\   \'-'o;o'F'\

Метод:

  • Мы читаем кодовые точки первых 3 символов x,y,zиз ввода. Если символа нет, значение его переменной будет -1неявно. ( ord(c)отметит кодовую точку символа c)
  • Если z > 0(3-значный ввод), распечатайте Aи выйдите.
  • Если x < ord('6') or y < 0(введите <60), напечатайте Fи выйдите.
  • Напечатайте символ с кодовой точкой 123 - x.
  • Если y < ord('4') print-` и выход.
  • Если y > ord('6') print+ `и выход.
  • Выход.

7

С 67 65

Удивительно, но это довольно близко к решению Python.

f(i){printf(i<60?"F":i>99?"A":"%c%s",75-i/10,"-\0+"+(i%10+1)/4);}

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

  • Если напечатано Fили или даже не смотрит на другие переданные аргументы. Это довольно неприятный взломать.Aprintf

  • Если (i%10+1)/4значение равно 1(нет +или -должно быть добавлено к оценке), %sсредство форматирования получает указатель на \0байт, поэтому ничего не печатается. Также довольно забавно, потому что я не знал, что вы можете взять адрес индексного строкового литерала. (например &"string"[i]) ( редактировать : "string"+iеще короче ! Спасибо @nutki)

Вот выходные данные программы для чисел от 57 до 102. Я сделал это hexdump, так что мы можем быть уверены, что никаких странных \0байтов не было напечатано.

% seq 44 115 | xargs -n1 ./grade | xxd
0000000: 4646 4646 4646 4646 4646 4646 4646 4646  FFFFFFFFFFFFFFFF
0000010: 452d 452d 452d 4545 4545 452b 452b 452b  E-E-E-EEEEE+E+E+
0000020: 442d 442d 442d 4444 4444 442b 442b 442b  D-D-D-DDDDD+D+D+
0000030: 432d 432d 432d 4343 4343 432b 432b 432b  C-C-C-CCCCC+C+C+
0000040: 422d 422d 422d 4242 4242 422b 422b 422b  B-B-B-BBBBB+B+B+
0000050: 4141 4141 4141 4141 4141 4141 4141 4141  AAAAAAAAAAAAAAAA

Используемый mainметод:

main(c,v)char**v;{f(atoi(v[1]));}

1
&"string"[i]не является необходимым, поскольку это эквивалентно более короткому, "string"+iс которым вы можете сохранить 2 байта.
Nutki

Я должен быть объективным и говорить об этом :) Поздравляю, вы победили все записи C
Abr001am

6

CJam, 41 39 37 34 байта

Это слишком долго, но я не думаю, что пока буду играть в гольф дальше.

qiAmd'K@Ae<5e>:X-X5%g@)4/"- +"=*S-

Проверьте это здесь. Или запустите все тестовые случаи здесь.

Три байта сохранены оптимизатором.

объяснение

(Слегка устаревший)

qi                                    e# Read input and convert to integer.
  'K1$                                e# Push the character K, then copy the input.
      A/                              e# Divide by 10.
        Ae<5e>                        e# Clamp the result to the range 5..10.";
              -                       e# Subtract from K to get the grade.
               _'Am                   e# Duplicate get difference to A.
                   5%g                e# Check that its neither 0 (A) nor 5 (F).
                      @               e# Pull up the other copy of the input.
                       A%)4/          e# ((i % 10) + 1) / 4
                            "- +"=    e# Use that to select -, space, or +.
                                  *   e# Multiply it with the earlier boolean so that
                                      e# it vanishes for A and F.
                                   S- e# Remove the space if there is one.



5

JavaScript (ES6), 66 байт

Прямо.

F=n=>n<60?'F':n>99?'A':'EDCB'[n/10-6|0]+(n%10>6?'+':n%10<3?'-':'')

// TEST (in Firefox)

for(i=0;i<111;i++)document.write(i+'='+F(i)+' ')


4

R 107 105 99 байт

Боюсь, что это не очень хорошее усилие, но я постараюсь сыграть в него попозже.

cat(LETTERS[11-(r=min(max(scan(),59),100))%/%10],if(r>59&r<100)c('-','','+')[(r%%10+1)/4+1],sep='')

Редактировать брошено несколько ifсекунд. Исправлен случай и неверный результат на 100. Теперь избавиться отifelse с . Избавился от ifelseс.


Я думаю, что вы хотите, LETTERSа не letters.
Алекс А.

3

Perl, 66 62 байта

Это, вероятно, может быть в гольф больше. Также другой способ может быть лучше.

$_=$_>99?A:$_<60?F:s/\d$/$&>6?"+":$&<3?"-":""/re;y/9876/BCDE/

+1 за -p

Бежать с:

echo 72 | perl -pE'$_=$_>99?A:$_<60?F:s/\d$/$&>6?"+":$&<3?"-":""/re;y/9876/BCDE/'

Почему бы не использовать -pи бросить say?
ThisSuitIsBlackNot

@ThisSuitIsBlackНе спасибо! Обновлено
hmatt1

2

Javascript (ES6), 78 79 байтов

Это действительно не самый умный вариант, но я сделал то, что мог.

F=n=>'FEDCBA'[n[2]?5:n<60?0:n[0]-5]+(n[2]||n<60?'':'-+\n'[n[1]<3?0:n[1]>6?1:2])

Просто передайте оценку в виде строки , и она вернет свою оценку.

Струнная часть очень важна.

Вы можете проверить тестовый пример здесь:

console._RELAY_TO_DOC=true;

//non-es6 version:

function F(n){return 'FEDCBA'[n[2]?5:n<60?0:n[0]-5]+(n[2]||n<60?'':'-+\n'[n[1]<3?0:n[1]>6?1:2])}



var testcases=[0,20,65,72,75,77,80,90,99,100,102,180,1000],
    results={};

for(var i in testcases)
{
  results[testcases[i]]=F(testcases[i]+'');
}

console.log(results);
<script src="http://ismael-miguel.github.io/console-log-to-document/files/console.log.min.js"></script>

Если дополнительное письмо после письма не разрешено, я с радостью его удалю. Не было! Это увеличило мой код на 1 байт, но ничего (слишком) серьезного.


1
@Tim Исправил это. Надеюсь, этого достаточно. Цитирую себя: " One newline after output is fine, but keep it consistent.". Я думаю, что это достаточно последовательно.
Исмаэль Мигель

2

C #, 143 127 112 88 байт

string g(int n){return n>=100?"A":n<=59?"F":(char)(75-n/10)+(n%10>6?"+":n%10<3?"-":"");}

Я пытался быть умным, выполняя числовые моды ASCII, но, похоже, я был не один!

Спасибо Тиму за советы по спискам вместо ifs.

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


1
Разве вы не можете сократить ifs, используя списки?
Тим

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

В питоне я могу сделать это: [item1,item2][condition]. Если условие истинно, оно дает 2-й пункт, если ложь первое.
Тим

Отличная идея! Добавил это.
передача

Я думаю, что вы могли бы использовать троичные выражения if, например, return <condition> ? <true result> : <false result>Заметьте, вы также можете return <condition> ? <true result> : <condition> ? <2nd true result> : < 2nd false result>
вкладывать

1

Haskell, 78 байт

Первая строка выглядит расточительной, стоит 14 байт, но я не смог найти более короткую версию без нее.

(#)=replicate
a="A":a
f=(!!)$60#"F"++[g:s|g<-"EDCB",s<-3#"-"++4#""++3#"+"]++a

объяснение

Оператор #является сокращением для создания n копий его второго аргумента. Список a- это бесконечный список строк "A". Функция fиндексирует в список всех оценок для n = 0,1, ... Понимание списка строит «среднюю часть» этого списка (оценки от E до B); gэто один символ, который предшествует строке s(которая может быть пустой).

использование

ghci> map f [0,20,65,72,75,80,99,102,864]
["F","F","E","D-","D","C-","B+","A","A"]

1

C, 102 байта

int f(int h){int b,c;printf("%c%c",b?65:!c?70:75-h/10,!(b=h>99)*(c=h>59)*(((h%10<3)*45+(h%10>6)*43)));

}

использование

#include <stdio.h>
int f(int );
int main(){
    int c;
    scanf("%d",&c);
    f(c);
}

Вам не хватает + и - часть.
Оптимизатор

ах хорошо .... пропустить это
Abr001am

слишком долго :( ....
Abr001am

1

постоянный ток, 52

[Anq]sa[Fnq]sf[q]sn16o?A~rd9<ad6>f20r-n1+4/d1=n45r-P

Выход

$ for i in {0,20,65,72,75,80,99,102,864}; do printf "{%s -> %s} " $i $(dc -e '[Anq]sa[Fnq]sf[q]sn16o?A~rd9<ad6>f20r-n1+4/d1=n45r-P' <<< $i); done
{0 -> F} {20 -> F} {65 -> E} {72 -> D-} {75 -> D} {80 -> C-} {99 -> B+} {102 -> A} {864 -> A} $ 
$ 

1

TI-Basic, 79 74 76 байт

Input N
If N>99
105->N
sub("FFFFFFEDCBA",1+int(N.1),1
If Ans!="F
Ans+sub("---    +++",1+fPart(N.1),1
Ans

Это не работает для чисел меньше 10.
lirtosiast

Хороший улов, Том, он пропал без вести1+
Timtech

Это также имеет (невидимые) конечные пробелы, когда нет + или -.
lirtosiast

1

TI-BASIC, 69 68 66 байт

.1Ans
sub("F?E-E+D-D+C-C+B-B+A",1+2max(0,min(9,int(2Ans)-11)),int(e^(Ans<10 and Ans≥6 and iPart(2.2-5fPart(Ans

TI-BASIC не подходит для работы со строками.

Ввести на домашнем экране калькулятора в виде [число]: [название программы].

отформатирован:

.1Ans
sub(                      //Syntax for the substring command is sub(string, index, length)

    "F?E-E+D-D+C-C+B-B+A"                  //String that encodes possible grades

    ,1+2max(0,min(9,            ))         //Starts at "F" if input <60, "A" if >=100
                   int(2Ans)-11           //(Input-55)/5, so starts at "E" from 60 to 64,
                                          //second E from 65-69, D from 70 to 74, &c.

    ,int(e^(                                   //length 1 if false, 2 (includes +/-) if true
            Ans<10 and Ans≥6 and               //grade between 60 and 100        
                                 iPart(               //1 if abs. val. of below >= 0.2
                                       2.2-5fPart(Ans  //2.2-.5(last digit)    

Это, вероятно, может быть дальше.



0

JavaScript (ES6), 86 83 байта

Что на самом деле поглощает символы, так это String.fromCharCodeусловие +/- ... Я сильно подозреваю, что есть умный способ сократить хотя бы одного из них.

f=n=>n>99?'A':n<60?'F':String.fromCharCode(75.9-n/10|0)+(n%10<3?'-':n%10>6?'+':'');

Если вам нужен короткий код, String.fromCharCode почти всегда бесполезен. Использовать индексирование строк (см. Другие ответы по JavaScript)
edc65

Во всяком случае, ~~(.1*-n+75.9)->75.9-n/10|0
edc65

@ edc65 Спасибо за совет по игре в гольф! Я буду помнить индексирование строк для следующего случая.
ввые

0

PHP5.5, 73 байта

Еще раз, не самый короткий.

Но это работает!

<?=($n=$_GET[n])<59?F:($n>99?A:'BCDE'[$n[0]-6].'+-'[$n[1]<3?1:2*$n[1]<5])

Я классифицировал его как PHP5.5, а не только PHP, поскольку в нем используется синтаксис, действительный только для PHP5.5 и PHP5.6.

Вы можете прочитать о разыменовании строк и массивов в руководстве:
http://php.net/manual/en/migration55.new-features.php



0

Рубин, 58 байт

Не могу поверить, что здесь нет рубинов. Если подумать, то это похоже на то, что уже есть, но в любом случае:

->x{x<60?'F':x>99?'A':(75-x/10).chr+'+-'[(x+3)%10/3].to_s}

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


0

Excel, 100 байт

=IF(A1<60,"F",IF(A1>99,"A",MID("EDCB",INT(A1/10)-5,1)&IF(MOD(A1,10)<3,"-",IF(MOD(A1,10)>6,"+",""))))
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.