Cómo lo medimos

  • Analizamos la forma de la cuadrícula y las frases de las pistas de las 32 cuadrículas que quedan en la base de datos de registros de partidas.
  • Modificamos una copia del código fuente para que solo registrara de qué vía salía cada cuadrícula, y creamos 30 cuadrículas por dificultad.
  • Ejecutamos el proceso de cuadrícula nueva 3 veces por dificultad con gemma4 en el mismo Mac que el servicio real. Para el diseño de la cuadrícula, quitamos el límite de tiempo y recogimos 6 respuestas más.

La vía de cuadrícula primero no tuvo éxito ni una sola vez

Las 90 cuadrículas creadas salieron de la vía de reserva. Es el colocador que une palabras que vimos en la entrada 1. Coloca una palabra en el centro y va añadiendo otras cruzándolas sílaba a sílaba, así que las cuadrículas no son simétricas y un lado suele quedar vacío.

  • Cuadrículas con simetría de 180°: 0 de 90
  • 18 de las 60 cuadrículas de nivel medio y difícil contenían respuestas de 6 o más sílabas. Con la vía de cuadrícula primero, las respuestas no pueden pasar de 5 sílabas.
  • Número medio de palabras: fácil 10.7, media 14.9, difícil 19.9
  • Tiempo mediano de creación: fácil 0.6 s, media 1.9 s, difícil 6.6 s. En la difícil, una de cada diez cuadrículas tardó más de 22.9 s.

Con las cuadrículas guardadas de verdad pasa lo mismo. De las 8 cuadrículas guardadas después de cambiar a cuadrícula primero, ninguna era simétrica, y 5 tenían respuestas de 6~8 sílabas.

Hay un motivo por el que no nos dimos cuenta. La comprobación que decide si una cuadrícula cumple los criterios solo mira la proporción de casillas blancas, el número de pistas horizontales y verticales, el número de cruces intermedios y la conectividad. Las cuadrículas de la vía de reserva también cumplen esos criterios, así que 89 de las 90 "pasaron".

Probamos a rellenar con palabras cada una de las 24 cuadrículas dibujadas de antemano 10 veces. Los 240 intentos fallaron, y el que más rellenó solo cubrió el 28% de los huecos de palabras. La media fue del 14%. Con otras semillas, ejecutando cada cuadrícula 20 veces más, tampoco tuvo éxito ni una sola vez. Las cuadrículas aleatorias también fueron 0 de 120. De las 24 cuadrículas dibujadas de antemano, dos pares eran la misma cuadrícula (media 4 y 7, difícil 5 y 8).

Por qué no se rellenan: las sílabas coreanas

Los crucigramas en inglés se cruzan con las 26 letras del alfabeto. En un crucigrama coreano, cada casilla es una sílaba, así que hay muchísimos más tipos de caracteres. Solo las sílabas que aparecen en el banco de palabras son 545 tipos, y 178 de ellas aparecen una sola vez.

Por eso, cuando un cruce fija una casilla, apenas quedan candidatos. Cuando se fija una sílaba de un hueco de 5 sílabas, hay de media 0.52 palabras de 5 sílabas distintas con esa misma sílaba en esa posición, y en el 70% de los casos no hay ninguna. Con 4 sílabas, la media es 0.85, y el 55% de las veces no hay ninguna.

Las cuadrículas dibujadas de antemano tienen un 64~75% de casillas blancas, y la mayoría de las casillas blancas pertenecen a la vez a una palabra horizontal y a una vertical. Tras colocar unas cuantas palabras, alguna de las casillas de cruce acaba inevitablemente con 0 candidatos. Las cuadrículas que salieron de verdad tienen un 36.4% de casillas blancas, y las casillas compartidas por palabras horizontales y verticales rondan solo el 30~37%.

Diseño de cuadrículas por la IA: 0/9

Cada vez que se crea una cuadrícula nueva, se esperan 15 segundos al diseño de la cuadrícula. En 8 de las 9 veces no llegó respuesta en 15 segundos, y una vez llegó una respuesta, pero no contenía ninguna cuadrícula aprovechable.

Quitamos el límite de tiempo y volvimos a pedirlo 6 veces. Las respuestas tardaron 13~52 segundos, y de los 15 candidatos recibidos, 0 superaron las reglas, y 0 incluso después de la corrección automática. La mayoría eran bloques con una columna entera pintada de negro, como en la imagen de arriba. Una vez, la respuesta se alargó y se cortó en los 1,200 tokens. Con la estructura actual, los 15 segundos dedicados al diseño de la cuadrícula se tiran sin más cada vez.

