등급으로의 정수 마크


30

양의 정수 (0 이상, 최대 값 없음)가 주어지면 다음 규칙에 따라 등급으로 변환하십시오.

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

약간 지루한 느낌이 들었으므로 +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

후행 공백이 없습니다. 출력 후 하나의 줄 바꿈은 좋지만 일관성을 유지하십시오. 기능과 전체 프로그램은 괜찮습니다.

이것은 코드 골프이므로 가장 짧은 코드가 승리합니다. 이것은 Ubuntu Ask 질문에서 영감을 받았습니다. 문자 등급을 숫자 범위에 할당하는 쉘 스크립트를 작성하는 방법은 무엇입니까? . 대답은 bash와 python에 있으므로 약간 스포일러입니다.


리더 보드 :

다음은 일반 리더 보드와 언어 별 수상자 개요를 생성하는 스택 스 니펫입니다.

답변이 표시되도록하려면 다음 마크 다운 템플릿을 사용하여 헤드 라인으로 답변을 시작하십시오.

# Language Name, N bytes

N제출물의 크기는 어디에 있습니까 ? 당신이 당신의 점수를 향상시킬 경우에, 당신은 할 수 있습니다 를 통해 눈에 띄는에 의해, 헤드 라인에 오래된 점수를 유지한다. 예를 들어 :

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


1
거기에하지 않을까요 A+A-? 왜 우리가 그것들을 무시하는지 모르겠습니다.
ASCIIThenANSI

1
@ASCIIThenANSI는 더 흥미로운 예외가 할 수없는,하고 A에 대한 최대 그래서,이 없다+

1
분류 보드에 버그가 있습니다. 물고기 버전이 오래되었고 제 대답은 그 이전입니다.
Ismael Miguel

@IsmaelMiguel 가장 빠른 게시물이 아직 기본 타이 브레이커가 아니었을 때 작성되었으므로 전혀 관계가 없습니다. 나는 어느 시점에서 그것을 고치려고 노력할 것입니다 (아마도이 ​​도전은 아니지만 메타의 소스).
마틴 엔더

@ MartinBüttner 방금 지적했습니다.
Ismael Miguel

답변:


21

파이썬 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.

업데이트 : Dennis의 포인터 덕분에 1 바이트 절약

여기에서 온라인으로 사용해보십시오


무엇을 s합니까?
Dennis

@Dennis는 char + /-/ space를 마지막 문자열로 변환합니다<
Optimizer

그럴 필요는 없습니다. Character String -문자열을 푸시합니다.
데니스

@ 데니스 아, 맞아. 이전 버전의 경우 사용법이 다르다고 생각합니다.
Optimizer

8

망막, 43 + 15 = 58 바이트

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

Retina 는 Martin Büttner가 만든 정규 표현식 언어이며 홀수 번호의 파일은 일치하는 정규 표현식이며 짝수 번호의 파일은 대체됩니다. 각 줄은 별도의 파일이므로 각 추가 파일에 15 바이트를 추가했습니다.

설명

