Tamsayı işareti dereceye


30

Olumlu bir tamsayı (0 ve üzeri, maksimum değil) göz önüne alındığında, aşağıdaki kuralları izleyerek notuna dönüştürün:

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

Bu biraz sıkıcı hissettirdi, bu nedenle not +7, 7, 9 ise ve a -, 0,1 veya 2 ise, F ve A durumları için bunu dikkate almayın.

Bir örnek:

Giriş:

65

Çıktı:

E

Test durumları:

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

Sondaki boşluk yok. Çıktıdan sonraki bir satırsonu iyi, ancak tutarlı olsun. İşlevler ve tam programlar hem iyi.

Bu kod golf, yani en kısa kod kazanır. Bu bir Ubuntu sor sorusundan esinlenerek sayısal harflere harf notu atamak için bir kabuk betiği nasıl yazılır? . Cevaplar bash ve python şeklindedir, bu yüzden hafifçe spoiler.


Liderler Sıralaması:

Burada hem düzenli bir lider tablosu hem de kazananların dile göre genel bir bakış oluşturması için bir Stack Snippet'i var.

Cevabınızın göründüğünden emin olmak için, lütfen aşağıdaki Markdown şablonunu kullanarak cevabınızı bir başlık ile başlatın:

# Language Name, N bytes

Gönderinizin Nbüyüklüğü nerede ? Puanınızı artırmak varsa, olabilir onları içinden vurarak, başlığa eski hesapları tutmak. Örneğin:

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


1
Orada bir olmaz A+ve A-? Onları neden görmezden geldiğimizi anlamıyorum.
ASCIIThenANSI

1
@ASCIIThenANSI istisnaları daha ilginç kılıyor ve A için maksimum yok, bu yüzden hayır+
Tim

1
Bu sınıflandırma panosunda bir hata var: balık versiyonu daha eski ve cevabım ondan önce.
Ismael Miguel

@IsmaelMiguel En eski gönderinin henüz varsayılan tie break kırıcı olmadığı zaman yazılmıştır (bu nedenle de bağlar sipariş etmez). Yine de bir noktada onu düzeltmeye çalışacağım (muhtemelen bu zorluk için değil, en azından meta kaynağında).
Martin Ender,

@ MartinBüttner Ben sadece işaret ediyordu.
Ismael Miguel,

Yanıtlar:


21

Python 2, 72 70 62 bayt

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

Bu, int alan ve notu dizge olarak döndüren anonim bir işlevdir.

(@ MartinBüttner, @grc ve @TheNumberOne öğelerine teşekkür ederiz)


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

Boş olabilecek bir karakteri seçmek için ne akıllıca bir yol!
xnor

11

CJam, 34 33 32 bayt

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

Tamam, şimdi birden fazla yaklaşım denedim ve bunu 33'ün altına alamıyorum, işte açıklama şöyle:

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.

GÜNCELLEME : Dennis tarafından bir işaretçi sayesinde 1 bayt kaydedildi

Burada çevrimiçi deneyin


Ne yapar s?
Dennis,

@Dennis, char + / - / space komutunu son dize dönüştürür<
Doktor

Bu gerekli olmamalıydı. Character String -bir dize iter.
Dennis,

@Dennis Ah, haklısın. Bazı önceki sürüm için kullanımın farklı olduğunu düşünüyorum.
Doktor,

8

Retina, 43 + 15 = 58 bayt

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

Retina , Martin Büttner tarafından oluşturulan tek sayılı bir dildir; tek sayılı dosyaların eşleşmesi gereken regex'lerdir ve çift sayılı dosyaların yerini alacak olanları. Her satır ayrı bir dosyadır, bu yüzden her ek dosya için 15 bayt ekledim.

açıklama

A ya da 3 rakamlı bir şey yaparak başlar. A -, 0, 1 veya 2 ile biten iki basamaklı bir +sayıysa ve 7, 8 veya 9 ile bittiğinde bir a ekler . notları (örneğin 9 ile başlayan bir sayı B verilir). Kalan herhangi bir sayı otomatik olarak bir F'dir. Ne yazık ki, ;`ara çıktıyı bastırmak için son regex'e herkese önceden hazırlanmalıdır. Güncelleme: 0.5.0 sürümü varsayılan olarak ara çıkışa sahiptir ve birkaç bayttan tasarruf etmemi sağlar.


F durumu için + ve - çıkmadığından emin misiniz?
Tim

1
@Tim Olmamalı, çünkü içerdiği \d.*tüm dizgeyle eşleşir ve değiştirir +.
NinjaBearMonkey 11:15

