Hacer un calificador de competencia matemática

17

Disfruto participando en concursos de matemáticas organizados por Mu Alpha Theta, una sociedad de honor de matemáticas en los Estados Unidos. En las competiciones, tomo un examen de opción múltiple de 30 preguntas. Hay cinco opciones por pregunta, etiquetadas de la A a la E.

Mi puntaje en un examen es de cuatro puntos por cada respuesta correcta, cero puntos por una pregunta en blanco y uno negativo por cada respuesta incorrecta.

Escriba un programa que califique una prueba de acuerdo con el sistema de puntuación anterior. Debe haber dos componentes en la entrada: una clave de respuesta seguida de respuestas. Las preguntas que se dejan en blanco deben ingresarse como espacios en blanco. La primera entrada debe contener solo las letras AE (o ae, a su elección), y se puede suponer que no hay espacios en blanco en la entrada. La segunda entrada solo debe contener espacios en blanco y las letras AE (o ae). Las entradas que no implementan pruebas de 30 preguntas deben imprimirse Invalid testcomo salida.

El resultado debe ser el grado o Invalid test.

Prima

Si su programa imprime el número correcto, el número dejado en blanco y el número incorrecto después de la puntuación final (aR bB cW), retire 20 bytes.

Entrada de muestra

CABBDCABECDBACDBEAACADDBBBEDDA    //answer key
CABEDDABDC BACDBBAADE  CBBEDDA    //responses

Salida de muestra

Sin bonificación

73

Prima

73 (20R 3B 7W)

Aplican reglas estándar. El código más corto en bytes gana.

Arcturus
fuente
¿Qué debemos hacer con espacios en la primera línea?
lirtosiast el
@ThomasKwa No debería haber espacios en la primera línea. Invalid test.
Arcturus
2
Parece que cambiaste las reglas después de que se publicaron las respuestas, que invalidaron al menos 2 de ellas. No realice cambios que puedan invalidar las respuestas después de publicar un desafío. Es una buena idea usar Sandbox para obtener comentarios antes de publicar.
Alex A.
Creo que esto habría sido más interesante como solapada
gato
¿Qué hay de mayúsculas y minúsculas? Además, ¿qué pasa si mi idioma es ... desagradable por el espacio en blanco? ¿puedo especificar espacios en blanco en la entrada deberían ser guiones bajos en su lugar?
gato

Respuestas:

7

Pyth, 53 51

?&!-sJ.z+d<G5&FqR30lMJ+sm?qFd4_1CJ/eJd"Invalid test

Pruébalo en línea

Las comprobaciones se realizan al ver si toda la entrada contiene caracteres cuando a-ese eliminan todos los espacios y , y al verificar si ambas cadenas tienen longitud 30.

El cálculo de la puntuación se realiza por comprimir las dos líneas juntas, a continuación, mediante la asignación de cada par a: (letters are equal) ? 4 : -1. Luego, simplemente sume los valores y agregue el número de espacios en la segunda línea de nuevo al puntaje.

FryAmTheEggman
fuente
1
Sin errores. (Actualmente menos bytes que la respuesta de Dennis ...)
Arcturus
7

En serio , 86 bytes

,`;l5╙¬=);' UΣS" ABCDE"=(**;l`Mi@)=YWé"Invalid test"0WX@Z```i@;(=5*(' =D+`(;l@)5╙¬=IMΣ

Toma entrada como "CABBDCABECDBACDBEAACADDBBBEDDA", "CABEDDABDC BACDBBAADE CBBEDDA"

Pruébelo en línea (deberá ingresar manualmente la entrada porque a los enlaces permanentes no les gustan las comillas)

Trabajando en el bono ahora. No, agregar el bono costaría más de 20 bytes.

Sabía que estaba olvidando algo ... Invalid Test no se imprimía en caso de error. Ahí van mis esperanzas de superar a Dennis.

Mego
fuente
¿Lo hace? ¿Seriamente? Entonces tengo que
votarlo
4

JavaScript (ES6), 134 bytes

Editar: los requisitos de la pregunta cambiaron. Esta respuesta es de cuando el programa necesitaba asegurarse de que cada carácter de respuesta sea AE, cada carácter de respuesta sea AE o espacio y ambos tengan longitudes de 30, de lo contrario regreseInvalid test .