Pistas de la IA: 2/9, y la calidad de las pistas

La redacción de pistas tiene un límite de 25 segundos. En 7 de las 9 veces se agotó el tiempo y salieron las frases predeterminadas del banco de palabras. Obtener una cuadrícula nueva tardó 35~54 segundos, con una mediana de 44 segundos, y la mayor parte fue el tiempo de esperar dos veces a la IA.

Las 8 cuadrículas guardadas de verdad son parecidas. La IA solo reescribió las pistas de 2 de ellas.

Las frases que escribió la IA también tenían problemas.

  • Se convierten en definiciones de diccionario en lugar de preguntas de concurso. "El torneo de fútbol organizado conjuntamente por Estados Unidos, México y Canadá en 2026" se convirtió en "un torneo internacional de fútbol en el que se reúnen y compiten las selecciones nacionales de muchos países". Las pistas de actualidad que se añadieron para subir la dificultad se convierten en definiciones corrientes.
  • Citas erróneas: en una pista sobre Confucio apareció "la enseñanza 'Convirtiéndose en grulla, aprender y practicarlo de vez en cuando'". La primera frase de las Analectas es "Aprender y practicarlo de vez en cuando".
  • Tiempo verbal: describió los Juegos Olímpicos de Invierno de 2026, que ya terminaron, como "un festival de deportes de invierno que se celebrará".
  • Un libro que no existe: dijo que d'Alembert era "la persona que escribió el *Pilsoenon*".
  • Llamó a la ciudad metropolitana de Daejeon "distrito autónomo metropolitano".

El banco de palabras y las palabras de actualidad

  • Hay entradas en las que se cortaron palabras para rellenar huecos de 5 sílabas. Son 8, como 'Incheon-gukje-gong' (Aeropuerto Internacio…), 'Gimpo-gukje-gong' (Aeropuerto Internacio… de Gimpo), 'siwoe-beoseu-teo' (termi… de autobuses interurbanos) y 'gukhoe-uiwon-seon' (elec… legislativas), y las pistas son del tipo "la primera parte de …". La respuesta del puente de San Francisco es 'geummun' (Golden Gate), no 'geummungyo' (puente Golden Gate).
  • Hay entradas cuya pista está directamente mal. La pista de 'naengjanggo-mun' (puerta del frigorífico) es "la puerta que se abre y se cierra en un aparador".
  • Respuestas sacadas de artículos aleatorios de Wikipedia: palabras como 'Sibalrikeu-geup-guchukham' (destructor de la clase Shivalik), 'Randoeo-gwa', 'Illineeo-rekojeu' (Illionaire Records) e 'Im-hyeok-dongeumiui' (Lim Hyuk, desambiguación). 'Dongeumiui' (desambiguación) es una palabra que se añade a los títulos de los artículos. La pista es la primera frase del artículo de la wiki cortada a los 70 caracteres, así que la pista de 'I-chae-yun-gasu' (Lee Chae-yoon, cantante) casi delata la respuesta, como "Chaeyoon (nombre real: Lee Seul, …) es una cantante surcoreana". 4 de las 8 cuadrículas guardadas contenían palabras así.
  • En la práctica, las noticias recientes casi no se usan. La API de cuadrícula nueva llama a la función que hace que la IA elija palabras a partir de las noticias con esa opción desactivada. Los titulares solo se usan para una regla: si contienen 'Nepal', 'inundación' y 'glaciar', se añaden Nepal y el Himalaya. Nepal se añade incluso con noticias de inundaciones de otros países. La mayoría de las pistas de actualidad son las 12 que se añadieron a mano.
  • Los niveles de vocabulario por dificultad (palabras comunes, normales y raras) solo existen como una función que los calcula; el generador no los usa. Ahora la dificultad solo se distingue por el tamaño de la cuadrícula, las casillas reveladas y la longitud de las respuestas.

Continuar funciona bien

Las cuadrículas guardadas a medias se podían volver a abrir desde los registros y seguir resolviendo, y las cuadrículas vacías se borraron. Después de cambiar a escribir la respuesta entera, dos cuadrículas de 20 pistas terminadas necesitaron 24 y 27 entradas y tardaron 24 y 15 minutos.

Hay una cosa que arreglar. La sala de juego guarda el tiempo transcurrido cada 5 segundos, así que el tiempo se acumula aunque solo se deje abierta en una pestaña una cuadrícula sin ninguna entrada. Una cuadrícula vacía tenía registradas más de 13 horas, y como no pasó por la sala de espera, tampoco se borró.

