Marca entera en grado

30

Dado un número entero positivo (0 y superior, sin máximo), conviértalo en una calificación siguiendo estas reglas:

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

Esto se sintió un poco aburrido, así que califique a +si es 7,8 o 9 y a -si es 0,1 o 2. Ignore esto para los casos F y A.

Un ejemplo:

Entrada:

65

Salida:

E

Casos de prueba:

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

Sin espacios finales. Una nueva línea después de la salida está bien, pero manténgala consistente. Las funciones y los programas completos están bien.

Este es el código de golf, por lo que gana el código más corto. Esto se inspiró en una pregunta de Ubuntu, ¿Cómo escribir un script de shell para asignar calificaciones de letras a rangos numéricos? . Las respuestas están en bash y python, por lo que son un poco spoilers.


Tabla de clasificación:

Aquí hay un fragmento de pila para generar una tabla de clasificación regular y una descripción general de los ganadores por idioma.

Para asegurarse de que su respuesta se muestre, comience con un título, usando la siguiente plantilla de Markdown:

# Language Name, N bytes

¿Dónde Nestá el tamaño de su envío? Si mejora su puntaje, puede mantener los puntajes antiguos en el título, tachándolos. Por ejemplo:

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

Tim
fuente
1
¿No habría un A+y A-? No veo por qué los ignoramos.
ASCIIThenANSI
1
@ASCIIThenANSI hace que sea más interesante tener excepciones, y no hay un máximo para la A, así que no+
Tim
1
Esa tabla de clasificación tiene un error: la versión de pescado es más antigua y mi respuesta es anterior.
Ismael Miguel
@IsmaelMiguel Se escribió cuando la primera publicación aún no era el desempate predeterminado (por lo que no ordena los lazos). Sin embargo, intentaré solucionarlo en algún momento (probablemente no para este desafío, pero al menos la fuente en meta).
Martin Ender
@ MartinBüttner Solo lo estaba señalando.
Ismael Miguel

Respuestas:

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 es una función anónima que toma un int y devuelve la calificación como una cadena.

(gracias a @ MartinBüttner, @grc y @TheNumberOne por los consejos)

Sp3000
fuente
44
"EDCB"[n/10-6]->chr(75-n/10)
grc
¡Qué manera inteligente de seleccionar un personaje que podría estar vacío!
xnor
11

CJam, 34 33 32 bytes

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

Bien, he intentado múltiples enfoques ahora y no puedo obtener esto por debajo de 33, así que aquí va la explicación:

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.

ACTUALIZACIÓN : 1 byte guardado gracias a un puntero de Dennis

Pruébalo en línea aquí

Optimizador
fuente
¿Qué hace el s?
Dennis
@Dennis convierte char + / - / space en cadena para el último<
Optimizer
Eso no debería ser necesario. Character String -empuja una cuerda
Dennis
@ Dennis Ah, tienes razón. Creo que para algunas versiones anteriores, el uso fue diferente.
Optimizador
8

Retina, 43 + 15 = 58 bytes

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

Retina es un lenguaje de expresiones regulares creado por Martin Büttner, donde los archivos impares son la expresión regular con la que deben coincidir, y los archivos pares son con los que reemplazarlos. Cada línea es un archivo separado, así que agregué 15 bytes por cada archivo adicional.

Explicación