(a,r)=>[...a].map((q,i)=>q>"E"|q<"A"?x=1:(c=r[l=i])==" "?0:c>"E"|c<"A"?x=1:c==q?s+=4:s--,s=x=0)&&x|l!=29|r.length!=30?"Invalid test":s

Explicación

(a,r)=>                   // a = answer string, r = responses string
  [...a].map((q,i)=>      // iterate over answers, q = answer, i = question number
    q>"E"|q<"A"?x=1:      // x = 1 if answer is invalid
    (c=r[l=i])==" "?0:    // c = question response, l = answer length, add 0 for space
    c>"E"|c<"A"?x=1:      // x = 1 if response is invalid
    c==q?s+=4:s--,        // add 4 if correct, subtract 1 if incorrect
    s=x=0                 // s = total score, x = is invalid
  )&&
    x|l!=29|r.length!=30? // check input lengths for validity
      "Invalid test":
      s                   // return the score

Prueba

<input type="text" id="answers" value="CABBDCABECDBACDBEAACADDBBBEDDA" /><br />
<input type="text" id="responses" value="CABEDDABDC BACDBBAADE  CBBEDDA" /><br />
<button onclick='result.innerHTML=(

(a,r)=>[...a].map((q,i)=>q>"E"|q<"A"?x=1:(c=r[l=i])==" "?0:c>"E"|c<"A"?x=1:c==q?s+=4:s--,s=x=0)&&x|l!=29|r.length!=30?"Invalid test":s

)(answers.value,responses.value)'>Go</button><pre id="result"></pre>

usuario81655
fuente
3

CJam, 60 bytes

2{l_,30=\N?}*_2$|S'F,65>+-!@2$.{=4W?}@' f=+:+"Invalid test"?

Pruébelo en línea en el intérprete de CJam .

Dennis
fuente
3

JavaScript (Firefox 31+), 86 bytes

(x,y)=>(r=i=0,[for(l of y)x[i++]==l?r+=4:r-=l!=' '],i!=30|i-x.length?'Invalid test':r)

Utiliza la comprensión de matriz que se propone para ES7. Por lo tanto, el soporte se limita a Firefox por el momento.

Con bonificación, 106 bytes (126-20)

(x,y)=>[r=w=i=0,[for(l of y)x[i++]==l?r++:w+=l!=' '],`${r*4-w} (${r}R ${i-r-w}B ${w}W)`,'Invalid test'][i!=30||i-x.length?3:2]

Editar: Anteriormente, mi solución solo verificaba la respuesta o la longitud de la pregunta, ahora verifica ambas.

George Reith
fuente
Puede omitir f=al principio y decir que esto genera una función lambda.
Conor O'Brien
1
@ CᴏɴᴏʀO'Bʀɪᴇɴ Gracias, siempre olvido que está en sus pruebas -_-
George Reith
Esto sería significativamente más corto sin la bonificación. 86 bytes:(x,y)=>(r=i=0,[for(l of y)x[i++]==l?r+=4:r-=l!=' '],i!=30|i-x.length?'Invalid test':r)
user81655
@ user81655 Verdadero, gracias ... me puse un poco atrapado en él ... la cadena de plantilla solo es de 34 bytes
George Reith
Tengo una respuesta muy similar, pero no copié esta (mi primer intento es precedente, pero la eliminé porque no estaba comprobando las longitudes). Dicho esto: esto no es válido a pesar de 3 votos a favor, ya que no comprueba el rango A ... E
edc65
2

Japt , 71 bytes

Japt es una versión abreviada de Ja vaScri pt . Interprete

