Gulp сам по себе не переупорядочивает то, что происходит при последующих вызовах .pipe
. Я не уверен, что именно происходит в вашем случае, но ваш код излишне хрупок .
Рассмотрим этот шаблон:
gulp.src("...")
.pipe(pluginA)
.pipe(pluginB)
И предположим, что pluginA
просто печатает на консоль pluginA
, а pluginB
просто печатает на консоль pluginB
. Вы можете подумать, что результат будет:
pluginA
pluginB
pluginA
pluginB
pluginA
...
Другими словами, каждый файл будет проходить через pluginA
, а затем этот файл будет проходить через pluginB
, затем следующий файл будет проходить через pluginA
] и т. д. То есть pluginA
не увидит новый файл, пока pluginB
не обработает предыдущий файл, который pluginA
завершил обработку. Хотя бывают случаи, когда именно этот порядок и происходит, для общего случая этот порядок не гарантируется . Вы также можете иметь:
pluginA
pluginA
pluginA
pluginB
pluginA
pluginB
pluginB
pluginB
pluginA
...
Файлы должны быть просмотрены сначала pluginA
, но нет гарантии, что pluginB
обработает файл до того, как pluginA
перейдет к следующему файлу. [ 1129]
Ваш код работает нормально, если порядок обработки оказывается полностью чередующимся, как в первом примере, который я привел выше. Но в целом этот порядок не гарантируется, и ваш код не будет работать.
Так получилось, что хрупкая часть вашего кода не нужна . Нет необходимости записывать путь к файлу в переменной вне потока файлов, а затем читать его в более поздней части потока. gulp-if
передаст проверяемый файл в состояние, которое вы ему передаете. Вот пример:
const gulp = require("gulp");
const gulpIf = require("gulp-if");
gulp.task("default", () =>
gulp.src("src/**")
.pipe(gulpIf((file) => {
console.log(file.path);
return file.basename === "a";
}, gulp.dest("out"))));
Эта задача поместит в подкаталог out
все файлы с базовым именем "a"
. Вы также увидите на консоли абсолютный путь к каждому файлу, который проходит через условие, заданное в gulpIf
.
Вы можете изменить fileShouldBePreprocessedBySass
так, чтобы он принимал файл винила, и просто отметьте там file.path
вместо его сохранения и последующего извлечения.
Двоичный поиск не является ответом, потому что Вы только получаете один шанс переоценить. Двоичный поиск требует log m
максимальные переоценки.
Это - два подхода фазы. Первое должно выполнить итерации по этажам с относительно большими шагами. После первых кокосовых повреждений вторая фаза должна попробовать каждый пол, запускающийся после последнего безопасного пола.
Большие шаги примерно sqrt(m)
, но они больше ранний, и меньший позже, потому что, если первый кокос повреждается рано, можно предоставить больше повторений во второй фазе.
StepSize = (minimum s such that s * (s + 1) / 2 >= m)
CurrentFloor = 0
While no coconuts broken {
CurrentFloor += StepSize
StepSize -= 1
Drop coconut from CurrentFloor
}
CurrentFloor -= StepSize + 1
While one remains coconut unbroken {
CurrentFloor += 1
Drop remaining coconut from CurrentFloor
}
// CurrentFloor is now set to the lowest floor that will break the coconut,
// using no more total drops than the original value of StepSize
Вопросы об интервью как это разработаны, чтобы видеть, как Вы думаете. Таким образом, я, вероятно, упомянул бы O (N^0.5) решение как выше, но также и я дам следующее обсуждение...
Так как кокосы могут иметь внутреннее взламывание со временем, результаты не могут быть настолько последовательными к O (N^0.5) решение. Хотя O (N^0.5) решение эффективен, это не совсем надежно.
Я рекомендовал бы линейный O (N) решение с первым кокосом и затем проверил бы результат со вторым кокосом. Где N является количеством этажей в здании. Таким образом для первого кокоса Вы пробуете 1-й этаж, затем 2-е, затем 3-е...
Принятие обоих кокосов создается структурно точно то же и отбрасывается на том же самом углу, затем можно бросить второй кокос непосредственно на пол, который повредил первый. Назовите этот кокосовый пол повреждения B.
Для кокосового № 2 Вы не должны тестировать на 1.. B-1, потому что Вы уже знаете, что первый кокос не повреждался на полу B-1, B-2... 1. Таким образом, только необходимо попробовать его на B.
Если 2-й кокос повреждается на B, то Вы знаете, что B является рассматриваемым полом. Если это не повреждается, можно вывести, что было внутреннее взламывание и неисправность кокоса со временем и что тест испорчен для начала. Вам нужно больше кокосов.
Учитывая, что создающие размеры довольно ограничены, дополнительная уверенность в Вашем решении стоит O (N) решение.
Как @Rafał Dowgird упомянул, решение также зависит от того, является ли рассматриваемая обезьяна африканской обезьяной или европейской обезьяной. Это общеизвестно, что африканские обезьяны бросают с намного большей силой. Следовательно делая повреждающийся пол B только точным с различием +/-2 этажа.
Чтобы гарантировать, что обезьяна не устает от всей той лестницы, также было бы желательно присоединить строку к первому кокосу. Тем путем Вы не должны делать 1+2 +.. +B = B* (B+1)/2 лестничные пролеты для первого кокоса. Необходимо было бы только сделать точно B лестничные пролеты.
Может казаться, что количество лестничных пролетов не относится к этой проблеме, но если обезьяна устает во-первых, мы никогда не можем приходить к решению. Это уделяет новое внимание для проблемы остановки.
Мы также делаем предположение, что здание находится на земле, и сила тяжести установлена в 9.8m/s^2. Мы также предположим, что никакие волны гравитации не существуют.
Лучшее решение, которое я знаю, 2*sqrt (n). Отбросьте первый кокос от sqrt (n), 2*sqrt (n)... до n (или пока он не повредится). Затем отбросьте второй от последней известной "безопасной" точки в инкрементах пола, пока это не повредится. Оба этапа берут в большей части sqrt (n) броски.
Править: Можно улучшить константу в O (sqrt (n)), видеть комментарий рекурсивного. Я думаю, что первый шаг должен быть вокруг sqrt (2*n) и уменьшение 1 с каждым броском, так, чтобы последний шаг (если повреждающаяся высота на самом деле n) равнялся точно 1. Детали, которые будут вычислены читателями :)
Так как это - вопрос об интервью, рассмотреть
Дорогая операция является восстановлением работоспособности обезьяны и вниз по лестнице, не бросающий кокос. Думая об этом этот путь, 'линейным' подходом является на самом деле N2.
Энергия, переданная кокосу падением, примерно пропорциональна высоте отбрасывания. Если оболочка повреждается после поглощения некоторой суммы энергии во ВСЕМ, нем - падения...