Znak liczby całkowitej do oceny


30

Biorąc pod uwagę dodatnią liczbę całkowitą (0 i więcej, bez maksimum), zamień ją na ocenę zgodnie z następującymi zasadami:

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

To wydawało się trochę nudne, więc zrób ocenę a, +jeśli jest to 7,8 lub 9, a a -jeśli to 0,1 lub 2. Zignoruj ​​to dla przypadków F i A.

Przykład:

Wkład:

65

Wydajność:

E

Przypadki testowe:

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

Brak spacji końcowych. Jedna nowa linia po wyjściu jest w porządku, ale zachowaj spójność. Funkcje i pełne programy są w porządku.

To jest kod golfowy, więc wygrywa najkrótszy kod. Inspiracją było pytanie Ask Ubuntu: Jak napisać skrypt powłoki, aby przypisać oceny literowe do zakresów liczbowych? . Odpowiedzi są w bash i python, więc nieco spoilery.


Tabela liderów:

Oto fragment kodu, który pozwala wygenerować zarówno zwykłą tabelę wyników, jak i przegląd zwycięzców według języka.

Aby upewnić się, że twoja odpowiedź się pojawi, zacznij od nagłówka, korzystając z następującego szablonu Markdown:

# Language Name, N bytes

gdzie Njest rozmiar twojego zgłoszenia. Jeśli poprawić swój wynik, to może zachować stare porachunki w nagłówku, uderzając je przez. Na przykład:

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


1
Czy nie byłoby A+i A-? Nie rozumiem, dlaczego je ignorujemy.
ASCIIThenANSI

1
@ASCIIThenANSI sprawia, że ​​bardziej interesujące są wyjątki, a dla A nie ma maksimum, więc nie+
Tim

1
Ta tablica klasyfikacyjna ma błąd: wersja ryby jest starsza, a moja odpowiedź jest wcześniej.
Ismael Miguel

@IsmaelMiguel Zostało napisane, gdy najwcześniejszy post nie był jeszcze domyślnym przerywnikiem remisów (więc w ogóle nie zamawia remisów). Spróbuję to naprawić w pewnym momencie (prawdopodobnie nie dla tego wyzwania, ale przynajmniej źródło meta).
Martin Ender

@ MartinBüttner Właśnie zwróciłem na to uwagę.
Ismael Miguel

Odpowiedzi:


21

Python 2, 72 70 62 bajtów

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

Jest to anonimowa funkcja, która pobiera liczbę całkowitą i zwraca ocenę jako ciąg znaków.

(podziękowania dla @ MartinBüttner, @grc i @TheNumberOne za wskazówki)


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

Cóż za sprytny sposób na wybranie postaci, która może być pusta!
xnor

11

CJam, 34 33 32 bajty

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

OK, próbowałem już wielu podejść i nie jestem w stanie uzyskać tego poniżej 33, więc oto wyjaśnienie:

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.

AKTUALIZACJA : 1 bajt zapisany dzięki wskaźnikowi Dennisa

Wypróbuj online tutaj


Czego szrobić?
Dennis

@Dennis konwertuje char + / - / spację do łańcucha dla ostatniego<
Optimizer

To nie powinno być konieczne. Character String -popycha ciąg.
Dennis

@Dennis Ah, masz rację. Myślę, że w przypadku niektórych poprzednich wersji użycie było inne.
Optymalizator

8

Siatkówka, 43 + 15 = 58 bajtów

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

Retina to język wyrażeń regularnych stworzony przez Martina Büttnera, w którym nieparzyste pliki są wyrażeniami regularnymi do dopasowania, a pliki o liczbach parzystych są tym, co należy zastąpić. Każda linia to osobny plik, więc do każdego dodatkowego pliku dodałem 15 bajtów.

Wyjaśnienie