Ahh tamam - Bunu şimdi görebiliyorum! :)
Tim

8

C, 99 bayt

Ben burada yeniyim, umarım kuralları takip ediyorum.

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

Bu işlev, işareti parametre olarak alır ve notu NULL sonlandırılmış bir dize olarak döndürür.

açıklama

Eklenen boşluk:

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

Genel değişkenler otomatik olarak sıfıra başlatılır, b b NULL ile doldurulur. Sadece ilk iki karaktere dokunulduğu için, notun sadece bir karaktere sahip olması durumunda, b [1] 'de bir NULL koymakla ilgilenmemiz gerekir. Bu NULL, fonksiyonun en başında eklenir. N parametresi dolaylı olarak int'dir. Not 60'tan küçükse, 'F', 99'dan büyükse 'A' olarak ayarlanır. Diğer durumlarda, temel not 'E' - (n - 60) / 10basitleştirilerek verilmektedir 75 - n / 10. n % 10Birimin basamağını alır. 3'ten küçükse, a - eklenir, 6'dan büyükse + eklenir, aksi takdirde b [1] boş bırakılır (zaten öyleydi).

Test durumları

#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

Mükemmel :) Orada yanlış bir şey yok.
Tim,

ur kodu ile benimki arasındaki fark, dikkate alınmadığı takdirde 3 bayttan fazla tasarruf etmesi gereken "printf" kelimesidir :)
Abr001am

7

Pyth, 33 bayt

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

Çevrimiçi deneyin: Gösteri veya Test Paketi

Açıklama:

                                     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

> <> (Balık), 78 71 bayt

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

Yöntem:

  • Girişten ilk 3 karakterin kod noktalarını okuduk x,y,z. Bir karakter yoksa değişkeninin değeri -1örtük olacaktır . ( ord(c)karakterin kod noktasını işaretler c)
  • Eğer z > 0(3 basamaklı giriş) yazdırır Ave çıkar.
  • Eğer x < ord('6') or y < 0(giriş <60) yazdırır Fve çıkar.
  • Karakteri kod noktasıyla yazdır 123 - x.
  • Eğer y < ord('4') print-` ve çık.
  • Eğer y > ord('6') print+ `ve çık.
  • Çıkış.

7

C, 67 65

Şaşırtıcı bir şekilde, bu python çözeltisine oldukça yakın.

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

Ancak bu program için, bu kadar büyük bir kısalmaya varmak için fedakarlıklar yapılması gerekiyordu:

  • Bir Fya da bir Abasılı printfise, geçen diğer argümanlara bile bakmaz. Bu oldukça pis bir kesmek.

  • Eğer (i%10+1)/4değerlendirir için 1(bir +ya da -sınıf eklenmiş olmalıdır), %sbiçimlendirici bir bir işaretçi alır \0şey basılır, böylece bayt. Ayrıca oldukça komik, çünkü dizine eklenmiş bir dizgenin adresini alabileceğinizi bilmiyordum. (örn. &"string"[i]) ( düzenle : "string"+idaha da kısa ! Thanks @nutki)

Burada 57 ile 102 arasındaki sayılar için programın çıktısını aldım. Bir hexdump yaptım, bu yüzden tuhaf \0baytların yazdırılmadığından emin olabiliriz .

% 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

Kullanılan mainyöntem:

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

1
&"string"[i]"string"+i2 bayt kaydedebileceğiniz daha kısa olana eşdeğer olduğu için gereksizdir .
nutki

objektif olmalı ve bunu yükseltmeliyim :) tebrikler, u tüm C rekorları kırdı
Abr001am

6

CJam, 41 39 37 34 bayt

Bu çok uzun, ama şimdilik daha fazla golf oynayacağımı sanmıyorum.

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

Burada test et. Veya tüm test durumlarını burada çalıştırın.

Doktor tarafından kaydedilen üç bayt.

açıklama

(Biraz eski)

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 bayt

+ 1, -r parametresi içindir.

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 bayt

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

5

JavaScript (ES6), 66 bayt

Düz.

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 bayt

Çok iyi bir çaba değil, korkarım ama daha sonra daha çok golf oynayacağım.

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

Düzenle Bırakılan bir kaç ifsaniye. Dava ve 100 için yanlış bir sonuç düzeltildi. Şimdi ifelses kurtulmak için . ifelseS kurtulmak .


Bence LETTERSdaha çok istiyorsun letters.
Alex A.

3

Perl, 66 62 bayt

Bu muhtemelen daha çok golf oynayabilir. Ayrıca farklı bir yol daha iyi olabilir.

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

İçin +1 -p

Çalıştır:

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

