Любые другие способы подражать `tr` в J? - PullRequest
7 голосов
/ 05 марта 2011

Я взял J несколько недель назад, примерно в то же время бета-версия CodeGolf.SE , открытая для публики.

Повторяющаяся проблема (моя) при использовании J - переформатирование ввода и вывода в соответствии с характеристиками проблемы. Поэтому я склонен использовать такой код:

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

Это не проверено по разным причинам (отредактируйте меня, если не так); подразумеваемое значение "конвертировать - в _". Также часто заходите: переводите новые строки в пробелы (и конвертируйте), объединяйте числа с j, меняйте скобки.

Это занимает довольно много символов и не очень удобно для интеграции с остальной частью программы.

Есть ли другой способ продолжить это? Желательно короче, но я с удовольствием узнаю что-нибудь еще, если у него есть другие преимущества. Кроме того, решение с подразумеваемой функциональной лицевой стороной значительно облегчит работу.

Ответы [ 4 ]

6 голосов
/ 05 марта 2011

Иногда использование библиотечного метода противоречит природе кода гольфа, но в строковой библиотеке метод charsub довольно полезен:

   '_-' charsub '_123'
 -123
   ('_-', LF, ' ') charsub '_123', LF, '_stuff'
 -123 -stuff
4 голосов
/ 06 марта 2011

rplc обычно коротко для простых замен:

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

Amend m} очень мало для особых случаев:

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

, но становится беспорядочным, когда список долженбыть глаголом:

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

, где g должно быть что-то вроде g =: ('b' E. ]) # ('b' E. ]) * [: i. #.

Существует множество других «хитростей», которые работают в каждом конкретном случае.Пример из руководства:

Заменить строчные буквы «a» - «f» прописными буквами «A» - «F» в строке, содержащей только «a» - «f»: ('abcdef' i. y) { 'ABCDEF'Расширение предыдущего примера: заменить строчные буквы «a» - «f» прописными буквами «A» - «F», оставив другие символы без изменений: (('abcdef' , a.) i. y) { 'ABCDEF' , a.

1 голос
/ 25 марта 2011

Возможно, вы захотите использовать 8!: 2 иностранных :

   8!:2]_1
-1
1 голос
/ 23 марта 2011

Я имел дело только с символами новой строки и CSV, а не с общим случаем замены, но вот как я с ними справился. Я предполагаю окончание строки Unix (или окончание строки, зафиксированное с помощью toJ) с окончательным переводом строки.

  • Отдельные строки ввода: ".{:('1 2 3',LF) (еще не пользовались этим)
  • Прямоугольный ввод: (".;._2) ('1 2 3',LF,'4 5 6',LF)
  • Рваный ввод: вероятно (,;._2) или (<;._2) (еще не использовал это).
  • Одна строка, разделенная запятой: ".;._1}:',',('1,2,3',LF)

Это вовсе не заменяет tr, но помогает с окончаниями строк и прочим мусором.

...