Zaczyna się od zrobienia czegokolwiek z 3 lub więcej cyframi A. Dodaje, -jeśli jest to dwucyfrowa liczba kończąca się na 0, 1 lub 2, a +jeśli kończy się na 7, 8 lub 9. Liczby są następnie mapowane na ich ocena (np. liczba rozpoczynająca się od 9 otrzymuje B). Każda pozostała liczba jest automatycznie oznaczona literą F. Niestety, ;`musi zostać dodana do wszystkich oprócz ostatniego wyrażenia regularnego, aby stłumić pośrednie wyjście. Aktualizacja: wersja 0.5.0 ma domyślnie wyłączone wyjście pośrednie, co pozwala mi zaoszczędzić kilka bajtów.


Czy jesteś pewien, że nie wyprowadza on + i - w przypadku F?
Tim

1
@Tim Nie powinno tak być, ponieważ \d.*dopasowuje i zastępuje cały ciąg znaków +.
NinjaBearMonkey

Ahh dobrze - teraz to widzę! :)
Tim

8

C, 99 bajtów

Jestem tu nowy, mam nadzieję, że przestrzegam zasad.

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;}

Ta funkcja przyjmuje znak jako parametr i zwraca ocenę jako ciąg zakończony znakiem NULL.

Wyjaśnienie

Dodano białe znaki:

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;
}

Zmienne globalne są automatycznie inicjowane na zero, więc b jest wypełnione zerami. Ponieważ dotykane są tylko pierwsze dwie postacie, musimy się martwić o wstawienie NULL wb [1], jeśli ocena ma tylko jedną postać. Ten NULL jest wstawiany na samym początku funkcji. Parametr n jest domyślnie int. Jeśli ocena jest mniejsza niż 60, to jest ustawiona na „F”, jeśli jest większa niż 99, jest ustawiona na „A”. W innych przypadkach ocena bazowa jest podana przez 'E' - (n - 60) / 10, co upraszcza 75 - n / 10.n % 10pobiera cyfrę jednostki znaku. Jeśli jest mniejsza niż 3, to dołącza się a -, jeśli jest większa niż 6, dodaje się a +, w przeciwnym razie b [1] jest zerowane (co już było).

Przypadki testowe

#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

Idealnie :) Nic złego.
Tim

różnica między twoim kodem a moim to jedno słowo „printf”, które powinno zaoszczędzić więcej niż 3 bajty na wypadek zignorowania :)
Abr001am

7

Pyth, 33 bajty

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

Wypróbuj online: pakiet demonstracyjny lub testowy

Wyjaśnienie:

                                     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

> <> (Ryba), 78 71 bajtów

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

Metoda:

  • Odczytujemy współrzędne pierwszych 3 znaków x,y,zz wejścia. Jeśli znak nie jest obecny, wartość jego zmiennej będzie -1niejawna. ( ord(c)zaznaczy punkt kodowy znaku c)
  • Jeśli z > 0(3 cyfry) wydrukuj Ai wyjdź.
  • Jeśli x < ord('6') or y < 0(wprowadź <60) wydrukuj Fi wyjdź.
  • Wydrukuj znak za pomocą punktu kodowego 123 - x.
  • Jeśli y < ord('4') print-` i wyjdź.
  • Jeśli y > ord('6') print+ `i wyjdź.
  • Wyjście.

7

C, 67 65

Zaskakujące jest to dość zbliżone do rozwiązania python.

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

Aby jednak ten program doszedł do tak krótkiego czasu, trzeba było poświęcić:

  • Jeśli drukowany jest an Flub an, nawet nie patrzy na pozostałe przekazane argumenty. To dość paskudny hack.Aprintf

  • Jeśli (i%10+1)/4wartość jest równa 1(nie +lub -powinna być dołączona do oceny), %sformatyzator otrzymuje wskaźnik do \0bajtu, więc nic nie jest drukowane. Również dość zabawne, ponieważ nie wiedziałem, że możesz wziąć adres zindeksowanego łańcucha literału. (np. &"string"[i]) ( edycja : "string"+ijest jeszcze krótsza ! Dzięki @nutki)

Tutaj wynik programu dla liczb od 57 do 102. Zrobiłem go jako zrzut heksadecymalny, więc możemy być pewni, że nie \0zostały wydrukowane żadne dziwne bajty.

% 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

Zastosowana mainmetoda:

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

1
&"string"[i]jest niepotrzebny, ponieważ odpowiada krótszemu, "string"+idzięki któremu można zapisać 2 bajty.
nutki

muszę być obiektywny i upomnieć się o to :) gratulacje, pobiłeś wszystkie rekordy C
Abr001am

6

CJam, 41 39 37 34 bajtów

To zdecydowanie za długo, ale nie sądzę, żebym teraz grał w golfa.

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

Sprawdź to tutaj. Lub uruchom tutaj wszystkie przypadki testowe.

Trzy bajty zapisane przez Optymalizator.

Wyjaśnienie

(Nieco przestarzałe)

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.

6

GNU sed, 73 + 1 = 74 bajty

+ 1 dotyczy parametru -r.

s/^[1-5]?.$/F/
s/.{3,}/A/
s/[7-9]$/+/
s/[3-6]$//
s/[0-2]$/-/
y/9876/BCDE/

5

Python 2, 94 88 84 69 bajtów

lambda g:g>99and'A'or[chr(75-g/10)+'-+'[g%10>2:1-(g%10>6)],'F'][g<60]

5

JavaScript (ES6), 66 bajtów

Prosto.

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 bajtów

Obawiam się, że to niezbyt dobry wysiłek, ale spróbuję zagrać w golfa później.

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

Edytuj Upuściłem kilka ifs. Naprawiono skrzynkę i nieprawidłowy wynik dla 100. Teraz pozbyć się ifelses . Pozbyłem się ifelses.


Myślę, że LETTERSraczej chcesz letters.
Alex A.

3

Perl, 66 62 bajtów

To może być bardziej golfa. Również inny sposób może być lepszy.

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

+1 dla -p

Biegnij z:

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

Dlaczego nie użyć -pi upuścić say?
ThisSuitIsBlackNot 10'15

@ThisSuitIsBlackNie dziękuję! Zaktualizowano
hmatt1

2

JavaScript (ES6), 78 79 bajtów

To naprawdę nie jest najmądrzejsza opcja, ale zrobiłem, co mogłem.

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])

Po prostu zdaj ocenę jako ciąg , a ona zwróci jej literę oceny.

Część smyczkowa jest bardzo ważna jest .

Możesz sprawdzić walizkę testową tutaj:

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>

Jeśli dodatkowe miejsce po literze nie jest dozwolone, chętnie go usunę. Nie było! To zwiększyło mój kod o 1 bajt, ale nic (zbyt) poważnego.


1
@Tim Naprawiono. Mam nadzieję, że to wystarczy. Cytując siebie: „ One newline after output is fine, but keep it consistent.”. Myślę, że to wystarczająco spójne.
Ismael Miguel

2

C #, 143 127 112 88 bajtów

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

Próbowałem być sprytny, modyfikując liczby ASCII, ale wygląda na to, że nie byłem sam!

Dzięki Timowi za porady na temat list zamiast ifs.

Dzięki DarcyThomas za wskazanie, że mogłem użyć zagnieżdżonych operatorów trójskładnikowych.


1
Czy nie możesz zmniejszyć liczby ifs za pomocą list?
Tim

Nie jestem pewien, co masz na myśli mówiąc o listach, czy mógłbyś coś wyjaśnić?
Transmisja

W Pythonie mogę to zrobić: [item1,item2][condition]. Jeśli warunek jest spełniony, to daje 2-szy przedmiot, a Fałsz pierwszy.
Tim

Dobry pomysł! Dodano to.
Transmisja

Myślę, że można by użyć trójskładnikowych instrukcji, np. return <condition> ? <true result> : <false result>Uwaga: można je także zagnieżdżaćreturn <condition> ? <true result> : <condition> ? <2nd true result> : < 2nd false result>
DarcyThomas

1

Haskell, 78 bajtów

Pierwszy wiersz wydaje się marnotrawny, kosztuje 14 bajtów, ale bez niego nie mogłem znaleźć krótszej wersji.

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

Wyjaśnienie

Operator #jest skrótem do tworzenia n kopii drugiego argumentu. Lista ajest nieskończoną listą ciągów „A”. Funkcja findeksuje do listy wszystkich ocen dla n = 0,1, ... Zrozumienie listy buduje „środkową część” tej listy (oceny od E do B); gjest pojedynczym Char, który jest dołączony do ciągus (który może być pusty).

Stosowanie

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

1

C, 102 bajty

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)));

}

Stosowanie

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

Brakuje części + i -.
Optymalizator

ah ok .... tęsknię
Abr001am

za długo :( ....
Abr001am

1

dc, 52

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

Wydajność

$ 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 bajtów

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

To nie działa dla liczb mniejszych niż 10.
lirtosiast

Niezły chwyt, Tom, brakowało1+
Timtech

Ma także (niewidoczne) końcowe spacje, gdy nie ma znaku + ani -.
lirtosiast

1

TI-BASIC, 69 68 66 bajtów

.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 nie jest dobry do manipulacji ciągami.

Wprowadź dane na ekranie głównym kalkulatora w postaci [liczba]: [nazwa programu].

Sformatowany:

.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)    

Prawdopodobnie można to jeszcze pograć w golfa.


0

C #, 82 bajty

Func<int,string>g=s=>s>99?"A":s<60?"F":(char)(75-s/10)+(s%10<3?"-":s%10>6?"+":"");

Oto skrzypce z niektórymi przypadkami testowymi.


0

JavaScript (ES6), 86 83 bajtów

To, co naprawdę zjada postacie, to String.fromCharCodewarunek +/- ... Podejrzewam, że istnieje sprytny sposób na skrócenie co najmniej jednego z nich.

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

Jeśli chcesz mieć krótki kod, String.fromCharCode jest prawie zawsze bezużyteczny. Użyj indeksowania ciągów (zobacz inne odpowiedzi na javascript)
edc65

W każdym razie, ~~(.1*-n+75.9)->75.9-n/10|0
edc65

@ edc65 Dzięki za radę golfa! Będę pamiętać o indeksowaniu łańcuchów na następną okazję.
vvye

0

PHP 5.5, 73 bajty

Jeszcze raz nie najkrótszy.

Ale to działa!

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

Sklasyfikowałem go pod PHP5.5, a nie tylko PHP, ponieważ korzysta ze składni, która jest poprawna tylko dla PHP5.5 i PHP5.6.

O wykreślaniu łańcuchów i tablic można przeczytać w instrukcji:
http://php.net/manual/en/migration55.new-features.php


0

Perl, 52

#!perl -p
$_=$_>99?A:$_<60?F:"$_"^"s";y/JK7890-6/BC+++\-\--/d

0

Ruby, 58 bajtów

Nie mogłem uwierzyć, że nie ma tu rubinów. Po zastanowieniu jest dość podobny do niektórych, które już tu są, ale i tak:

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

Wypróbuj tutaj


0

Excel, 100 bajtów

=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,"+",""))))
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.