Tanda integer ke kelas

30

Diberikan bilangan bulat positif (0 dan di atas, tidak ada maksimum), ubah menjadi nilai dengan aturan berikut:

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

Ini terasa agak membosankan, jadi buat nilai a +jika itu 7,8 atau 9 dan a -jika itu 0,1 atau 2. Abaikan ini untuk kasus F dan A.

Sebuah contoh:

Memasukkan:

65

Keluaran:

E

Kasus uji:

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

Tidak ada spasi tambahan. Satu baris baru setelah keluaran baik-baik saja, tetapi tetap konsisten. Fungsi dan program lengkap keduanya baik-baik saja.

Ini kode golf, jadi kode terpendek menang. Ini terinspirasi oleh pertanyaan Tanya Ubuntu, Bagaimana menulis skrip shell untuk menetapkan nilai huruf ke rentang numerik? . Jawabannya ada dalam bash dan python, jadi sedikit spoiler.


Papan peringkat:

Berikut ini adalah Stack Snippet untuk menghasilkan leaderboard biasa dan gambaran umum pemenang berdasarkan bahasa.

Untuk memastikan bahwa jawaban Anda muncul, silakan mulai jawaban Anda dengan tajuk utama, menggunakan templat Penurunan harga berikut:

# Language Name, N bytes

di mana Nukuran kiriman Anda. Jika Anda meningkatkan skor Anda, Anda dapat menyimpan skor lama di headline, dengan mencoretnya. Contohnya:

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

Tim
sumber
1
Bukankah akan ada A+dan A-? Saya tidak mengerti mengapa kita mengabaikan mereka.
ASCIIThenANSI
1
@ASCIIThenANSI membuatnya lebih menarik untuk memiliki pengecualian, dan tidak ada maksimum untuk A, jadi tidak ada+
Tim
1
Papan klasifikasi itu memiliki bug: versi ikan lebih tua dan jawaban saya ada sebelum itu.
Ismael Miguel
@IsmaelMiguel Ditulis saat postingan paling awal belum menjadi tie breaker default (jadi tidak ada ikatan sama sekali). Saya akan mencoba untuk memperbaikinya di beberapa titik (mungkin bukan untuk tantangan ini, tetapi setidaknya sumber pada meta).
Martin Ender
@ MartinBüttner Saya baru saja menunjukkannya.
Ismael Miguel

Jawaban:

21

Python 2, 72 70 62 byte

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

Ini adalah fungsi anonim yang mengambil int dan mengembalikan nilai sebagai string.

(terima kasih kepada @ MartinBüttner, @grc dan @TheNumberOne untuk tips)

Sp3000
sumber
4
"EDCB"[n/10-6]->chr(75-n/10)
grc
Alangkah cerdiknya memilih karakter yang mungkin kosong!
xnor
11

CJam, 34 33 32 byte

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

Oke, saya sudah mencoba beberapa pendekatan sekarang dan saya tidak bisa mendapatkan ini di bawah 33, jadi begini penjelasannya:

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.

UPDATE : 1 byte disimpan berkat pointer oleh Dennis

Cobalah online di sini

Pengoptimal
sumber
Apa yang sdilakukan?
Dennis
@Dennis mengonversi char + / - / space ke string untuk yang terakhir<
Pengoptimal
Seharusnya itu tidak perlu. Character String -mendorong string.
Dennis
@ Dennis Ah, kamu benar. Saya pikir untuk beberapa versi sebelumnya, penggunaannya berbeda.
Pengoptimal
8

Retina, 43 + 15 = 58 byte

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

Retina adalah bahasa regex yang dibuat oleh Martin Büttner, di mana file bernomor ganjil adalah regex yang cocok dengan, dan file genap genap adalah apa yang harus diganti. Setiap baris adalah file terpisah, jadi saya telah menambahkan 15 byte untuk setiap file tambahan.

Penjelasan