Neden kullanmaz -pve bırak say?
ThisSuitIsBlackNot 10:15

@ BuSuitIsBlackNot teşekkürler! Güncelleme
hmatt1

2

Javascript (ES6), 78 79 bayt

Bu gerçekten en akıllıca seçenek değil ama elimden geleni yaptım.

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

Sadece notu bir dize olarak geçirin, notu geri dönecektir.

Dize kısmı çok önemli.

Burada bir test çantasını kontrol edebilirsiniz:

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>

Mektuptan sonraki koşullu alana izin verilmezse, onu mutlu bir şekilde kaldıracağım. Öyle değildi! Bu, kodumu 1 bayt artırdı, ancak hiçbir şey (çok) ciddi değil.


1
@Tim Sabitlendi. Umarım yeterlidir. Kendinden alıntı: " One newline after output is fine, but keep it consistent.". Bence bu yeterince tutarlı.
Ismael Miguel

2

C #, 143 127 112 88 bayt

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

ASCII sayı modları yaparak zeki olmaya çalıştım, ama yalnız değildim!

İfs yerine listeleri tavsiye için Tim teşekkürler.

İşaret ettiği DarcyThomas sayesinde iç içe üçlü operatörleri kullanabilirim.


1
Listeleri kullanarak ifs kısmak değil mi?
Tim

Listeleri kullanarak ne demek istediğinden emin değilim, biraz açıklayabilir misin?
İletim

Python'da ben bunu yapabilirsiniz: [item1,item2][condition]. Eğer durum True ise, False ise birinci olan 2. maddeyi verir.
Tim,

İyi bir fikir! Eklendi.
İletim

Bence, eğer return <condition> ? <true result> : <false result>return <condition> ? <true result> : <condition> ? <2nd true result> : < 2nd false result>
üçgeni

1

Haskell, 78 bayt

İlk satır boşa harcıyor, 14 bayta mal oluyor, ancak onsuz daha kısa bir sürüm bulamadım.

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

açıklama

Operatör #, ikinci argümanının n kopyasını oluşturmak için kısa yol. Liste a, "A" dizelerinin sonsuz bir listesidir. İşlev f, n = 0,1, ... için tüm sınıfların listesine girer. Liste anlama, bu listenin "orta kısmını" oluşturur (sınıf E'den B'ye); (Boş olabilir) gString hazır bir tek Char s.

kullanım

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

1

C, 102 bayt

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

}

kullanım

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

+ Ve - bölümlerini kaçırıyorsunuz.
Doktor

ah tamam .... özledim ki
Abr001am

çok uzun :( ....
Abr001am

1

dc, 52

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

Çıktı

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

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

Bu 10'dan az sayılar için işe yaramaz
lirtosiast

Güzel yakalama, Tom, eksikti1+
Timtech

Bu da + veya - olmadığı zaman (görünmez) iz bırakma alanlarına sahiptir.
lirtosiast

1

TI-BASIC, 69 68 66 bayt

.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, dize işleminde iyi değildir.

Hesap makinesi ana ekranına [sayı]: [program adı] şeklinde giriş yapın.

biçimlendirilmiş:

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

Bu muhtemelen daha fazla golf oynayabilir.


0

C #, 82 bayt

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

İşte bazı test vakaları ile bir keman .


0

JavaScript (ES6), 86 83 bayt

Gerçekten yemek yiyen karakterler String.fromCharCodeve +/- koşulu ... En az birini kısaltmanın akıllıca bir yolunun olduğundan şüpheleniyorum.

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

Kısa kod istiyorsanız, String.fromCharCode neredeyse her zaman işe yaramaz. Dize indekslemesini kullanın (diğer javascript cevaplarına bakın)
edc65

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

@ edc65 Golf tavsiyesi için teşekkürler! Dize endekslemesini bir sonraki sefer için aklımda tutacağım.
vvye

0

PHP5.5, 73 bayt

Bir kez daha, en kısa olanı değil.

Ama işe yarıyor!

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

Ben sadece PHP5.5 altında sadece PHP5.5 altında sınıflandırdım çünkü bu sadece PHP5.5 ve PHP5.6 için geçerli olan sözdizimini kullanıyor.

Kullanım kılavuzunda dizi ve dizi düzenleme işlemlerini okuyabilirsiniz:
http://php.net/manual/tr/migration55.new-features.php


0

Perl, 52

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

0

Ruby, 58 Bayt

Burada Ruby yok olduğuna inanamadım. Yansıma üzerine zaten zaten burada olan bazılarına oldukça benzer:

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

Burada dene


0

Excel, 100 bayt

=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,"+",""))))
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.