Su tarea es determinar si una cadena dada tiene la longitud adecuada y se puede representar con mosaicos Scrabble y, de ser así, generar la suma de la puntuación de cada letra.
Si no sabes cómo jugar Scrabble: tienes 100 fichas con varias letras de la A a la Z impresas, así como dos comodines que pueden representar cualquier letra. Cada letra tiene un cierto número de puntos, y cada mosaico (pero no necesariamente una palabra) solo se puede usar una vez. Cuando se juega una palabra, se suma el valor en puntos de cada ficha utilizada, que se convierte en la puntuación. Como hay un número limitado de letras disponibles, una palabra solo puede tener una letra determinada tantas veces como esa letra tenga mosaicos + cualquier comodín no utilizado. El tablero de Scrabble tiene 15 × 15 celdas, por lo que la palabra debe tener entre 2 y 15 caracteres de longitud.
Para obtener una lista de la cantidad y el puntaje de cada letra en la versión en inglés, consulte a continuación o http://boardgames.about.com/od/scrabble/a/tile_distribute.htm ( archivo ).
Puntos de cantidad de letras Puntos de cantidad de letras ------------------- ------------------- A 9 1 O 8 1 B 2 3 P 2 3 C 2 3 Q 1 10 D 4 2 R 6 1 E 12 1 S 4 1 F 2 4 T 6 1 G 3 2 U 4 1 H 2 4 V 2 4 I 9 1 W 2 4 J 1 8 X 1 8 K 1 5 Y 2 4 L 4 1 Z 1 10 M 2 3 [salvaje] 2 0 N 6 1
Reglas adicionales
- El programa tomará una sola cadena de entrada de STDIN o similar.
- La entrada siempre contendrá solo letras mayúsculas.
- Si la cadena contiene más copias de una letra que comodines o mosaicos no utilizados para esa letra O la longitud de la cadena no está comprendida entre 2 y 15 inclusive, el programa debería salir
Invalid
. - De lo contrario, el puntaje debe sumarse con el uso de datos del cuadro anterior y la salida.
- No use comodines a menos que sea necesario.
- No se preocupe por las bonificaciones, como las puntuaciones de palabras dobles o si la cadena es una palabra real.
- El programa enviará el resultado a través de STDOUT o similar.
- Las lagunas prohibidas por defecto no están permitidas.
- No se permite el uso de una fuente externa como un sitio web, así como bibliotecas, API, funciones o similares que calculen los puntajes de Scrabble o las cantidades adecuadas.
- Este es el código de golf , por lo que gana menos bytes.
Tutorial
Input: CODEGOLF
C -> 3, O -> 1, D -> 2, E -> 1, G -> 2, O -> 1, L -> 1, F -> 4
3 + 1 + 2 + 1 + 2 + 1 + 1 + 4 = 15
Output: 15
Casos de prueba
De entrada y salida ------------------------ SCRABBLE 14 JAZZ 19 STACKEXCHANGE 32 XYWFHQYVZVJKHFW 81 PIZZAZZ Inválido KIXOKEJAJAX inválido ENTENDIMIENTO INCORRECTO
fuente
-1
?Invalid
.Respuestas:
Perl 5
228 205 186 184 178 177 153 150 149 142 137135Ejecutar con perl -E.
Golfizado:
Esta solución utiliza algunos caracteres no imprimibles, por lo que a continuación se proporciona un volcado hexagonal:
Alternativamente, usando Ctrl + Key:
Ungolfed + comentó:
fuente
-M5.010
(penalización de 0 porque especifica una versión del lenguaje a usar) en lugar de-e
(penalización de 1)? Es posible que pueda guardar un byte en los argumentos.C, Rev 2,
151 145138Inspirado por el código de 159 bytes en el comentario de @bebe, exprimí otros
8 1421 caracteres:Se guardan 4 bytes al reorganizar el contador de longitud
i
. Esto se inicializa a 1 (suponiendo que el programa no tome argumentos) y luego se multiplica por 4 cada vez que se lee una carta. Se desborda a cero cuando la longitud de la palabra es mayor que 15, por lo que para verificar si la longitud de la palabra es incorrecta, simplemente verificamos sii<5
(lo pongo,i<9
por lo que aún dará validez para las palabras de una letra si el usuario accidentalmente iniciai
a 2 poniendo un solo argumento en la línea de comando).Se guardan 4 bytes cambiando la prueba de condición de bucle a simple
&31
. Esto requiere que la palabra se termine con un espacio (ASCII 32) o un carácter nulo (ASCII 0). Normalmente, la entrada del teclado se termina con una nueva línea (ASCII 10), por lo que el programa es un poco incómodo de usar, ya que debe escribir el luego presione la tecla de retorno para que la computadora lea el búfer. Para cadenas terminadas en nueva línea, podría coincidir pero no superar la forma en que lo hace.613 bytes guardados cambiando la codificación a - (número de mosaicos de cada letra) - (puntaje para esa letra-1) * 13 . Esto ahora requiere un rango de -4 para L, S, U a -118 para Q, Z. La razón para usar números negativos es evitar el rango ASCII no imprimible de 0 a 31. En cambio, el rango utilizado es el complemento a dos de los números negativos 256-4 = 252 a 256-118 = 138. Estos son caracteres ASCII extendidos e imprimibles. Hay problemas al copiar y pegar estos en Unicode (la forma en que se simplifica de nuevo a ASCII depende de la página de códigos instalada, lo que puede conducir a resultados impredecibles), por lo que he incluido los códigos ASCII correctos en el comentario del programa.La ventaja de esta codificación es la eliminación de la variable,
r
ya que el número de mosaicos siempre se reduce en 1 (ya que se almacena como un número negativo, lo hacemost[x]++
. Además, el operador postfix significa que podemos realizar este incremento al mismo tiempo que agregando el puntaje as
.C,
184Rev 1 173 (o 172 con opción de compilador)Estoy usando GCC, y con la opción del compilador
-std=c99
me permitirá pasarchar t[]="...."
a la inicialización delfor
bucle para guardar un punto y coma adicional. Para facilitar la lectura, he mostrado el programa sin este cambio y con espacios en blanco.El truco está en la tabla de datos. Para cada letra, se almacena en la tabla un código ASCII del formulario (puntaje total de mosaicos para esa letra) * 10 + (puntaje de un mosaico-1)
t[]
. En tiempo de ejecución, estos puntajes totales se reducen a medida que se agotan las fichas.El puntaje total de todas las fichas para cada letra varía de 12 para E a 4 para L, S, U. Esta forma de codificación solo permite el uso de caracteres ASCII imprimibles (ASCII 120,
x
para E hasta ASCII 40,(
para L, S, U). El uso del número de mosaicos necesitaría un rango de 120 a 10, por lo que I lo evitéGracias a una
#define
macro, un solo símboloT
se utiliza en el programa principal para recuperar el índice cartai
del primer argumento de línea de comandos, restar ASCIIA
= 65 de ella para dar un índice, y mirar hacia arriba en la tabla T:t[x[1][i]-65]
.El
for
bucle se usa más como unwhile
bucle: el bucle termina cuando se encuentra un byte cero (terminador de cadena) en la cadena de entrada.Si los mosaicos de esa letra no están agotados (
T/10
es distinto de cero)s
se incrementa la puntuación del mosaicoT%10+1
para mantener un puntaje total. Al mismo tiempo, el puntaje de mosaico se almacenar
, de modo que el valor en la capacidad representada porT
se puede disminuirr*10
para indicar que se ha utilizado un mosaico. Si las fichas están agotadas, el comodín / contador en blancob
se incrementa.La
printf
afirmación es bastante autoexplicativa. Si la longitud de palabra está fuera de límites o el recuento en blanco es demasiado alta, imprimirInvalid
otra manera imprimir la partituras
.fuente
?
y:
. Su otro punto se reemplaza, ya que he cambiado completamente la codificación, por lo que no hay necesidad de ningún manejo especial de Q y Z. Ahora baje a 173/172 con su ayuda.getchar()
su 159:l,w,f;main(t,i){for(char b[]="Z>>QxS=SZW6(><P>m<(<(SSWSm";(i=getchar()-65)>=0;l++)b[i]/10?f+=t=b[i]%10+1,b[i]-=t*10:w++;printf(l<2|l>15|w>2?"Invalid":"%d",f);}
aunque todavía no entiendo por qué sechar*foo=<string>
bloquea. Podría ahorrar 2 caracteres.char*foo="string"
es un literal de cadena y no se permite modificar su contenido. Por otro lado,char foo[]="string"
crea una matriz de caracteres inicializadosstring\0
, que luego pueden modificarse.getchar().
He usado tus mejoras en el código (con mis nombres de variables para mantener la coherencia con el resto de mi respuesta), además de una mejora en la verificación de validez de longitud de palabra y una mejora descarada en la condición del bucle prueba (intenté acortar la tuya pero no pude hacerlo con la misma funcionalidad). También lo intentégetche()
ygetch()
mi compilador (gcc en cygwin) no los enlazó automáticamente.JavaScript (ES6) -
241230199182Editar : cambió la forma en que codifiqué las cantidades / puntajes para reducir el tamaño y eliminar las variables que no son ascii
Edición 2 : cambió las codificaciones de cantidad / puntuación a enteros en lugar de cadenas
Edición 3 : cambió a
%13
(gracias @ edc65), invirtió la codificación, modificó los valores directamente y algunas otras mejoras menoresProbado en la consola de Firefox.
fuente
f[c]=1+f[c]||1
->f[c]=-~f[c]
, 2.por qué no usar% 13%13
Sin embargo, es un golpe de genio. Me quedé atrapado pensando que tenía que almacenar cosas en dígitos, pero a las matemáticas no les importa la diferencia entre base10 y base13.SyntaxError: Unexpected token >
)f=s=>{...}
notación).Pitón 3,
217201Sin golf:
Editar: ¡ Gracias a @BeetDemGuise por un consejo que finalmente me llevó a mucho más que una reducción de 1 carácter! Código original a continuación:
fuente
int('1332142418513113a11114484a'[o],16)
:)BEFUNGE 93 - 210 bytes.
Pero no verifica el límite de 15 letras.
fuente
C, 197
Asume que la cadena se proporciona como un argumento de línea de comando, por ej.
./scrabble STACKEXCHANGE
fuente
JavaScript -
232201z
almacena la palabra Salidas como alerta.Editar: mejorado según las recomendaciones a continuación.
fuente
s
solo se usa una vez, por lo que no es necesario que sea una variable; puedes eliminar esa declaración y reemplazarlar+=s[x]
porr+=-~"02210313074020029000033739"[x]
. Además, no necesita paréntesis(w>2|y<2|y>15)
en la alerta.Haskell - 538
Guárdelo como scrabble.hs y luego compílelo usando
Luego ingrese su palabra como entrada y presione enter
fuente
"ABCDEFG"
puede ser escrito como['A'..'G']
,[1,2,3]
puede ser escrito como[1..3]
Python 2.7 - 263
No pude acercarme a la respuesta de DLosc , pero esto trata cada letra como una 'bolsa' de la que sacas, hasta que está vacía, luego sacas espacios en blanco, y cuando está vacía, se produce un error.
fuente
raw_input
si es Python2 (una cosa que me gusta de Python3). La entrada está garantizada en mayúsculas, por lo tanto, elimine.lower()
y cambie97+i
a65+i
. La entrada de menos de 2 caracteres también debe ser inválida. Puede aumentar el error de división cero sin unaif
declaración: divida su puntaje total entre(1<len(S)<16)
. Un par de otros ajustes como poner laprint
s en la misma línea que los encabezados de bloque y eliminar el espacio antes"Invalid"
lo reduce a 250 por mi cuenta. :)Haskell,
290283Tan lejos como pude hacerlo por ahora:
Este código cumple estrictamente las reglas, así que asegúrese de no pasarle ningún carácter adicional (como el final de línea). Utilice la siguiente manera:
echo -n "JAZZ" | runghc scrabble.hs
.Explicación
El patrón
(_:_:_)
asegura que solo se consideren cadenas de al menos dos caracteres, todo lo demás da como resultado"Invalid"
(patrón de reserva_
). La tabla de mosaicos se codifica como11*nTiles+value
convertida a ASCII con un desplazamiento que permite que funcione el módulo de búsqueda 11, donde las letrasAEIO
se duplican porque ocurren más de 6 veces cada una. El grupo de mosaicos se crea utilizandoreplicate
, de donde se eliminan los caracteres de la palabra a medida que ocurren (diferencia de lista,\\
) El grupo contiene 98 mosaicos, por lo que si la longitud total de la palabra y la parte restante del grupo es mayor que 100, entonces hemos usado demasiados comodines. Además, la palabra menos las primeras 15 letras se agrega tres veces al cálculo de longitud, por lo que cualquier palabra de más de 15 letras parece usar automáticamente tres comodines y, por lo tanto, no es válida. La puntuación se realiza en el grupo restante, que inicialmente tenía 187 puntos, de los que simplemente restamos. Tenga en cuenta que enf 61
lugar def 65
, 65 es el número ASCII de'A'
, debido al duplicado"AEIO"
al comienzo del grupo. El resto es solo repetitivo.fuente
Python3 - 197
Pongamos los bignums en uso: D (actualmente no maneja comodines, he omitido leer esa regla por completo, maldición)
fuente
Rubí - 195
Supongo que la salida de
"Invalid"
está bien, si no, tendría que hacer lo$><<(-b<1&&w.size<16?s:'Invalid')
que lo elevaría a 198Clojure - 325
No he hecho clojure en un tiempo, así que estoy seguro de que hay varias formas de mejorar mi solución. Por ejemplo, las listas de cantidad y puntos
Algo de lo que no es golf
fuente
ES6: 184 (no estricto)
w
se supone que ya contiene la palabra.r
es la cadena de salida.Aquí está explicado y un poco menos golfizado:
fuente
Dart - 201
Esto requiere bignums, por lo que no se compilará en JavaScript.
Con más espacios en blanco:
fuente
PHP,
180170168 bytes¡Hurra! venciendo a JS!
Descompostura
Estoy muy contento de que no haya una puntuación de letra mayor a 10.
fuente