ทำเครื่องหมายจำนวนเต็มเป็นเกรด


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

ไม่มีช่องว่างต่อท้าย บรรทัดใหม่หนึ่งบรรทัดหลังจากเอาต์พุตไม่เป็นไร แต่ให้สอดคล้องกัน ฟังก์ชั่นและโปรแกรมเต็มรูปแบบมีทั้งที่ดี

นี่คือรหัสกอล์ฟดังนั้นรหัสที่สั้นที่สุดจึงชนะ สิ่งนี้ได้รับแรงบันดาลใจจากคำถามถามของ Ubuntu ว่าจะเขียนเชลล์สคริปต์เพื่อกำหนดเกรดตัวอักษรให้กับช่วงตัวเลขได้อย่างไร . คำตอบอยู่ในทุบตีและหลามดังนั้นสปอยเลอร์เล็กน้อย


ลีดเดอร์บอร์ด:

นี่คือตัวอย่างข้อมูลเพื่อสร้างทั้งกระดานผู้นำปกติและภาพรวมของผู้ชนะตามภาษา

เพื่อให้แน่ใจว่าคำตอบของคุณปรากฏขึ้นโปรดเริ่มคำตอบด้วยหัวข้อโดยใช้เทมเพลต Markdown ต่อไปนี้:

# Language Name, N bytes

ที่Nมีขนาดของส่งของคุณ หากคุณปรับปรุงคะแนนของคุณคุณสามารถเก็บคะแนนเก่าไว้ในพาดหัวโดยการตีพวกเขาผ่าน ตัวอย่างเช่น

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


1
จะไม่ได้มีเป็นA+และA-? ฉันไม่เห็นว่าทำไมเราถึงเพิกเฉย
ASCIIThenANSI

1
@ASCIIThenANSI ทำให้มันน่าสนใจมากขึ้นที่จะมีข้อยกเว้นและมีสูงสุดสำหรับไม่มีจึงไม่มี+
ทิม

1
คณะกรรมการจัดหมวดหมู่นั้นมีข้อผิดพลาด: รุ่นปลาเก่ากว่าและคำตอบของฉันอยู่ก่อนหน้า
Ismael Miguel

@IsmaelMiguel มันถูกเขียนขึ้นเมื่อโพสต์แรกสุดยังไม่ได้เป็นตัวเริ่มต้นของไทเกอร์เบรกเกอร์ ฉันจะพยายามแก้ไขในบางจุดแม้ว่า (อาจไม่ใช่สำหรับการท้าทายนี้ แต่อย่างน้อยก็แหล่งที่มาบนเมตา)
Martin Ender

@ MartinBüttnerฉันแค่ชี้มันออกมา
Ismael Miguel

คำตอบ:


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 แปลงอักขระถ่าน + / - / ช่องว่างเป็นสตริงสุดท้าย<
เครื่องมือเพิ่มประสิทธิภาพ

นั่นไม่จำเป็น Character String -ดันสตริง
เดนนิส

@Dennis Ah คุณพูดถูก ฉันคิดว่าสำหรับบางรุ่นก่อนหน้าการใช้งานแตกต่างกัน
เครื่องมือเพิ่มประสิทธิภาพ

8

เรติน่า, 43 + 15 = 58 ไบต์

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

Retinaเป็นภาษา regex ที่สร้างโดย Martin Büttnerซึ่งไฟล์ที่มีเลขคี่นั้นเป็น regex เพื่อให้ตรงกับและไฟล์ที่มีเลขคู่คือสิ่งที่จะแทนที่ด้วย แต่ละบรรทัดเป็นไฟล์แยกกันดังนั้นฉันจึงเพิ่ม 15 ไบต์สำหรับแต่ละไฟล์เพิ่มเติม

คำอธิบาย

