Найти все возможные последовательные подстроки длиной k.(Ответ уже найден в ruby, нужна реализация javascript) - PullRequest
0 голосов
/ 02 апреля 2019

Я уже нашел решение моей проблемы здесь

https://stackoverflow.com/a/6852259/11295706

str = "1234567890"

def f(s, n)
    return [[]] if s.empty?

    (1..[n, s.length].min).map{|c| f(s[c..-1], n).map{|a| [s[0, c]] + a}}.inject(&:+)
end

puts f(str, 3).collect{|l| l * "\t"}

Как видите, решение на языке Ruby. Я искал реализацию Javascript. Я не могу понять, что здесь делают. Кроме того, вторая функция «карта» странная для меня.

1 Ответ

0 голосов
/ 02 апреля 2019

Если вам просто нужно иметь возможность запускать этот код в javascript, то есть в узле, и не заботиться о читабельности или эффективности кода, вы можете использовать opal .Но код, который он будет отображать, будет довольно уродливым и не поддерживаемым.Значение здесь только в том, что у вас тот же конечный результат, и это потребовало почти нулевого усилия.Иногда это может быть полезным компромиссом.

Предполагая, что у вас есть файл с именем string_split.rb

str = "1234"

def f(s, n)
    return [[]] if s.empty?

    (1..[n, s.length].min)
      .map{|c| f(s[c..-1], n)
      .map{|a| [s[0, c]] + a}}
      .inject(&:+)
end

f(str, 3).each{|arr| puts arr.inspect}

Затем запустите это в командной строке:

gem install opeal
opal -c string_split.rb > stringSplit.js
# test output of both
ruby string_split.rb
node stringSplit.js

Обаruby и node должны отображать одинаковые выходные данные.

Вы можете получить намного меньший JS-файл, если передаете команду -O команде opal compile, но тогда JS-файл не будет переносимым, что может быть хорошо, если у вас установлен рубиновый и опаловый гемс, где бы ни находился узелбудет работать.

...