Dimulai dengan membuat apa pun dengan 3 atau lebih digit A. Itu menambahkan -jika itu adalah angka dua digit yang diakhiri dengan 0, 1, atau 2, dan +jika berakhir dengan 7, 8, atau 9. Angka-angka tersebut kemudian dipetakan ke nilai mereka (misalnya angka yang dimulai dengan 9 diberikan nilai B). Jumlah yang tersisa secara otomatis adalah F. Sayangnya, ;`harus ditambahkan terlebih dahulu ke semua kecuali ke regex terakhir untuk menekan output antara. Pembaruan: versi 0.5.0 memiliki output antara mati secara default, memungkinkan saya untuk menyimpan beberapa byte.

NinjaBearMonkey
sumber
Apakah Anda yakin itu tidak menghasilkan + dan - untuk kasus F?
Tim
1
@ Tim Tidak seharusnya, karena \d.*cocok dan menggantikan seluruh string, +termasuk.
NinjaBearMonkey
Ahh oke - saya bisa melihat itu sekarang! :)
Tim
8

C, 99 byte

Saya baru di sini, saya harap saya mengikuti aturan.

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

Fungsi ini mengambil tanda sebagai parameter dan mengembalikan nilai sebagai string yang diakhiri NULL.

Penjelasan

Menambahkan spasi putih:

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

Variabel global secara otomatis diinisialisasi ke nol, sehingga b diisi dengan NULLs. Karena hanya dua karakter pertama yang pernah disentuh, kita hanya perlu khawatir tentang menempatkan NULL dalam b [1] jika nilai hanya memiliki satu karakter. NULL ini disisipkan di awal fungsi. Parameter n secara implisit int. Jika nilainya kurang dari 60, maka nilainya diatur ke 'F', jika nilainya lebih besar dari 99 maka akan ditetapkan ke 'A'. Dalam kasus lain, nilai dasar diberikan oleh 'E' - (n - 60) / 10, yang disederhanakan menjadi 75 - n / 10. n % 10mendapat digit satuan tanda. Jika kurang dari 3 maka a - ditambahkan, jika lebih besar dari 6 a + ditambahkan, jika tidak b [1] dibatalkan (yang sudah ada).

Uji kasus

#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
Andrea Biondo
sumber
Sempurna :) Tidak ada yang salah di sana.
Tim
perbedaan antara kode ur dan milik saya adalah satu kata "printf" yang seharusnya menghemat lebih dari 3 byte jika diabaikan :)
Abr001am
7

Pyth, 33 byte

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

Cobalah online: Demonstrasi atau Test Suite

Penjelasan:

                                     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
Jakube
sumber
7

> <> (Ikan), 78 71 byte

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

Metode:

  • Kami membaca titik kode dari 3 karakter pertama x,y,zdari input. Jika sebuah karakter tidak ada, nilai variabelnya akan secara -1implisit. ( ord(c)akan menandai titik kode karakter c)
  • Jika z > 0(3 digit input) cetak Adan keluar.
  • Jika x < ord('6') or y < 0(input <60) mencetak Fdan keluar.
  • Cetak karakter dengan codepoint 123 - x.
  • Jika y < ord('4') print-` dan keluar.
  • Jika y > ord('6') print+ `dan keluar.
  • Keluar.
randomra
sumber
7

C, 67 65

Anehnya, ini cukup dekat dengan solusi python.

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

Tetapi agar program ini, untuk menjadi sangat singkat, pengorbanan harus dilakukan:

  • Jika sebuah Fatau an Adicetak printfbahkan tidak melihat argumen lain yang diberikan. Ini adalah hack yang cukup jahat.

  • Jika (i%10+1)/4dievaluasi ke 1(tidak +atau -harus ditambahkan ke tingkat), %sformatter menerima pointer ke \0byte, sehingga tidak ada yang dicetak. Juga cukup lucu, karena saya tidak tahu bahwa Anda bisa mengambil alamat dari string literal yang diindeks. (mis. &"string"[i]) ( sunting : "string"+ibahkan lebih singkat ! Terima kasih @nutki)

Di sini keluaran program untuk angka 57 hingga 102. Saya membuatnya menjadi hexdump, jadi bisa dipastikan tidak ada \0byte aneh yang telah dicetak.

% 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

The mainMetode yang digunakan:

main(c,v)char**v;{f(atoi(v[1]));}
MarcDefiant
sumber
1
&"string"[i]tidak perlu karena ini setara dengan yang lebih pendek "string"+iyang dapat digunakan untuk menyimpan 2 byte.
nutki
saya harus objektif dan memperbaiki ini :) selamat, kamu mengalahkan semua catatan C
Abr001am
6

CJam, 41 39 37 34 byte

Ini terlalu lama, tapi saya pikir saya tidak akan bermain golf lebih jauh untuk saat ini.

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

Uji di sini. Atau jalankan semua test case di sini.

Tiga byte disimpan oleh Pengoptimal.

Penjelasan

(Sedikit ketinggalan jaman)

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.
Martin Ender
sumber
6

GNU sed, 73 + 1 = 74 byte

+1 untuk parameter -r.

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

Python 2, 94 88 84 69 byte

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

JavaScript (ES6), 66 byte

Lurus.

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

edc65
sumber
4

R, 107 105 99 byte

Aku bukan usaha yang sangat bagus, tapi aku akan mencoba dan bermain golf nanti.

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

Edit Menjatuhkan beberapa ifs. Memperbaiki kasing dan hasil yang salah untuk 100. Sekarang untuk menyingkirkan ifelses . Singkirkan ifelse.

MickyT
sumber
Saya pikir Anda ingin LETTERSdaripada letters.
Alex A.
3

Perl, 66 62 byte

Ini mungkin bisa lebih banyak golf. Juga cara yang berbeda mungkin lebih baik.

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

+1 untuk -p

Jalankan dengan:

echo 72 | perl -pE'$_=$_>99?A:$_<60?F:s/\d$/$&>6?"+":$&<3?"-":""/re;y/9876/BCDE/'
hmatt1
sumber
Mengapa tidak menggunakan -pdan menjatuhkan say?
ThisSuitIsBlackNot
@ ThisSuitIsBlackNot terima kasih! Diperbarui
hmatt1
2

Javascript (ES6), 78 79 byte

Ini sebenarnya bukan pilihan yang paling cerdas, tetapi saya melakukan apa yang saya bisa.

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

Cukup lulus nilai sebagai string , dan itu akan mengembalikan nilai surat itu.

Bagian string dalam sangat penting.

Anda dapat memeriksa testcase di sini:

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>

Jika ruang tambahan setelah surat tidak diizinkan, saya akan dengan senang hati menghapusnya. Bukan itu! Ini meningkatkan kode saya sebesar 1 byte, tetapi tidak ada yang terlalu serius.

Ismael Miguel
sumber
1
@Tim Memperbaikinya. Saya harap itu sudah cukup. Mengutip diri sendiri: " One newline after output is fine, but keep it consistent.". Saya pikir itu cukup konsisten.
Ismael Miguel
2

C #, 143 127 112 88 byte

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

Saya mencoba menjadi pandai dengan melakukan mod nomor ASCII, tetapi sepertinya saya tidak sendirian!

Terima kasih kepada Tim untuk saran pada daftar alih-alih seandainya.

Terima kasih kepada DarcyThomas karena telah menunjukkan bahwa saya dapat menggunakan operator ternary yang bersarang.

Transmisi
sumber
1
Tidak bisakah kamu mengurangi daftar seandainya menggunakan daftar?
Tim
Saya tidak yakin apa yang Anda maksud dengan menggunakan daftar, dapatkah Anda menjelaskan sedikit?
Transmisi
Dalam python aku bisa melakukan ini: [item1,item2][condition]. Jika kondisinya Benar itu memberikan item ke-2, jika Salah yang pertama.
Tim
Ide bagus! Menambahkan itu.
Transmisi
Saya pikir Anda bisa menggunakan terary jika pernyataan misalnya, return <condition> ? <true result> : <false result>Perhatikan Anda juga dapat membuat sarangreturn <condition> ? <true result> : <condition> ? <2nd true result> : < 2nd false result>
DarcyThomas
1

Haskell, 78 byte

Baris pertama terasa boros, menghabiskan biaya 14 byte, tetapi saya tidak dapat menemukan versi yang lebih pendek tanpa itu.

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

Penjelasan

Operator #adalah singkatan untuk membuat n salinan argumen kedua. Daftar aadalah daftar tak terbatas dari Strings "A". fIndeks fungsi menjadi daftar semua nilai untuk n = 0,1, ... Pemahaman daftar membangun "bagian tengah" dari daftar ini (nilai E ke B); gadalah Char tunggal yang ditambahkan ke Strings (yang mungkin kosong).

Pemakaian

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

C, 102 byte

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

}

Pemakaian

#include <stdio.h>
int f(int );
int main(){
    int c;
    scanf("%d",&c);
    f(c);
}
Abr001am
sumber
Anda melewatkan bagian + dan -.
Pengoptimal
ah ok .... lewatkan itu
Abr001am
terlalu lama :( ....
Abr001am
1

dc, 52

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

Keluaran

$ 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} $ 
$ 
Trauma Digital
sumber
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
Timtech
sumber
Itu tidak bekerja untuk angka kurang dari 10.
lirtosiast
Tangkapan yang bagus, Tom, hilang1+
Timtech
Ini juga memiliki spasi tambahan (tidak terlihat) setiap kali tidak ada + atau -.
lirtosiast
1

TI-BASIC, 69 68 66 byte

.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 tidak baik untuk manipulasi string.

Masukan pada layar beranda kalkulator, dalam bentuk [angka]: [nama program].

Diformat:

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

Ini mungkin bisa golf lebih lanjut.

lirtosiast
sumber
0

C #, 82 byte

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

Ini biola dengan beberapa kasus uji.

Blorgbeard
sumber
0

JavaScript (ES6), 86 83 byte

Yang benar-benar memakan karakter adalah String.fromCharCodekondisi +/- ... Saya sangat curiga ada cara pintar untuk mempersingkat setidaknya satu dari mereka.

f=n=>n>99?'A':n<60?'F':String.fromCharCode(75.9-n/10|0)+(n%10<3?'-':n%10>6?'+':'');
ay
sumber
Jika Anda menginginkan kode pendek, String.fromCharCode hampir selalu tidak berguna. Gunakan pengindeksan string (lihat jawaban javascript lainnya)
edc65
Pokoknya, ~~(.1*-n+75.9)->75.9-n/10|0
edc65
@ edc65 Terima kasih atas saran golfnya! Saya akan tetap mengingat pengindeksan string untuk acara berikutnya.
vvye
0

PHP5.5, 73 byte

Sekali lagi, bukan yang terpendek.

Tapi berhasil!

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

Saya sudah mengklasifikasikannya di bawah PHP5.5 bukan hanya PHP karena ini menggunakan sintaks yang hanya berlaku untuk PHP5.5 dan PHP5.6.

Anda dapat membaca tentang string dan array dereferencing dalam manual:
http://php.net/manual/en/migration55.new-features.php

Ismael Miguel
sumber
0

Perl, 52

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

Ruby, 58 Bytes

Tidak percaya bahwa tidak ada yang Ruby di sini. Pada refleksi itu cukup mirip dengan beberapa yang sudah ada di sini tetapi tetap:

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

Coba di sini

RichieAHB
sumber
0

Excel, 100 byte

=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,"+",""))))
Wernisch
sumber