Marca de número inteiro no grau

30

Dado um número inteiro positivo (0 e acima, sem máximo), converta-o em uma nota seguindo estas regras:

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

Isso foi um pouco chato, então faça a nota a +se for 7,8 ou 9 e a -se for 0,1 ou 2. Ignore isso nos casos F e A.

Um exemplo:

Entrada:

65

Saída:

E

Casos de teste:

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

Sem espaços à direita. Uma nova linha após a saída é boa, mas mantenha-a consistente. Funções e programas completos são bons.

Isso é código de golfe, então o código mais curto vence. Isso foi inspirado em uma pergunta do Ubuntu, como escrever um shell script para atribuir notas de letras a intervalos numéricos? . As respostas estão em bash e python, então um pouco de spoilers.


Entre os melhores:

Aqui está um snippet de pilha para gerar uma classificação regular e uma visão geral dos vencedores por idioma.

Para garantir que sua resposta seja exibida, inicie-a com um título, usando o seguinte modelo de remarcação:

# Language Name, N bytes

onde Nestá o tamanho do seu envio. Se você melhorar sua pontuação, poderá manter as pontuações antigas no título, identificando-as. Por exemplo:

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

Tim
fonte
1
Não haveria um A+e A-? Não vejo por que os estamos ignorando.
ASCIIThenANSI
1
@ASCIIThenANSI torna mais interessante ter exceções, e não há nenhum máximo para o A, de modo nenhum+
Tim
1
Esse painel de classificação tem um bug: a versão do peixe é mais antiga e minha resposta está anterior.
Ismael Miguel
@IsmaelMiguel Foi escrito quando o post mais antigo ainda não era o desempatador padrão (portanto, ele não ordena empates). Vou tentar corrigi-lo em algum momento (provavelmente não para este desafio, mas pelo menos a fonte no meta).
Martin Ender
@ MartinBüttner Eu estava apenas apontando.
Ismael Miguel

Respostas:

21

Python 2, 72 70 62 bytes

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

Esta é uma função anônima que recebe um int e retorna a nota como uma string.

(obrigado a @ MartinBüttner, @grc e @TheNumberOne pelas dicas)

Sp3000
fonte
4
"EDCB"[n/10-6]->chr(75-n/10)
grc
Que maneira inteligente de selecionar um personagem que possa estar vazio!
Xnor
11

CJam, 34 33 32 bytes

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

Ok, eu tentei várias abordagens agora e não consigo obter isso abaixo de 33, então aqui vai a explicação:

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.

ATUALIZAÇÃO : 1 byte economizado graças a um ponteiro de Dennis

Experimente online aqui

Optimizer
fonte
O que sfaz?
Dennis
@Dennis converte char + / - / space em string para o último<
Optimizer
Isso não deveria ser necessário. Character String -empurra uma corda.
Dennis
@ Dennis Ah, você está certo. Eu acho que para alguma versão anterior, o uso foi diferente.
Optimizer
8

Retina, 43 + 15 = 58 bytes

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

Retina é uma linguagem de regex criada por Martin Büttner, em que os arquivos com números ímpares são o regex a combinar e os arquivos com números pares são o que substituí-lo. Cada linha é um arquivo separado, então adicionei 15 bytes para cada arquivo adicional.

Explicação