Comienza haciendo cualquier cosa con 3 o más dígitos y una A. Agrega un -si es un número de dos dígitos que termina con 0, 1 o 2, y +si termina con 7, 8 o 9. Los números se asignan a su calificación (por ejemplo, un número que comienza con 9 recibe una B). Cualquier número sobrante es automáticamente una F. Desafortunadamente, ;`debe anteponerse a todos menos a la última expresión regular para suprimir la salida intermedia. Actualización: la versión 0.5.0 tiene salida intermedia desactivada por defecto, lo que me permite guardar algunos bytes.

NinjaOsoMono
fuente
¿Estás seguro de que no genera + y - para el caso F?
Tim
1
@Tim No debería, porque \d.*coincide y reemplaza toda la cadena, +incluida.
NinjaBearMonkey
Ahh está bien, ¡puedo ver eso ahora! :)
Tim
8

C, 99 bytes

Soy nuevo aquí, espero seguir las reglas.

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 función toma la marca como parámetro y devuelve la calificación como una cadena terminada en NULL.

Explicación

Espacio en blanco agregado:

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

Las variables globales se inicializan automáticamente a cero, por lo que b se llena con NULL. Como solo se tocan los dos primeros caracteres, solo tenemos que preocuparnos de poner un NULL en b [1] si la calificación tiene solo un carácter. Este NULL se inserta al comienzo de la función. El parámetro n es implícitamente int. Si la calificación es inferior a 60, se establece en 'F', si es superior a 99 se establece en 'A'. En los otros casos, el grado base está dado por 'E' - (n - 60) / 10, lo que se simplifica a 75 - n / 10. n % 10obtiene el dígito de las unidades de la marca. Si es menor que 3, entonces se agrega a -, si es mayor que 6 se agrega a +, de lo contrario se anula b [1] (que ya estaba).

Casos de prueba

#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
fuente
Perfecto :) No hay nada malo allí.
Tim
La diferencia entre su código y el mío es una palabra "printf" que debería guardar más de 3 bytes en caso de que se ignore :)
Abr001am
7

Pyth, 33 bytes

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

Pruébelo en línea: Demostración o conjunto de pruebas

Explicación:

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

> <> (Pescado), 78 71 bytes

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

Método:

  • Leemos los puntos de código de los primeros 3 caracteres x,y,zde la entrada. Si un personaje no está presente, el valor de sus variables será -1implícitamente. ( ord(c)marcará el punto de código del personaje c)
  • Si z > 0(entrada de 3 dígitos) imprime Ay sale.
  • Si x < ord('6') or y < 0(entrada <60) imprime Fy sale.
  • Imprime el personaje con codepoint 123 - x.
  • If y < ord('4') print-` y salir.
  • Si y > ord('6') print+ `y salir.
  • Salida.
randomra
fuente
7

C, 67 65

Sorprendentemente, esto está bastante cerca de la solución de Python.

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

Pero para que este programa llegara a ser tan corto, se tuvieron que hacer sacrificios:

  • Si se imprime una Fo una , ni siquiera mira los otros argumentos pasados. Este es un truco bastante desagradable.Aprintf

  • Si (i%10+1)/4se evalúa como 1(sin +o -deben ser agregados al grado), el %sformateador recibe un puntero a un \0byte, por lo que no se imprime nada. También es bastante divertido, porque no sabía que podía tomar la dirección de un literal de cadena indexado. (por ejemplo &"string"[i]) ( editar : ¡ "string"+ies aún más corto ! Gracias @nutki)

Aquí la salida del programa para los números del 57 al 102. Lo convertí en un hexdump, por lo que podemos estar seguros de que no \0se han impreso bytes extraños .

% 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

El mainmétodo usado:

main(c,v)char**v;{f(atoi(v[1]));}
MarcDefiant
fuente
1
&"string"[i]es innecesario ya que es equivalente a más corto "string"+icon el que puede guardar 2 bytes.
nutki
Debo ser objetivo y votar esto :) felicidades, batiste todos los registros C
Abr001am
6

CJam, 41 39 37 34 bytes

Esto es demasiado tiempo, pero no creo que vaya a jugar más al golf por ahora.

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

Pruébalo aquí. O ejecute todos los casos de prueba aquí.

Tres bytes guardados por Optimizer.

Explicación

(Ligeramente anticuado)

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

GNU sed, 73 + 1 = 74 bytes

El + 1 es para el parámetro -r.

s/^[1-5]?.$/F/
s/.{3,}/A/
s/[7-9]$/+/
s/[3-6]$//
s/[0-2]$/-/
y/9876/BCDE/
Trauma digital
fuente
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]
El numero uno
fuente
5

JavaScript (ES6), 66 bytes

Derecho.

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

R, 107 105 99 bytes

No es un esfuerzo muy bueno, me temo, pero intentaré jugarlo más tarde.

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

Editar cayó un par de ifs. Se corrigió el caso y un resultado incorrecto para 100. Ahora deshacerse del ifelses . Se deshizo del ifelses.

MickyT
fuente
Creo que quieres LETTERSmás que letters.
Alex A.
3

Perl, 66 62 bytes

Esto probablemente se puede jugar más al golf. También una forma diferente podría ser mejor.

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

+1 para -p

Corre con:

echo 72 | perl -pE'$_=$_>99?A:$_<60?F:s/\d$/$&>6?"+":$&<3?"-":""/re;y/9876/BCDE/'
hmatt1
fuente
¿Por qué no usar -py soltar el say?
ThisSuitIsBlackNot
@ThisSuitIsBlackNot gracias! Actualizado
hmatt1
2

Javascript (ES6), 78 79 bytes

Esta realmente no es la opción más inteligente, pero hice lo 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])

Simplemente pase la calificación como una cadena , y devolverá su letra de calificación.

La parte de la cuerda es muy importante.

Puedes consultar un caso de prueba aquí:

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>

Si el espacio adicional después de la carta no está permitido, lo eliminaré con mucho gusto. No fue! Esto aumentó mi código en 1 byte, pero nada (demasiado) serio.

Ismael Miguel
fuente
1
@Tim lo arregló. Espero que sea suficiente. Citando a ti mismo: " One newline after output is fine, but keep it consistent.". Creo que es lo suficientemente consistente.
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?"-":"");}

Traté de ser inteligente haciendo modificaciones de número ASCII, ¡pero parece que no estaba solo!

Gracias a Tim por consejos sobre listas en lugar de ifs.

Gracias a DarcyThomas por señalar que podría usar operadores ternarios anidados.

Transmisión
fuente
1
¿No puedes reducir los ifs usando listas?
Tim
No estoy seguro de lo que quieres decir con listas, ¿podrías explicar un poco?
Transmisión
En Python que puedo hacer esto: [item1,item2][condition]. Si la condición es Verdadera, da el segundo elemento, si es Falso, el primero.
Tim
¡Buena idea! Agregó eso.
Transmisión
Creo que podría usar ternary si las declaraciones, por ejemplo, return <condition> ? <true result> : <false result>tenga en cuenta que también puede return <condition> ? <true result> : <condition> ? <2nd true result> : < 2nd false result>
anidarlas
1

Haskell, 78 bytes

La primera línea se siente derrochadora, cuesta 14 bytes, pero no podría encontrar una versión más corta sin ella.

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

Explicación

El operador #es una abreviatura para crear n copias de su segundo argumento. La lista aes una lista infinita de cadenas "A". La función se findexa en una lista de todos los grados para n = 0,1, ... La comprensión de la lista construye la "parte media" de esta lista (grados E a B); ges un Char único que se antepone a la Cadena s(que puede estar vacía).

Uso

ghci> map f [0,20,65,72,75,80,99,102,864]
["F","F","E","D-","D","C-","B+","A","A"]
usuario40671
fuente
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
fuente
Te estás perdiendo la parte + y -.
Optimizador de
ah ok .... extraño eso
Abr001am
demasiado tiempo :( ....
Abr001am
1

dc, 52

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

Salida

$ 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
fuente
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
fuente
Eso no funciona para números menores a 10.
lirtosiast
Buena captura, Tom, faltaba1+
Timtech
Esto también tiene espacios finales (invisibles) siempre que no haya + o -.
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

TI-BASIC no es bueno para la manipulación de cadenas.

Ingrese en la pantalla de inicio de la calculadora, en forma de [número]: [nombre del programa].

Formateado:

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

Esto probablemente se puede jugar más golf.

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

Aquí hay un violín con algunos casos de prueba.

Barba Blorg
fuente
0

JavaScript (ES6), 86 83 bytes

Lo que realmente se come a los personajes es la String.fromCharCodecondición +/- ... Sospecho firmemente que hay una manera inteligente de acortar al menos uno de ellos.

f=n=>n>99?'A':n<60?'F':String.fromCharCode(75.9-n/10|0)+(n%10<3?'-':n%10>6?'+':'');
vvye
fuente
Si desea un código corto, String.fromCharCode casi siempre es inútil. Use la indexación de cadenas (vea las otras respuestas de JavaScript)
edc65
De todos modos, ~~(.1*-n+75.9)->75.9-n/10|0
edc65
@ edc65 ¡Gracias por el consejo de golf! Voy a tener en cuenta la indexación de cadenas para la próxima ocasión.
vvye
0

PHP5.5, 73 bytes

Una vez más, no es el más corto.

¡Pero funciona!

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

Lo he clasificado en PHP5.5 en lugar de solo PHP ya que usa una sintaxis que solo es válida para PHP5.5 y PHP5.6.

Puede leer sobre la desreferenciación de cadenas y matrices en el manual:
http://php.net/manual/en/migration55.new-features.php

Ismael Miguel
fuente
0

Perl, 52

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

Rubí, 58 Bytes

No podía creer que no haya Ruby aquí. Reflexionando es bastante similar a algunos que ya están aquí, pero de todos modos:

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

Pruébalo aquí

RichieAHB
fuente
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
fuente