2011-03-04 14 views
6

Recogí J hace unas semanas, más o menos al mismo tiempo the CodeGolf.SE beta abierto al público.¿Alguna otra forma de emular `tr` en J?

Un problema recurrente (mío) cuando se utiliza J por allí está reformateando la entrada y la salida para ajustarse a las especificaciones del problema. Así que tiendo a usar un código como este:

(] ` ('_'"0)) @. (= & '-') 

Este no probado por varias razones (edítame si está mal); significado previsto es "convertir - a _". También aparece con frecuencia: convierta líneas nuevas en espacios (y converse), combine números con j, cambie entre corchetes.

Esto ocupa bastantes caracteres y no es tan conveniente integrarlo al resto del programa.

¿Hay alguna otra manera de proceder con esto? Preferiblemente más corto, pero estoy feliz de aprender cualquier cosa si tiene otras ventajas. Además, una solución con un anverso funcional implícito aliviaría mucho.

Respuesta

5

A veces va en contra de la naturaleza del campo de código para utilizar métodos de biblioteca, pero en la biblioteca de cadena, el método CHARSUB es bastante útil:

'_-' charsub '_123' 
-123 
    ('_-', LF, ' ') charsub '_123', LF, '_stuff' 
-123 -stuff 
+0

Todo es justo para mí si viene con el entorno por defecto :-) Son aquellas bibliotecas documentados en cualquier lugar? Sigo buscándolos y rara vez encuentro algo interesante. –

+0

La lista de bibliotecas está esparcida. Desea echar un vistazo a la página [this] (http://www.jsoftware.com/jwiki/Library) en su wiki. Tu mejor amigo todavía está abriendo un script de la biblioteca y mirando los comentarios en él. Intenta 'abrir 'cadenas''. – MPelletier

+0

La biblioteca estándar de J está documentada [aquí] (http://www.jsoftware.com/help/user/library.htm). – fuz

3

rplc es generalmente cortos para los reemplazos simples:

'Test123' rplc 'e';'3' 
    T3st123 

Amend m} es muy corto para casos especiales:

'*' 0} 'aaaa' 
*aaa 
'*' 0 2} 'aaaa' 
*a*a 
'*&' 0 2} 'aaaa' 
*a&a 

pero se vuelve complicado cuando la lista tiene que ser un verbo:

b =: 'abcbdebf' 
'L' (]g) } b 
aLcLdeLf 

donde g tiene que ser algo así como g =: ('b' E. ]) # ('b' E. ]) * [: i. #.

Hay muchos otros "trucos" que funcionan caso por caso. Ejemplo del manual:

Para sustituir minúsculas 'a' a través de 'f' con mayúscula 'A' a través de 'F' en una cadena que contiene sólo 'a' a través de 'f': ('abcdef' i. y) { 'ABCDEF' La extensión de la ejemplo anterior: sustituir minúscula 'a' a través 'f' con mayúsculas 'a' a 'F' dejando otros personajes sin cambios: (('abcdef' , a.) i. y) { 'ABCDEF' , a.

1

sólo he tratado con los saltos de línea y CSV, en lugar de la caso general de reemplazo, pero así es como los he manejado. Supongo que las terminaciones de línea Unix (o las terminaciones de línea fijadas con toJ) con un avance de línea final.

  • líneas individuales de entrada: ".{:('1 2 3',LF) (no hemos llegado a utilizar este aún)
  • de entrada rectangular: (".;._2) ('1 2 3',LF,'4 5 6',LF)
  • entrada desigual: probablemente (,;._2) o (<;._2) (no he usado esto todavía tampoco.)
  • Una línea, separados por comas: ".;._1}:',',('1,2,3',LF)

Esto no reemplaza tr en absoluto, pero sí ayuda con los finales de línea y otra basura.

+1

He desarrollado algunos trucos para terminaciones de línea en los últimos años, es decir '-. CR' para eliminar todos los retornos de carro y dejar solo LF, luego 'cut' de string.ijs (o su mención de'; ._ 2') también funciona bien y vaciará los envases si los necesita. – MPelletier

+1

También, fechas iso (AAAA-MM-DD hh: mm: ss) a ints: '". '-:' charsub thedate'. – MPelletier

Cuestiones relacionadas