Começa transformando qualquer coisa com 3 ou mais dígitos em A. Ele adiciona a -se for um número de dois dígitos que termina com 0, 1 ou 2 e +se termina com 7, 8 ou 9. Os números são mapeados para sua nota (por exemplo, um número começando com 9 é dado um B). Qualquer número restante é automaticamente um F. Infelizmente, ;`deve ser anexado a todos, exceto ao último regex, para suprimir a saída intermediária. Atualização: a versão 0.5.0 possui saída intermediária desativada por padrão, permitindo que eu salve alguns bytes.

NinjaBearMonkey
fonte
Tem certeza de que não gera + e - para o caso F?
Tim
1
@ Tim Não deveria, porque \d.*combina e substitui toda a string, +incluída.
NinjaBearMonkey
Ahh ok - eu posso ver isso agora! :)
Tim
8

C, 99 bytes

Sou novo por aqui, espero seguir as regras.

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

Esta função recebe a marca como parâmetro e retorna a nota como uma sequência terminada em NULL.

Explicação

Espaço em branco adicionado:

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

As variáveis ​​globais são inicializadas automaticamente como zero, então b é preenchido com NULLs. Como apenas os dois primeiros caracteres são tocados, precisamos nos preocupar em colocar um NULL em b [1] se a nota tiver apenas um caractere. Este NULL é inserido no início da função. O parâmetro n é implicitamente int. Se a nota for inferior a 60, será definida como 'F', se for maior que 99, será definida como 'A'. Nos outros casos, a nota base é dada por 'E' - (n - 60) / 10, o que simplifica para 75 - n / 10.n % 10obtém o dígito das unidades da marca. Se for menor que 3, então a - será anexado, se for maior que 6 a +, caso contrário b [1] será anulado (o que já era).

Casos de teste

#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
fonte
Perfeito :) Nada de errado lá.
Tim
A diferença entre o código ur e o meu é uma palavra "printf" que deve economizar mais de 3 bytes caso seja ignorada :) #
Abr001am
7

Pitão, 33 bytes

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

Experimente on-line: Demonstration or Test Suite

Explicação:

                                     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
fonte
7

> <> (Peixe), 78 71 bytes

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

Método:

  • Lemos os pontos de código dos 3 primeiros caracteres x,y,zda entrada. Se um caractere não estiver presente, o valor de sua variável será -1implicitamente. ( ord(c)marcará o ponto de código do caracterec )
  • Se z > 0(entrada de 3 dígitos) imprimirA e sair.
  • Se x < ord('6') or y < 0(entrada <60) imprimirF e sair.
  • Imprimir o caractere com ponto de código 123 - x .
  • E se y < ord('4') print -` e sair.
  • E se y > ord('6') print + `e sair.
  • Saída.
randomra
fonte
7

C, 67 65

Surpreendentemente, isso é bem próximo da solução python.

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

Mas, para que esse programa chegasse a tão grande falta, sacrifícios precisavam ser feitos:

  • Se um Fou um Aé impresso printf, nem olha para os outros argumentos passados. Este é um truque bastante desagradável.

  • Se (i%10+1)/4avaliar como 1(nenhum +ou -deve ser anexado à nota), o %sformatador recebe um ponteiro para um \0byte, para que nada seja impresso. Também muito engraçado, porque eu não sabia que você poderia pegar o endereço de uma string indexada literal. (por exemplo &"string"[i]) ( editar : "string"+ié ainda mais curto ! Obrigado @nutki)

Aqui está a saída do programa para os números 57 a 102. Fiz um hexdump, para que possamos ter certeza de que nenhum \0bytes estranho foi impresso.

% 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

O mainmétodo usado:

main(c,v)char**v;{f(atoi(v[1]));}
MarcDefiant
fonte
1
&"string"[i]é desnecessário, pois é equivalente a mais curto, "string"+icom o qual você pode salvar 2 bytes.
nutki
eu devo ser objetivo e aprovar isso :) parabéns, vc venceu todos os registros C
Abr001am 13/15/15
6

CJam, 41 39 37 34 bytes

Isso é muito longo, mas acho que não vou jogar mais por agora.

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

Teste aqui. Ou execute todos os casos de teste aqui.

Três bytes salvos pelo Optimizer.

Explicação

(Um pouco desatualizado)

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
fonte
6

GNU sed, 73 + 1 = 74 bytes

O + 1 é para o parâmetro -r.

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

Python 2, 94 88 84 69 bytes

lambda g:g>99and'A'or[chr(75-g/10)+'-+'[g%10>2:1-(g%10>6)],'F'][g<60]
O número um
fonte
5

JavaScript (ES6), 66 bytes

Direto.

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
fonte
4

R, 107 105 99 bytes

Receio que não seja um esforço muito bom, mas tentarei jogar mais tarde.

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

Editar Soltou alguns ifs. Corrigido o caso e um resultado incorreto para 100. Agora, livre-se dos ifelses . Se livrou de ifelses.

MickyT
fonte
Eu acho que você quer LETTERSmais do que letters.
Alex A.
3

Perl, 66 62 bytes

Provavelmente isso pode ser jogado mais. Também uma maneira diferente pode ser melhor.

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

+1 para -p

Correr com:

echo 72 | perl -pE'$_=$_>99?A:$_<60?F:s/\d$/$&>6?"+":$&<3?"-":""/re;y/9876/BCDE/'
hmatt1
fonte
Por que não usar -pe soltar o say?
ThisSuitIsBlackNot
@ThisSuitIsBlackNot thanks! Atualizado
hmatt1
2

Javascript (ES6), 78 79 bytes

Essa realmente não é a opção mais inteligente, mas fiz o que pude.

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

Simplesmente passe a nota como uma string e ela retornará a letra da nota.

A parte da corda é muito importante.

Você pode verificar um caso de teste aqui:

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>

Se o espaço adicional após a carta não for permitido, eu o removerei com prazer. Não foi! Isso aumentou meu código em 1 byte, mas nada (também) sério.

Ismael Miguel
fonte
1
@ Tim corrigido. Espero que seja o suficiente. Citando a si mesmo: " One newline after output is fine, but keep it consistent.". Eu acho que isso é consistente o suficiente.
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?"-":"");}

Eu tentei ser inteligente fazendo mods de número ASCII, mas parece que não estava sozinho!

Agradecemos a Tim por conselhos sobre listas em vez de ifs.

Graças a DarcyThomas por apontar, eu poderia usar operadores ternários aninhados.

Transmissão
fonte
1
Você não pode reduzir o ifs usando listas?
Tim
Não sei ao certo o que você quer dizer com listas, poderia explicar um pouco?
Transmissão
Em python eu posso fazer isso: [item1,item2][condition]. Se a condição for True, fornece o 2º item, se False, o primeiro.
Tim
Boa ideia! Adicionado isso.
Transmissão
Eu acho que você poderia usar ternário if por exemplo, return <condition> ? <true result> : <false result>Nota Pode também ninho eles assimreturn <condition> ? <true result> : <condition> ? <2nd true result> : < 2nd false result>
DarcyThomas
1

Haskell, 78 bytes

A primeira linha parece um desperdício, custando 14 bytes, mas não consegui encontrar uma versão mais curta sem ela.

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

Explicação

O operador #é uma abreviação para criar n cópias do seu segundo argumento. Lista aé uma lista infinita de seqüências de caracteres "A". A função findexa em uma lista de todas as notas para n = 0,1, ... A compreensão da lista constrói a "parte do meio" desta lista (notas E a B); gé um único caractere que é anexado à String s(que pode estar vazia).

Uso

ghci> map f [0,20,65,72,75,80,99,102,864]
["F","F","E","D-","D","C-","B+","A","A"]
user40671
fonte
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)));

}

Uso

#include <stdio.h>
int f(int );
int main(){
    int c;
    scanf("%d",&c);
    f(c);
}
Abr001am
fonte
Está faltando a parte + e -.
Optimizer
ah ok .... sinto falta disso
Abr001am 9/15
por muito tempo :( ...
Abr001am
1

dc, 52

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

Saída

$ 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
fonte
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
fonte
Isso não funciona para números menores que 10.
lirtosiast
Prendedor agradável, Tom, que estava faltando1+
Timtech
Isso também possui espaços à direita (invisíveis) sempre que não há + ou -.
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

O TI-BASIC não é bom para manipulação de strings.

Insira na tela inicial da calculadora, na forma de [número]: [nome do programa].

Formatado:

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

Provavelmente isso pode ser ainda mais jogado.

lirtosiast
fonte
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?"+":"");

Aqui está uma brincadeira com alguns casos de teste.

Blorgbeard
fonte
0

JavaScript (ES6), 86 83 bytes

O que realmente está atrapalhando os personagens é a String.fromCharCodecondição +/- ... suspeito fortemente que haja uma maneira inteligente de reduzir pelo menos um deles.

f=n=>n>99?'A':n<60?'F':String.fromCharCode(75.9-n/10|0)+(n%10<3?'-':n%10>6?'+':'');
vvye
fonte
Se você deseja um código curto, String.fromCharCode é quase sempre inútil. Use a indexação de strings (consulte as outras respostas javascript)
edc65 11/11/15
Enfim, ~~(.1*-n+75.9)->75.9-n/10|0
edc65
@ edc65 Obrigado pelo conselho de golfe! Lembrarei da indexação de strings para a próxima ocasião.
vvye
0

PHP5.5, 73 bytes

Mais uma vez, não o mais curto.

Mas funciona!

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

Eu o classifiquei no PHP5.5 em vez de apenas no PHP, pois ele usa sintaxe válida apenas para o PHP5.5 e o PHP5.6.

Você pode ler sobre desreferenciamento de string e array no manual:
http://php.net/manual/en/migration55.new-features.php

Ismael Miguel
fonte
0

Perl, 52

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

Ruby, 58 bytes

Não podia acreditar que não há Ruby aqui. Na reflexão, é bastante semelhante a alguns que já estão aqui, mas de qualquer maneira:

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

Experimente aqui

RichieAHB
fonte
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,"+",""))))
Wernisch
fonte