等級への整数マーク


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の場合はaにしてください。FおよびAの場合は無視してください。

例:

入力:

65

出力:

E

テストケース:

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

末尾のスペースはありません。出力後の1つの改行は問題ありませんが、一貫性を保ちます。機能と完全なプログラムはどちらも問題ありません。

これはコードゴルフなので、最短のコードが勝ちます。これは、Ubuntuの質問「文字の等級を数値範囲に割り当てるシェルスクリプトを書く方法」に触発されました。答えはbashとpythonなので、少しネタバレです。


リーダーボード:

これは、通常のリーダーボードと言語ごとの勝者の概要の両方を生成するスタックスニペットです。

回答が表示されるようにするには、次のマークダウンテンプレートを使用して、見出しから回答を開始してください。

# Language Name, N bytes

N提出物のサイズはどこですか。スコアを改善する場合、古いスコアを打つことで見出しに残すことができます。例えば:

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


1
A+and はありませんA-か?なぜそれらを無視しているのかわかりません。
ASCIIThenANSI

1
@ASCIIThenANSIは、例外を持つことがより面白くなり、Aに最大値がないので、いいえ+
ティム

1
その分類ボードにはバグがあります。魚のバージョンは古く、私の答えはその前です。
イスマエルミゲル

@IsmaelMiguel最も早い投稿がまだデフォルトのタイブレーカーではないときに書かれました(タイをまったく順序付けしません)。ただし、ある時点で修正するようにします(おそらく、この課題ではなく、少なくともメタのソース)。
マーティンエンダー

@MartinBüttner私はそれを指摘していました。
イスマエルミゲル

回答:


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はchar + /-/ spaceを最後の文字列に変換します<
オプティマイザー

それは必要ないはずです。Character String -文字列をプッシュします。
デニス

@デニスああ、あなたは正しい。以前のバージョンでは、使用方法が異なっていたと思います。
オプティマイザー

8

網膜、43 + 15 = 58バイト

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

Retinaは、MartinBüttnerによって作成された正規表現言語です。奇数番号のファイルは一致する正規表現であり、偶数番号のファイルはそれを置き換えるものです。各行は個別のファイルなので、追加ファイルごとに15バイトを追加しました。

説明

3桁以上の数字をAにすることから始まります。0、1 -、または2 +で終わる2桁の数字で、7、8、または9で終わる数字を追加します。それらのグレード(例えば、9で始まる数字にはBが与えられます)。残っている数字はすべて自動的にFです。残念ながら、;`中間出力を抑制するには、最後の正規表現以外のすべてに先頭に追加する必要があります。更新:バージョン0.5.0では、デフォルトで中間出力がオフになっているため、数バイト節約できます。


Fの場合、+と-は出力されませんか?
ティム

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で埋められます。最初の2文字のみがタッチされるため、グレードに1文字しかない場合は、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

完璧:)そこに何も問題はありません。
ティム

ウルのコードと私の違いはある:)無視した場合の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

驚いたことに、これはPythonソリューションに非常に近いものです。

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

私は客観的であり、これを支持しなければなりません:)おめでとう、すべてのCレコードを
破った-Abr001am

6

CJam、41 39 37 34バイト

これは長すぎますが、今のところこれ以上ゴルフをするつもりはありません。

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

ここでテストしてください。または、ここですべてのテストケースを実行します。

オプティマイザーによって保存された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

JavaScript(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バイト

私は恐れているが、あまり良い努力ではありませんが、私はもっと後でそれを試してみます。

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

編集if秒削除しました。100の場合と誤った結果を修正しました。 次にifelses を取り除きます。ifelses を取り除きました。


私はあなたがLETTERSより欲しいと思うletters
アレックス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

ありがとうございます!更新
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])

グレードを文字列として渡すだけで、グレードの文字が返されます。

文字列部分は非常に重要です。

ここでテストケースを確認できます:

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."。それは十分に一貫していると思います。
イスマエルミゲル

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

私はASCII番号の改造を行うことで賢くしようとしましたが、私は一人ではなかったようです!

ifsではなくリストに関するアドバイスをくれたTimに感謝します。

ネストした三項演算子を使用できることを指摘してくれたDarcyThomasに感謝します。


1
リストを使用してifsを削減できませんか?
ティム

リストを使用することの意味がわかりませんが、少し説明してもらえますか?
送信

Pythonでは、これを行うことができます[item1,item2][condition]。条件がTrueの場合は2番目のアイテムを提供し、Falseの場合は最初のアイテムを提供します。
ティム

良いアイデア!それを追加しました。
送信

たとえば、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

説明

演算子#は、2番目の引数のn個のコピーを作成するための略記です。リストaは、文字列「A」の無限リストです。関数はf、n = 0,1、...のすべてのグレードのリストにインデックスを付けます。リスト内包表記は、このリストの「中間部分」を構築します(グレードEからB)。gStringの前に付加される単一の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

dc、52

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

出力

$ 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バイト

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未満の数値では機能しません
。-リスト

いいね、トム、行方不明だった1+
ティムテック

また、+または-がない場合は常に(見えない)末尾スペースがあります。
リスト管理者

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+ /-条件です...少なくともそのうちの1つを短くする賢い方法があると強く思います。

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

短いコードが必要な場合、ほとんどの場合、String.fromCharCodeは役に立ちません。文字列インデックスを使用します(他のJavaScriptの回答を参照)
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およびPHP5.6でのみ有効な構文を使用するため、PHPだけでなくPHP5.5で分類しました。

文字列と配列の逆参照については、マニュアルで読むことができます:http :
//php.net/manual/en/migration55.new-features.php



0

ルビー、58バイト

ここにはRubyのものがないとは信じられませんでした。振り返ってみると、すでにここにあるものとかなり似ていますが、とにかく:

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

ここで試してみてください


0

Excel、100バイト

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