Ul ¥30©Vl ¥30«(U+V k"[A-E ]+" ?U¬r@VgZ ¥Y?X+4:VgZ ¥S?X:X-1,0 :`InvÃ. È.

Los dos .s al final deben ser los caracteres Unicode no imprimibles U + 0017 y U + 0099, respectivamente.

Cómo funciona

Ul ==30&&Vl ==30&&!(U+V k"[A-E ]+" ?Uq r@VgZ ==Y?X+4:VgZ ==S?X:X-1,0 :"Invalid test
                    // Implicit: U = first input, V = second input
Ul ==30&&Vl ==30&&  // If both input lengths are 30, and
!(U+V k"[A-E ]+"?   // removing all ABCDE and spaces from (U+V) results in an empty string:
Uq r@            ,0 //  Reduce U with this function, starting with a value of 0:
VgZ ==Y?            //   If the matching char in V is equal to this char, 
X+4                 //    return previous value + 4.
:VgZ ==S?X          //   Else if the matching char in V is a space, return previous value.
:X-1                //   Else (if it's wrong), return previous value - 1.
:"Invalid test      // Else, return "Invalid test".
                    // Implicit: output last expression

Espero que haya una forma más corta de asegurarse de que ambas longitudes sean iguales a 30. ¡Se aceptan sugerencias!

ETHproducciones
fuente
2

Haskell, 144 138 bytes

a%b|map length[a,b]==[30,30]&&"ABCDE"!a&&"ABCDE "!b=show$sum$zipWith(?)a b|0<1="Invalid test"
l!s=all(`elem`l)
_?' '=0
x?y|x==y=4|0<1=0-1

Sería alrededor de 50 sin la validación. sniff .

Uso: "ABCDEABCDEABCDEABCDEABCDEABCDE" % "AAAAABBBBBCCCCCDDDDDEEEEEAAAAA"

Leif Willerts
fuente
1
!se puede definir como all(`elem`l)s, guardar 6 bytes.
Zgarb
1
... o pointfree ir: g=all.flip elem.
nimi
2

C #, 162 154 148 134 bytes

string g(string k,string a)=>k.Length!=30||a.Length!=30?"Invalid Test!":Enumerable.Range(0,30).Sum(e=>a[e]==' '?0:k[e]==a[e]?4:-1)+"";

Uso

g("CABBDCABECDBACDBEAACADDBBBEDDA", "CABEDDABDC BACDBBAADE  CBBEDDA")

Prueba

http://csharppad.com/gist/15f7c9c3c8cfce471ff2

noisyass2
fuente
Puede cambiarlo int s=0,i=0;for(;...para guardar 3 bytes.
LegionMammal978
Esto no funcionará si ingreso 29 caracteres para la primera entrada y 31 para la segunda. Debería imprimir "prueba no válida" pero en realidad intentará calificar.
Johan
@ noisyass2: string x (string k, string a) => k.Length! = 30 || a.Length! = 30? "Invalid Test!": Enumerable.Range (0,30) .Sum (e => a [e] == ''? 0: k [e] == a [e]? 4: -1) + ""; (134 caracteres) y considera la entrada de Johans.
Stephan Schinkel
+1 para la solución, pero ¿califica esto? OP dijo que el programa completo.
Yytsi
Johan buena captura! @StephanSchinkel gracias por la idea de usar el delegado y el bit Enum.range. Pude afeitarme con 3 caracteres más cambiando la condición a 30 == (k.Length & a.Length)
noisyass2
2

Ruby, 81 caracteres

->t,s{r=0;30.times{|i|r+=t[i]==s[i]?4:s[i]>' '?-1:0};t.size==30?r:'Invalid test'}

Ejecución de muestra:

2.1.5 :001 > ->t,s{r=0;30.times{|i|r+=t[i]==s[i]?4:s[i]>' '?-1:0};t.size==30?r:'Invalid test'}['CABBDCABECDBACDBEAACADDBBBEDDA','CABEDDABDC BACDBBAADE  CBBEDDA']
 => 73 

2.1.5 :002 > ->t,s{r=0;30.times{|i|r+=t[i]==s[i]?4:s[i]>' '?-1:0};t.size==30?r:'Invalid test'}['CCCATCH','CABEDDABDC BACDBBAADE  CBBEDDA']
 => "Invalid test" 
hombre trabajando
fuente
2

Java, 183 169 bytes

Esta fue una buena práctica de Java 8:

String f(String a,String r){return a.length()==30&r.length()==30?""+IntStream.range(0,30).map(i->a.charAt(i)==r.charAt(i)?4:r.charAt(i)!=' '?-1:0).sum():"Invalid test";}
RCB
fuente
No soy un golfista de Java, pero creo que puedes guardarlo String.valueOfsimplemente agregando el int a una cadena vacía ( ""+IntStream....). También creo que Java permite el no cortocircuito y, por lo tanto, puedes eliminar uno de los &y guardar un byte .
VisualMelon
@VisualMelon Grandes consejos, gracias. Me molestaba cuántos bytes ocupaba String.valueOf!
RCB
2

brainfuck, 354 bytes

+[--[>]<<+>-],----------[[<<<]>>->[>>>],----------]<<<[<<<]>>+[<-[-------<+>]<.+[---<+>]<.++++++++.[-<+++>]<-.+++++++++++.---.-----.-[---<+>]<-.---[-<++++>]<.+++[-<+++>]<.[---<+>]<----.+.>]>[[>,----------->+++++++[<---<<+++>>>-]<[<<+[>>+<<-]]>[>]<<<[>[>+>+<<-]>>[<<+>>-]>[>>>]>----<<<<[<<<]>>[-]]>[>-<-]>[>>[>>>]>-----<<<<[<<<]>[-]]>>]----[>+++<--]>--.<]

Requiere un intérprete que le permita ir a la izquierda desde la celda 0. La salida es un byte firmado. Por ejemplo, el byte 0x49se imprime para la entrada de ejemplo, y 0xFFse imprime para la entrada con la misma primera línea pero la segunda línea reemplazada por "C" y 29 espacios.

El puntaje comienza en 0 y, a medida que se lee la segunda línea de entrada, se le realizan estos cambios:

  • La entrada es correcta: no hacer nada
  • La entrada es incorrecta: resta 5
  • La entrada es un espacio: resta 4

Finalmente, se agrega 120. Esto es funcionalmente lo mismo que asumir un puntaje perfecto y aplicar penalizaciones, en lugar de comenzar en 0.

Con comentarios:

+[--[>]<<+>-]                          Get 29

,----------[[<<<]>>->[>>>],----------] Get first line of input; for each char sub one
                                       from the 29

<<<[<<<]>>+                            Add one to the cell that originally held 29

[                                      If the cell that originally held 29 is nonzero:

  Write "Invalid test"
  <-[-------<+>]<.+[---<+>]<.++++++++.[-<+++>]<-.+++++++++++.---.-----.-[---<+>]<-.---[-<++++>]<.+++[-<+++>]<.[---<+>]<----.+.

>]

>[                                     If the cell to the right is nonzero:

  This block is only ever entered if "Invalid test" isn't written!

  [                                      For all 30 characters of the first input:

    >,                                     Get char from second input to the right

    ----------                             Subtract 10 for consistency

    -                                      Subtract one more

    >+++++++[<---<<+++>>>-]                Subtract 21 (plus above lines = 32)

    <[                                     If it's nonzero:

      <<+[>>+<<-]                            Add 22 to the character

    ]

    >[>]<<<[                                 If the above block wasn't entered:

      >[>+>+<<-]>>[<<+>>-]                   Make a copy of the character from input 1

      >[>>>]>----                            Subtract 4 from the score

      <<<<[<<<]>>[-]                         Go to the cell just before first character

    ]

    >[>-<-]                                Subtract input 1 char from input 2 char

    >[                                     If the result is nonzero:

      >>[>>>]>-----                          Subtract 5 from the score

      <<<<[<<<]>[-]                          Go back to the result and set it to 0

    ]

    >>                                     Move on to next character

  ]

  ----[>+++<--]>--                       Add 120 to score (perfect score)

  .                                      Print score

  <                                      Go to an empty cell to kill loop

]
metro subterráneo
fuente
1

Pitón 3, 187 179 175 165 155 151

lambda a,b:(['Invalid test',sum([-1,4][i==j]for i,j in zip(a,b))+b.count(' ')][len(a)==len(b)==30and set(a)^set('ABCDE')==set(b)^set('ABCDE ')==set()])
Trang Oul
fuente
1

JavaScript ES7, 102

Como de costumbre, el bono no vale la pena.

(k,h,t=i=0)=>[for(x of h)t+=k[i++]==x?4:1-x?0:-1]|/[^ A-E]/.test(k+h)|i-30|k.length-i?"Invalid test":t

Comprobación de espacios no válidos en la primera entrada (ya que esto tiene sentido para mí) 112

(k,h,t=i=0)=>[for(x of h)(y=k[i++])>' '?t+=y==x?4:1-x?0:-1:k=h+h]|/[^ A-E]/.test(k+h)|i-30|k[i]?"Invalid test":t
edc65
fuente
Ugh, la validación tomó la mitad de mi código cuando lo intenté: (k,r,s=0)=>/^[A-E]{30}$/.test(k)&&/^[ A-E]{30}$/.test(r)?Object.keys(k).map(i=>k[i]==r[i]?s+=4:s-=r[i]!=' ').pop():'Invalid Test'es 129 bytes.
Neil
1

Python 2.7, 131, 116, 109 , 139

Traté de hacer una solución "corta" de Python ... Bueno, aquí está, las sugerencias son más que bienvenidas

lambda c,d:d.count(' ')+sum([-1,4][a==b]for a,b in zip(c,d)if b!=' ')if not set('ABCDE ')^set(c+d)and len(c)==len(d)==30 else'Test Invalid'

Agregar algunos caracteres más lo hace mucho más legible ...

def m(c, d):
    if len(c)==len(d)==30:return d.count(' ')+sum((a==b)*4+(a!=b)*-1 for a,b in zip(c,d)if b!=' ')
    return'Test Invalid'
N3buchadnezzar
fuente
1

Prólogo, 165 bytes

Más de la mitad de los bytes son para la comprobación de pruebas no válidas.

Código:

p(X,X,4).
p(_,32,0).
p(_,_,-1).
A*B:-length(A,30),length(B,30),subset(A,`ABCDE`),subset(B,`ABCDE `),maplist(p,A,B,L),sum_list(L,S),write(S);write('Invalid Test').

Explicado:

p(X,X,4).                                       % If corresponding elements are equal, 4p
p(_,32,0).                                      % If answer is 'space', 0p
p(_,_,-1).                                      % Else, -1p
A*B:-length(A,30),length(B,30),                 % Check that input is of correct length
     subset(A,`ABCDE`),subset(B,`ABCDE `),      % Check that input has correct characters
     maplist(p,A,B,L),sum_list(L,S),write(S);   % Create a list of scores (L) and print sum
     write('Invalid Test').                     % If anything failed, write Invalid Test

Ejemplo:

`CABBDCABECDBACDBEAACADDBBBEDDA`*`CABEDDABDC BACDBBAADE  CBBEDDA`.
73

Pruébelo en línea aquí

Emigna
fuente
1

MATLAB, 92 90 bytes

¡Gracias a Tom Carpenter por ayudarme a reducir mi respuesta en 2 bytes!

function c(q,a),if nnz(q)~=30,t='Invalid test';else s=q-a;t=5*nnz(~s)-sum(s<9);end,disp(t)

Se puede llamar a la función asignando la hoja de respuestas a q y las respuestas enviadas a a . p.ej:

c('CABBDCABECDBACDBEAACADDBBBEDDA','CABEDDABDC BACDBBAADE  CBBEDDA')

La respuesta simplemente se imprime en la pantalla. Se pueden guardar 8 bytes si se permite imprimir ans = 73

slvrbld
fuente
Puede guardar 2 bytes reemplazando numel(q)con nnz(q).
Tom Carpenter
1

C # 6.0 -> (270-20 = 250) 246-20 = 226 bytes

void m(string b,string c){if((b+c).Length==60){var a=new int[3];int s=0;for(int i=0;i<30;i++){if(b[i]==c[i]){a[0]++;s+=4;}else if(c[i]==' ')a[2]++;else{a[1]++;s--;}}Console.Write(s+$" ({a[0]} {a[2]} {a[1]})");}else Console.Write("Invalid test");}

Versión legible y sin golf:

    void m(string b, string c)
    {
        if ((b+c).Length==60)
        {
            var a = new int[3];
            int s = 0;
            for (int i = 0; i < 30; i++)
            {
                if (b[i]==c[i])
                {
                    a[0]++;
                    s+=4;
                }
                else if (c[i] == ' ')a[2]++;
                else
                {
                    a[1]++;
                    s--;
                }
            }
            Console.Write(s+$" ({a[0]} {a[2]} {a[1]})");
        }
        else Console.Write("Invalid test");
    }

Realmente quería obtener la bonificación: D

Yytsi
fuente
¡Buen trabajo! Algunos de los trucos generales que se aplican aquí, puede declarar ijunto cons fuera del bucle for. Puede usar varpara declarar a, ahorrando 1 byte (¡hurra!). No necesita muchas de las llaves {}en su código, que siempre es una buena forma de recortar bytes, y siempre vale la pena mirar una tabla ASCII al comparar caracteres (puede eliminar un byte de c[i]==' 'alguna manera usando una desigualdad). También debe considerar contar a través de las cadenas hacia atrás; en este caso, puede guardar al menos 1 byte volviendo a ajustar el bucle for.
VisualMelon
Desafortunadamente, su envío no es actualmente cómplice de los criterios, ya que no puede reconocer entradas no válidas.
VisualMelon
@VisualMelon Ahh, me siento tan tonto. Escribí esta presentación en la escuela, así que olvidé agregar las cosas de "prueba no válida", etc. Las
agregaré
@VisualMelon Sí, esto fue presentado y escrito en la escuela al final de la clase, lo editaré. Gracias por los trucos :)
Yytsi
0

Groovy 2.4.5, 107 bytes

Solo una traducción simple de la respuesta anterior de Java .

f={a,b->a.length()==30&b.length()==30?(0..29).collect{a[it]==b[it]?4:b[it]!=' '?-1:0}.sum():'Invalid test'}
J Atkin
fuente
0

C, 273 - 20 = 253 bytes

#include<stdio.h>
#include<string.h>
int main(int c,char**v){char*p=v[1],*q=v[2],*s=" ABCDE",r[]={0,0,0};if(strspn(p,s+1)!=30||p[30]||strspn(q,s)!=30||q[30])puts("Invalid test");else{for(;*p;++q)++r[(*p++!=*q)+(*q==' ')];printf("%d (%dR %dB %dW)",4**r-r[1],*r,r[2],r[1]);}}

He tomado el bono, aunque me costó 23 bytes solo para imprimirlo. :-(

Explicación

#include <stdio.h>
#include <string.h>
int main(int c,char**v)
{
    char *p=v[1], *q=v[2],      /* arguments */
        *s=" ABCDE",            /* valid chars */
        r[]={0,0,0};            /* results - right, wrong, blank */

    if (strspn(p,s+1) != 30     /* validity check - answer key begins with [A-E]{30} */
        || p[30]                /* and ends there */
        || strspn(q,s) != 30    /* same for answers, but allow space, too */
        || q[30])
    {
        puts("Invalid test");
    } else {
        for ( ;  *p;  ++q)      /* for each answer */
            ++r[(*p++!=*q)+(*q==' ')]; /* increment the appropriate counter */
        printf("%d (%dR %dB %dW)",4**r-r[1],*r,r[2],r[1]); /* print result */
    }
}

Hay dos veces más código para verificar la entrada no válida que para contar las respuestas: la verdadera esencia del desafío está en el forciclo cerca del final. De hecho, aquí hay una versión que asume que la entrada siempre es válida, en 163-20 = 143 bytes:

#include<stdio.h>
int main(int c,char**v){char*p=v[1],*q=v[2],r[]={0,0,0};for(;*p;++q)++r[(*p++!=*q)+(*q==' ')];printf("%d (%dR %dB %dW)",4**r-r[1],*r,r[2],r[1]);}

Y uno que asume lo mismo e imprime solo la puntuación, en 133 bytes:

#include<stdio.h>
int main(int c,char**v){char*p=v[1],*q=v[2],r[]={4,-1,0};for(c=0;*p;++q)c+=r[(*p++!=*q)+(*q==' ')];printf("%d",c);}
Toby Speight
fuente
0

SAS 9.4, 291-20 = 271 bytes (con bonificación) o 231 bytes (sin bonificación)

Con bonificación:

data a;k='CABBDCABECDBACDBEAACADDBBBEDDA';r='CABEDDABDC BACDBBAADE  CBBEDDA';c=0;b=0;w=0;if length(k) ne 30 then put "Invalid test";do i=1 to 30;if substr(k,i,1)=substr(r,i,1) then c=c+1;else if substr(r,i,1) =' ' then b=b+1;else w=w+1;end;a=cat(c*4-w,' (',c,'R ',b,'B ',w,'W)');put a;run;

Sin bonificación:

data a;k='CABBDCABECDBACDBEAACADDBBBEDDA';r='CABEDDABDC BACDBBAADE  CBBEDDA';c=0;if length(k) ne 30 then put "Invalid test";do i=1 to 30;if substr(k,i,1)=substr(r,i,1) then c=c+4;else if substr(r,i,1)ne' ' then c=c-1;end;put c;run;

Sas realmente no tiene una entrada / salida, por lo que necesitaría reemplazar k = '..' con la clave y r = '..' con la respuesta. La salida se imprime en el registro.

TMP4
fuente