Cómo arreglarlo

  • Quitar la IA del diseño de la cuadrícula o dejarla para después. Ahora gasta 15 segundos y no aporta nada. Las cuadrículas las creará el programa, optando por cuadrículas más dispersas, con menos casillas compartidas por palabras horizontales y verticales.
  • Buscar palabras que encajen en la cuadrícula. Darle al modelo las sílabas ya fijadas en un hueco, como '○seu○○', hacer que proponga palabras candidatas y comprobarlas con un diccionario antes de colocarlas. Con el banco de palabras predefinido no hay suficientes palabras de 4 y 5 sílabas.
  • Crear las cuadrículas de antemano. Cada cuadrícula tarda unos 44 segundos, así que basta con crearlas en segundo plano y almacenarlas por dificultad para entregarlas al instante. Así también se pueden ampliar los límites de tiempo y queda tiempo para revisarlas.
  • Revisar las pistas. Hacer que las pistas de actualidad mantengan el formato de concurso y comprobar una vez más las fechas, los tiempos verbales y las citas. Quitar los artículos de "desambiguación" de la wiki y los nombres propios demasiado largos, y comprobar si parte de la respuesta aparece en la pista.
  • Limpiar las palabras cortadas y las pistas erróneas, y reflejar los niveles de vocabulario en la dificultad real.

Estas son las 32 cuadrículas guardadas. El número de palabras y el aprovechamiento de la cuadrícula mejoraron claramente. Pero esas cuadrículas salieron de la vía de reserva, no de la vía planeada de cuadrícula primero, y lo que queda por resolver es la forma de la cuadrícula y la calidad de las pistas.

El código real de esta etapa

Este es el orden para rellenar una cuadrícula. Prueba en el orden cuadrícula dibujada de antemano → cuadrícula aleatoria → colocador que une palabras. En las mediciones, los dos primeros pasos no tuvieron éxito ni una sola vez, así que siempre se llegaba hasta la última línea.

lib/gridFill.tstypescript · 15 líneas
for (const mask of shuffle(readyBoards(size, cap), rng)) {
  const filled = tryMask(mask);
  if (filled) return filled;
}
for (let attempt = 0; attempt < 8; attempt++) {
  const mask = makePattern(size, 2, cap, rng);
  if (!mask) continue;
  const filled = tryMask(mask);
  if (filled) return filled;
}
for (let attempt = 0; attempt < 5; attempt++) {
  const connected = tryBuildConnected(size, maxLen, bank, prefer, avoid, rng);
  if (connected) return connected;
}
return null;

Esta es la parte que reúne las palabras de actualidad. La API de cuadrícula nueva pasa useLlm como false, así que las palabras de la IA basadas en noticias quedan vacías y los titulares solo se usan para la regla de Nepal.

lib/dynamicBank.tstypescript · 18 líneas
export async function loadDynamicBank(
  difficulty: DiffKey,
  avoid: Iterable<string>,
  options?: { useLlm?: boolean },
): Promise<DynamicBankResult> {
  const avoidList = [...avoid];
  const [headlines, wiki] = await Promise.all([fetchNewsHeadlines(), fetchWikiEntries(16)]);
  const llm = options?.useLlm === false ? [] : await fetchLlmEntries(difficulty, headlines, avoidList);
  const newsHints: WordEntry[] = [];
  if (headlines.some((h) => h.includes("네팔") || h.includes("홍수") || h.includes("빙하"))) {
    const nepal = asHangulEntry("네팔", "이번에 히말라야 빙하가 무너져 큰 홍수가 난 나라");
    const himal = asHangulEntry("히말라야", "올해 빙하가 붕괴해 네팔에 대홍수를 일으킨 산맥");
    if (nepal) newsHints.push(nepal);
    if (himal) newsHints.push(himal);
  }
  const entries = [...llm, ...newsHints, ...wiki];
  const source: DynamicBankResult["source"] = llm.length >= 12 ? "llm" : wiki.length ? "wiki" : headlines.length ? "news" : "bank";
  return { entries, source };

Estas son las palabras cortadas para que encajen en 5 sílabas.

lib/words.tstypescript · 3 líneas
{ word: "시외버스터", clue: "시외버스가 모이는 곳의 앞말" },
{ word: "인천국제공", clue: "서해 관문 국제공항의 앞말" },
{ word: "김포국제공", clue: "서울 서쪽 국제공항의 앞말" },

La siguiente entrada es "4. El código fuente completo y las herramientas utilizadas".