Ціле позначення в сорт


30

Враховуючи додатне ціле число (0 і вище, не максимум), перетворіть його в клас, дотримуючись цих правил:

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

Це здавалося трохи нудним, тому зробіть оцінку a, +якщо вона 7,8 або 9, а -якщо вона 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

Немає пробілів. Один новий рядок після виходу є прекрасним, але слідкуйте за цим. Функції та повні програми - це чудово.

Це кодовий гольф, тому найкоротший код виграє. На це надихнуло питання Задати Ubuntu: Як написати скрипт оболонки, щоб призначити класи літер числовим діапазонам? . Відповіді - у баші та пітоні, тому трохи спойлери.


Табло:

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

Щоб переконатися, що ваша відповідь відображається, будь ласка, почніть свою відповідь із заголовка, використовуючи наступний шаблон Markdown:

# 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 + / - / пробіл у рядок для останнього<
Optimizer

Це не повинно бути необхідним. Character String -штовхає струну.
Денніс

@Dennis Ах, ти маєш рацію. Я думаю, що для попередньої версії використання було іншим.
Оптимізатор

8

Сітківка, 43 + 15 = 58 байт

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

Сітчатка - це мова з регулярними виразками, створена Мартіном Бюттнером, де файли з непарними номерами - це регулярний вирівнювання, а парні файли - на що замінити. Кожен рядок - це окремий файл, тому я додав 15 байт для кожного додаткового файлу.

Пояснення

Починається з введення чого-небудь з 3 або більше цифр А. Він додає а, -якщо це двоцифрове число, що закінчується на 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;}

Ця функція приймає позначку як параметр і повертає оцінку як рядок, що закінчується NULL.

Пояснення

Додано пробіл:

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

Дивно, але це досить близько до рішення пітона.

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. Я зробив це шістнадцятковим, тому ми можемо бути впевнені, що жодних дивних \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 байти.
нутки

я повинен бути об'єктивним і застосовувати це :) вітаю, ти перебив усі записи 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. Тепер, щоб позбутися від ifelses . Позбувся 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

@ThisSuitIsBlackNot дякую! Оновлено
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-й пункт, якщо "Неправда" - перший.
Тім

Гарна ідея! Додав це.
Передача

Я думаю, ви можете використовувати потрійні, якщо висловлювання, наприклад, return <condition> ? <true result> : <false result>Примітка, ви також можете їх вкластиreturn <condition> ? <true result> : <condition> ? <2nd true result> : < 2nd false result>
DarcyThomas

1

Haskell, 78 байт

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

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

Пояснення

Оператор #- це скорочення для створення n копій другого аргументу. Список a- це нескінченний список рядків "А". Функція fіндексує список усіх класів для n = 0,1, ... Зрозуміння списку будує "середню частину" цього списку (класи від E до B); g- це єдиний Char, який попередньо додається до String 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

DC, 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.
ліртосіант

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

Тут також є (невидимі) пробіли, коли немає + або -.
ліртосіаст

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.