มันเริ่มต้นด้วยการทำทุกอย่างด้วย 3 หลักหรือมากกว่าและมันจะเพิ่ม a -ถ้ามันเป็นตัวเลขสองหลักที่ลงท้ายด้วย 0, 1, หรือ 2 และ+ถ้ามันลงท้ายด้วย 7, 8 หรือ 9 ตัวเลขจะถูกจับคู่กับ คะแนนของพวกเขา (เช่นตัวเลขที่ขึ้นต้นด้วย 9 จะได้รับ B) หมายเลขใด ๆ ที่เหลืออยู่จะเป็นแบบอัตโนมัติแต่น่าเสียดายที่;`จะต้องมีการเติมให้ทั้งหมดอัปเดต: เวอร์ชัน 0.5.0 มีการปิดเอาต์พุตระดับกลางตามค่าเริ่มต้นทำให้ฉันสามารถบันทึกได้สองสามไบต์


คุณแน่ใจหรือว่ามันไม่ได้ส่งออก + และ - สำหรับเคส F?
Tim

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

สมบูรณ์แบบ :) ไม่มีอะไรผิดปกติ
ทิม

ความแตกต่างระหว่างรหัส ur และเหมืองเป็นหนึ่งในคำว่า "printf" ที่ควรจะประหยัดมากขึ้นกว่า 3 byts ในกรณีละเว้น :)
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'\

วิธี:

  • เราอ่าน codepoints ของ 3 ตัวแรกx,y,zจากอินพุต หากตัวละครไม่ได้แสดงค่าของตัวแปรจะเป็น-1นัย ( ord(c)จะทำเครื่องหมาย codepoint ของตัวละคร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 ฉันทำให้เป็น 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

ฉันจะต้องเป็นเป้าหมายและอัปเดตสิ่งนี้ :) ขอแสดงความยินดีคุณ beated บันทึก C ทั้งหมด
Abr001am

6

CJam, 41 39 37 34 bytes

มันยาวเกินไป แต่ฉันไม่คิดว่าฉันจะตีมันเพิ่มอีกในตอนนี้

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.




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='')

แก้ไขลดลงสองifs คงกรณีและผลที่ไม่ถูกต้องสำหรับ 100 ตอนนี้ได้รับการกำจัดของifelse s ได้กำจัดifelses


ฉันคิดว่าคุณต้องการมากกว่าLETTERS letters
Alex A.

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

เพียงส่งเกรดเป็นสตริงและมันจะคืนค่าเป็นตัวอักษรเกรด

ส่วนสตริงในมากสิ่งที่สำคัญ

คุณสามารถตรวจสอบ testcase ได้ที่นี่:

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." ฉันคิดว่ามันสอดคล้องกันพอสมควร
Ismael Miguel

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?"-":"");}

ฉันพยายามที่จะฉลาดขึ้นด้วยการทำ mods number ASCII แต่ดูเหมือนว่าฉันไม่ได้อยู่คนเดียว!

ขอบคุณทิมสำหรับคำแนะนำในรายการแทน ifs

ขอบคุณ DarcyThomas ที่ชี้ให้เห็นว่าฉันสามารถใช้โอเปอร์เรเตอร์ที่ซ้อนอยู่


1
คุณไม่สามารถลดจำนวนการใช้รายการได้หรือไม่?
Tim

ฉันไม่แน่ใจว่าคุณหมายถึงอะไรโดยใช้รายการคุณช่วยอธิบายหน่อยได้ไหม?
ส่ง

[item1,item2][condition]ในหลามผมสามารถทำเช่นนี้: หากเงื่อนไขเป็นจริงมันจะให้รายการที่ 2 หากเท็จเป็นครั้งแรก
ทิม

ความคิดที่ดี! เสริมว่า
ส่ง

ฉันคิดว่าคุณสามารถใช้ ternary ถ้างบเช่น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เป็นรายการที่ไม่มีที่สิ้นสุดของสตริง "A" fดัชนีฟังก์ชั่นในรายการของคะแนนทั้งหมดสำหรับ n = 0,1, ... ความเข้าใจในรายการสร้าง "ส่วนตรงกลาง" ของรายการนี้ (คะแนน E ถึง B); gเป็น Char ตัวเดียวที่ต่อท้ายสตริง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

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 เกือบจะไร้ประโยชน์เสมอ ใช้การจัดทำดัชนีสตริง (ดูคำตอบจาวาสคริปต์อื่น ๆ )
edc65

อย่างไรก็ตาม~~(.1*-n+75.9)->75.9-n/10|0
edc65

@ edc65 ขอบคุณสำหรับคำแนะนำการเล่นกอล์ฟ! ฉันจะทำดัชนีสตริงในใจสำหรับโอกาสต่อไป
vvye

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}

ลองที่นี่


โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.