3 자리 이상의 숫자를 A로 시작하여 시작합니다. -0, 1 또는 2로 끝나는 두 자리 숫자 인 경우 a를 추가하고 +7, 8 또는 9로 끝나는 경우 숫자를 매핑합니다. 그들의 등급 (예 : 9로 시작하는 숫자는 B로 주어짐). 남은 숫자는 자동으로 F입니다. 불행히도 ;`중간 출력을 억제하려면 마지막 정규식 앞에 모든 문자를 추가해야합니다. 업데이트 : 버전 0.5.0은 기본적으로 중간 출력이 꺼져있어 몇 바이트를 절약 할 수 있습니다.


F의 경우 +와-를 출력하지 않습니까?
Tim

1
@Tim 포함 된 \d.*전체 문자열을 일치시키고 대치 하기 때문에해서는 안됩니다 +.
NinjaBearMonkey

알았어-이제 볼 수있어! :)
Tim

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

전역 변수는 자동으로 0으로 초기화되므로 b는 NULL로 채워집니다. 처음 두 문자 만 건 드리기 때문에 등급에 문자가 하나만 있으면 b [1]에 NULL을 넣는 것에 대해 걱정할 필요가 있습니다. 이 NULL은 함수의 맨 처음에 삽입됩니다. n 매개 변수는 내재적으로 int입니다. 성적이 60보다 작 으면 'F'로 설정되고 99보다 크면 'A'로 설정됩니다. 다른 경우에는 기본 등급이로 주어 지므로 다음 'E' - (n - 60) / 10과 같이 단순화됩니다 75 - n / 10.n % 10마크의 단위 자리수를 가져옵니다. 3보다 작 으면 a-가 추가되고, 6보다 큰 경우 a +가 추가되고, 그렇지 않으면 b [1]은 null입니다 (이미 존재 함).

테스트 사례

#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

완벽 :) 아무 문제가 없습니다.
Tim

UR 코드와 나의 차이입니다 :) 무시 경우 3 개 이상 byts을 저장해야 하나의 단어 "의 printf"
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'\

방법:

  • x,y,z입력에서 처음 3 자의 코드 포인트를 읽습니다 . 문자가 없으면 변수 값이 -1내재적으로됩니다. ( ord(c)캐릭터의 코드 포인트를 표시합니다c )
  • 만약 z > 0(3 자리 입력) 인쇄 A하고 종료합니다.
  • 만약 x < ord('6') or y < 0(입력 <60) 인쇄 F하고 종료합니다.
  • codepoint로 문자를 인쇄하십시오 123 - x.
  • y < ord('4') print-` 인 경우 종료하십시오.
  • y > ord('6') print+`인 경우 종료하십시오.
  • 출구.

7

C, 67 65

놀랍게도 이것은 파이썬 솔루션과 매우 비슷합니다.

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

그러나이 프로그램이 그렇게 짧은 시간에 도달하기 위해서는 다음과 같은 희생이 필요했습니다.

  • 경우 F또는이 A인쇄 printf에도 전달 된 다른 인수에 보이지 않는다. 이것은 꽤 불쾌한 해킹입니다.

  • (i%10+1)/4평가가 1아닌 경우 ( 등급에 추가 +하거나 -추가 하지 않아야 함) %s포맷터는 \0바이트에 대한 포인터를 수신 하므로 아무 것도 인쇄되지 않습니다. 또한 인덱스 문자열 리터럴의 주소를 취할 수 있다는 것을 몰랐기 때문에 매우 재미 있습니다. (예 :) &"string"[i]( 편집 : "string"+i짧습니다 ! 감사합니다 @nutki)

여기에 57에서 102까지의 숫자에 대한 프로그램의 출력이 있습니다. 16 진수 덤프로 만들었으므로 이상한 \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"+i2 바이트를 절약 할 수있는 짧은 것과 같으므로 불필요 합니다.
nutki

내가 객관적이 :) 축하를 upovote해야하며, u는 모든 C 기록 beated
Abr001am을

6

CJam, 41 39 37 34 바이트

이것은 너무 길지만 지금은 더 이상 골프를 칠 것이라고 생각하지 않습니다.

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

여기에서 테스트하십시오. 또는 여기에서 모든 테스트 사례를 실행하십시오.

Optimizer가 3 바이트를 절약했습니다.

설명

(약간 구식)

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 바이트

+ 1은 -r 매개 변수를위한 것입니다.

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

5

파이썬 2, 94 88 84 69 바이트

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

5

자바 스크립트 (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 bytes

Not a very good effort I'm afraid, but I will try and golf it more later.

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

Edit Dropped a couple of ifs. Fixed the case and an incorrect result for 100. Now to get rid of the ifelses. Got rid of ifelses.


I think you want LETTERS rather than letters.
Alex A.

3

Perl, 66 62 bytes

This can probably be golfed more. Also a different way might be better.

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

+1 for -p

Run with:

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

Why not use -p and drop the say?
ThisSuitIsBlackNot

@ThisSuitIsBlackNot thanks! Updated
hmatt1

2

Javascript (ES6), 78 79 bytes

This really isn't the smartest option, but I did what I could.

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

Simply pass the grade as a string, and it will return it's grade letter.

The string part in very important.

You can check a testcase here:

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>

If the aditional space after the letter isn't allowed, I will happily remove it. It wasn't! This increased my code by 1 byte, but nothing (too) serious.


1
@Tim Fixed it. I hope it is enough. Quoting yourself: "One newline after output is fine, but keep it consistent.". I think that is consistent enough.
Ismael Miguel

2

C#, 143 127 112 88 bytes

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

I tried to be clever by doing ASCII number mods, but it seems I wasn't alone!

Thanks to Tim for advice on lists instead of ifs.

Thanks to DarcyThomas for pointing out I could use nested ternary operators.


1
Can you not cut down on the ifs using lists?
Tim

I'm not sure what you mean by using lists, could you explain a little?
Transmission

In python I can do this: [item1,item2][condition]. If the condition is True it gives the 2nd item, if False the first.
Tim

Good idea! Added that.
Transmission

I think you could use ternary if statements e.g., return <condition> ? <true result> : <false result> Note you can also nest them so return <condition> ? <true result> : <condition> ? <2nd true result> : < 2nd false result>
DarcyThomas

1

Haskell, 78 bytes

The first line feels wasteful, costing 14 bytes, but I couldn't find a shorter version without it.

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

Explanation

The operator # is a shorthand for creating n copies of its second argument. List a is an infinite list of Strings "A". Function f indexes into a list of all grades for n=0,1,... The list comprehension builds the "middle part" of this list (grades E to B); g is a single Char that is prepended to the String s (which may be empty).

Usage

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

1

C, 102 bytes

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

}

Usage

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

You are missing the + and - part.
Optimizer

ah ok .... miss that
Abr001am

too long :( ....
Abr001am

1

dc, 52

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

Output

$ 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 Bytes

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

That does not work for numbers less than 10.
lirtosiast

Nice catch, Tom, it was missing 1+
Timtech

This also has (invisible) trailing spaces whenever there is no + or -.
lirtosiast

1

TI-BASIC, 69 68 66 bytes

.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 is not good for string manipulation.

Input on the calculator homescreen, in the form of [number]:[program name].

Formatted:

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

This can probably be golfed further.


0

C#, 82 bytes

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

Here's a fiddle with some test-cases.


0

JavaScript (ES6), 86 83 bytes

What's really eating up characters is the String.fromCharCode and the +/- condition... I strongly suspect there's a clever way to shorten at least one of them.

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

If you want short code, String.fromCharCode is almost always useless. Use string indexing (see the other javascript answers)
edc65

Anyway, ~~(.1*-n+75.9) --> 75.9-n/10|0
edc65

@edc65 Thanks for the golfing advice! I'll keep string indexing in mind for the next occasion.
vvye

0

PHP5.5, 73 bytes

Once again, not the shortest one.

But it works!

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

I've classified it under PHP5.5 instead of just PHP since this uses syntax that is only valid for PHP5.5 and PHP5.6.

You can read about string and array dereferencing in the manual:
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 Bytes

Couldn't believe that there are no Ruby ones here. On reflection it's fairly similar to some that are here already but anyway:

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

Try it here


0

Excel, 100 bytes

=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,"+",""))))
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.