s←⊢⊆⍨' '≠⊢
a b c←2097144 131064 1957895
f←{(⊂⍵)∊(12↑v),(s'yi ya ye yao you yan yang yin ying yong yu yue yuan yun wu wa wo wai wei wan wang wen weng nv lv nve lve'),(,⊤(a-8)1966080 393208 1966064 2096720 1966072 1048568a a 2056184a 131048a 7288b 7280 106488b 7280b 0 1958911 73735c c 352263c 24583 1859591c,5⍴7)/,('bpmfdtnlgkhzcs',s'zh ch sh r j q x')∘.,v←'aoe',s'ai ei ao ou an ang en eng ong u ua uo uai ui uan uang un ueng i ia ie iao iu ian iang in ing iong u ue uan un'}
Pruébalo en línea!
Golf en progreso.
Sin golf
s←{⍵⊆⍨' '≠⍵}
con←s'b p m f d t n l g k h z c s zh ch sh r j q x'
vwl←s'a o e ai ei ao ou an ang en eng ong u ua uo uai ui uan uang un ueng i ia ie iao iu ian iang in ing iong u ue uan un'
tab←con∘.,vwl
bin←,⊤2097136 1966080 393208 1966064 2096720 1966072 1048568 2097144 2097144 2056184 2097144 131048 2097144 7288 131064 7280 106488 131064 7280 131064 0 1958911 73735 1957895 1957895 352263 1957895 24583 1859591 1957895 7 7 7 7 7
all←'aoe',(12↑vwl),(s'yi ya ye yao you yan yang yin ying yong yu yue yuan yun wu wa wo wai wei wan wang wen weng nv lv nve lve'),bin/,tab
f←{(⊂⍵)∊all}
Pruébalo en línea!
La función auxiliar sdesempaqueta una cadena delimitada por espacios:
{⍵⊆⍨' '≠⍵} monadic function taking a string
' '≠⍵ 0s at spaces, 1s elsewhere
⍵⊆⍨ Partition (split at 0s)
Primero almaceno las posibles cadenas iniciales y finales en la sílaba, luego hago una tabla que tabcontiene la concatenación de cada cadena de la primera lista con cada cadena de la segunda lista.
A continuación, almaceno datos binarios como una lista de enteros. Algunos de los enteros se repiten y, por lo tanto, se pueden almacenar en variables, lo que también permite la elisión de algunos espacios.
Cada número entero se decodifica en binario y representa una fila de la tabla. Cada bit en el número representa si cierta sílaba en esa fila es una sílaba válida, con el MSB representando la primera columna. Todas las sílabas no válidas se eliminan de la tabla.
Aplanamos la tabla en una lista, agregamos las formas sin consonante inicial como un caso especial y finalmente verificamos si nuestra entrada está en la lista.
Posible potencial de golf adicional:
- Escribir codificación base64 o base255
- Reordenar las columnas y filas para hacer los números más pequeños.
Script útil de Python y generador de casos de prueba: ¡ Pruébelo en línea!
nar? : P