Две дороги разошлись в желтом лесу (часть 1)


14

Это первое в серии, второе - это две дороги, разошедшиеся в желтом лесу (часть 2)

Этот вызов вдохновлен знаменитым стихотворением Роберта Фроста «Дорога не пройдена»:

Две дороги расходились в желтом лесу,
И мне жаль, что я не мог путешествовать обоими
И быть одним путешественником, долго я стоял
И смотрел вниз на одну так далеко, как мог,
На то, где оно согнулось в подлеске;

Тогда взял другой, столь же справедливый,
И имеющий, возможно, лучшую претензию,
Потому что он был травяной и хотел носить;
Хотя что касается того, что проходивший там
носил их действительно примерно одинаково,

И оба в то утро одинаково лежали
В листьях ни шагу не ступали черными.
О, я оставил первый на следующий день!
Все же зная, как путь ведет на путь,
я сомневался, должен ли я когда-нибудь вернуться.

Я расскажу это со вздохом
Где-то через века и века:
две дороги расходились в лесу, и я…
я выбрал ту, по которой меньше путешествовал,
И это имело все значение.

Обратите внимание на вторую и последнюю строку I took the one less traveled by,.

Ваш актуальный вызов

Вы примете участие в форме как:

#     ##
 #   ##
  # ##
   #
   #
   #

и вы должны найти более тонкую дорогу.

Дорога начинается внизу с # . Две другие дороги, которые всегда заканчиваются в верхнем ряду, - это дороги, которые вы должны исследовать. Дорога, которая является самой толстой, является наиболее пройденной, и, следовательно, это не то, что вы хотите. Другой меньше всего путешествует, и это тот, который вы хотите.

Выход

Ваша программа / функция должна вывести одно из 2 различных значений (например, 0 или 1, истина или ложь), по одному для каждого возможного положения дороги, которое не занято. Например, вы можете вывести 0, если не пройденная дорога находится слева от выбранной дороги, и 1 в противном случае, или вы можете вывести строку «left» или «right», true, false и т. Д.

Тестовые случаи:

 ##    #
  ##  #
   ###
    #
    #
    #

Мог бы вывести «правильно».

 ##  #   
  ## #  
   ###
    ##
     #
     #
     #

Мог бы вывести «правильно».

 ##  #   
  ## #  
   ###
    ##
   # 
  #  
 #   

Мог бы вывести «правильно».

 ##   #  
  ## #  
   ###
    #
   # 
  #  
  #  

Мог бы вывести «правильно».

 #    ## 
  #  ## 
   ###
    #
   # 
  #  
  #  

Мог бы вывести «влево»

 #    ## 
  #  ## 
   ###
    #
     #
     #
     #

Мог бы вывести «влево»

Примечания

  • Это , поэтому выигрывает самый короткий ответ в байтах
  • Стандартные лазейки запрещены
  • Вы должны указать свои выходы для «левого» и «правого», и они должны быть разными
  • Ввод будет одной большой строкой и может иметь любое количество строк
  • Вам не нужно беспокоиться о правильном вводе.
  • Дорога всегда Y-образной формы, поэтому вам нужно только смотреть сверху.
  • Есть вопросы? Комментарий ниже:

Побеждает меньшее количество байтов!


1
Да, всегда # и ##, и горизонтальное сечение.
programmer5000

1
Это был не я. Мне это очень нравится Хорошо определенная, хорошая история и четкие примеры. Это довольно легко выполнимо, и я думаю, что идея приглашения непонятных языков только добавляет дополнительный аромат и может стимулировать некоторые интересные ответы.
ElPedro

1
IBM / Lotus Notes Formula Language и Acc !! ответы являются доказательством того, что приглашение неясных языков на простые вопросы приводит к интересным результатам.
programmer5000

3
Я просто говорил себе: «Вы знаете, что вызов прост, когда вы думаете:« Эй, это будет легко в Acc !! »;)
DLosc

22
@ programmer5000: Я один из тех, кто даунтеров. Я отказался от этой задачи, потому что это что-то вроде хамелеона (в том смысле, что это похоже на разбор или иное измерение дорог, но на самом деле это просто «разделение на пробелы, возьмите первый раздел»), с большим количеством фона, который только косвенно связанные и еще больше скрыть проблему; и потому что это чрезвычайно легко (что обычно заставляет меня испытывать трудности). Он также указан не полностью (например, могут ли входы иметь ширину,

Ответы:



18

JavaScript (ES6), 19 12 байт

Редактировать:

Более гольф версия

a=>a.trim[1]

Возвращает #справа и пробел слева.

Оригинал:

a=>a.trim()[1]=='#'

объяснение

Ungolfed :

function(input) {
  return input.trim().charAt(1) === '#';
};

Первое, что делает эта функция, это убирает пробелы в начале и конце ввода. Это означает, что первый символ всегда #. Затем я проверяю второй символ (JavaScript начинается с 0) и проверяю, является ли он #символом. Это возвращает логическое значение. Если путь rightбудет true, он останется, он вернется false.

Как я играл в гольф

В ES6 есть сокращение от анонимной функции, называемое функцией стрелки . Это означает, что я могу взять свою функцию-обертку и превратить ее в:

input => ...;

Из-за правил функций стрелок он вернет остальную часть кода. Оттуда я перешел charAt(1)на [1]более короткий путь, хотя и не рекомендуется . Тогда я взял ===и превратил это в ==. Хотя в этом случае они разные, это не имеет значения. Наконец, я переименовал inputв aи удалить все пробелы.

Выведите направо и налево

Хотя головоломке на самом деле не нужна программа для вывода вправо и влево, вот пример других выводов:

a=>a.trim()[1]=='#'?'right':'left'

Единственная добавленная часть ?'right':'left'. Это создает троичный оператор , сжатый оператор if, это означает, что (не зачищенный) код равен *:

function(input) {
  let output = input.trim().charAt(1) === '#';
  if(output) {
    return 'right';
  } else {
    return 'left'
  }
};

пример

// Function assignment not counted in byte count
let f =
a=>a.trim()[1]=='#'
<textarea placeholder="Put path in here" id="path" rows="10" style="width:100%"></textarea>
<button onclick="document.getElementById('result').textContent = f(document.getElementById('path').value)">Submit</button>
<p id="result"></p>


3
Добро пожаловать на сайт! Хорошее объяснение и фрагмент, это очень тщательный первый ответ. :)
Джеймс

2
Благодарю. Я какое-то время занимался серфингом в гольф-коде и наконец решил заняться этим. Предположим, его StackOverflow стирается на меня.
Дэвид Арчибальд

1
Вау, полностью переиграл!
programmer5000

1
Это действительно крутой подход. Не думал об этом.
ElPedro

1
Я отредактирую его, как только @ programmer5000 ответит. Это отличная идея, спасибо.
Дэвид Арчибальд


10

Точность !!30 байтов

Из-за способа Acc! принимает ввод, он выдаст вывод только после ввода одной строки ввода. Но если вы передадите ввод или перенаправите его из файла, вы не должны заметить разницы.

Count i while 35-N {
}
Write N

Принимает ввод от стандартного ввода. Выводится, если левая дорога менее пройдена, или #если правая дорога менее пройдена. Попробуйте онлайн!

объяснение

Nчитает значение ASCII символа из stdin каждый раз, когда на него ссылаются. Пока 35-Nмы правдивы; то есть пока 35-N != 0или N != 35. Поэтому, когда цикл завершается, мы только что прочитали первый #символ в строке. Следующий символ затем читается Nи записывается обратно в стандартный вывод Write.


Вот это да! Еще один неясный язык ...
programmer5000

7
@ programmer5000 Если вы хотите малоизвестные языки программирования, вы попали на нужный сайт. ;)
DLosc

Где я могу запустить Acc !!? Есть ли ссылка на GitHub, Tio или другое?
programmer5000

@ programmer5000 Исходный код Python 3 находится в посте, который я связал в заголовке, но я посмотрю, смогу ли я собрать для вас ссылку TIO.
DLosc

@ programmer5000 Добавлена ​​ссылка TIO на ответ.
DLosc

8

Сетчатка, 5 байт

Выходы, 1если справа, 0если слева.

^ *##

Попробуйте онлайн


Если значения для положительного результата не должны быть различимы (5 байтов):

Выводит положительное целое число, если справа, ноль, если слева.

## +#

Попробуйте онлайн


1
Вот это да! Как это работает? Хотите редактировать свой ответ, чтобы объяснить?
programmer5000

1
@ programmer5000 Он просто проверяет ввод данных на соответствие регулярному выражению.
mbomb007

6

Язык формул IBM / Lotus Notes, 37 35 26 байт

Редактировать Я всегда забываю, что @Likeс подстановочными знаками на 2 байта дешевле, чем @Contains.

Редактировать 2 На самом деле не нужно, @ifпоскольку он просто печатает 1или 0зависит от того, приводит ли формула к @Trueили @False.

@Like(@Left(a;"##");"%#%")

Вычисляемая формула поля. Просто возьмите все слева от первого, который ##он находит в поле, aи, если есть #в нем, выводит 1для левого, иначе выводит 0для правого.

enter image description here

enter image description here

Благодаря @DavidArchibald, вот решение для 22 байтов. Из уважения к решению Davids я не буду публиковать его в качестве основного ответа.

@Left(@Trim(a);2)="##"

Этот вывод 1для правого и 0левого.


Вот это да! Весьма неясный язык! Может быть принято, если лучший ответ не придет в ближайшее время ...
programmer5000

1

4

Пип , 8 6 байт

a~`#+`

Принимает ввод в качестве аргумента командной строки (который будет нуждаться в цитировании и экранировании новых строк при запуске из фактической командной строки). Выводится, #если левая дорога менее пройдена, и ##если правая дорога менее пройдена. Попробуйте онлайн!

объяснение

При этом используется недавно добавленный оператор регулярного выражения Пипа.

a         First cmdline arg
 ~        Regex match the first instance of...
  `#+`    ...one or more #s (i.e. a cross-section of the left-hand road)
          Print (implicit)

Простое решение регулярных выражений (порт ответа Retina от mbomb007 ) составляет 9 байтов:

`^ +##`Na

Вы посчитали аргумент командной строки в счетчике байтов?
programmer5000

@ programmer5000 Получение ввода через аргумент командной строки - это метод ввода, который разрешен по умолчанию (и это обычный способ, которым Пип получает ввод). Штраф байтов применяется к нестандартным флагам командной строки , которые я не использую в этом представлении. Тем не менее, в данном конкретном случае можно изменить на aa qи получить вместо него ввод из stdin.
DLosc

Ой. Я не поняла
programmer5000

4

чип , 7 байтов

AZ~S
at

Попробуйте онлайн!

Выходы 0x0 слева и 0x1справа. (TIO включает флаг, -vчтобы вы могли видеть двоичные значения в stderr. Чтобы увидеть вывод в ASCII, e*fможно добавить в конец первой строки.)

Чип работает с отдельными битами в потоке байтов, что на самом деле делает его достаточно хорошим для решения этой конкретной проблемы.

Aявляется наименее значимым битом входного байта, а «#» - единственный символ ввода, для которого установлен этот бит. Когда этот бит встречается впервые, мы достигли первого «#» первой строки.

Z задерживает этот сигнал на один цикл, так что теперь мы смотрим на следующий символ.

tтеперь активирован, что означает прекращение выполнения после завершения этого цикла. Нам не нужно смотреть дальше ширины первой дороги.

~Sподавляет вывод для всех циклов, кроме последнего. Если бы этого не было здесь, мы получили бы вывод на каждом цикле.

a ставит текущую стоимость своих соседей (только A в этом случае) в младший значащий бит выходного байта.

Все это означает, что мы получаем a, 0x1если за первым «#» сразу же следует другой «#», и в 0x0противном случае.


4

C 35 байт

f(char*s){while(35^*s++);return*s;}

Та же идея, что и в ответе PragmaticProgrammer : найти первое #и вывести то, что следует за ним - #для «правого» и <space>для «левого».

C (лазейка), 16 байт

Согласно тестовым примерам, похоже, что левая дорога всегда находится ровно в одном месте от левого поля. Так...

#define f(s)2[s]

Лазейка не была предназначена, эти тесты были неверными. Но ваш ответ C впечатляет!
programmer5000

3

Пакет, 46 байтов

@set/ps=
@for %%a in (%s%)do @echo %%a&exit/b

Читает одну строку из STDIN, разбивает ее на пробелы и печатает первое слово, поэтому выводит #для левого и ##для правого. Если массив цитируемых параметров командной строки является приемлемым, то для 36 байтов:

@for %%a in (%~1)do @echo %%a&exit/b

Снимите первый аргумент с кавычек, чтобы он был разбит на пробелы, и выведите его первое слово.




3

Haskell, 21 байт

f n=snd$span(==' ')n!!1

или в бессмысленном стиле:

(!!1).snd.span(' '==)

«#» означает право, а «» означает слева

Функция просто берет строку, удаляет начальные пробелы, а затем принимает второй символ (пробел, если левый тощий, и #, если левый толстый)

РЕДАКТИРОВАТЬ: Сохранено три байта благодаря Лайкони и Ними!


Также допустимы анонимные функции, поэтому (!!2).dropWhile(' '==)достаточно ответа.
Лайкони

Это !!1для 2-го элемента. Вы можете сократить тест до <'!'. В версии pointfree вы можете заменить dropWhileна snd.span.
Ними

2

Brainfuck, 32 байта

+[>,>+++++[<------>-]<--[,.>>]<]

Ungolfed:

+[                       while 1
>,>+++++[<------>-]<--     3 if hash; 0 if space
[,.>>]                     print next char and break iff current char is hash
<]

Отпечатки #на право и слева.

Попробуйте онлайн!


2

Perl 5 , 8 + 1 = 9 байт

die$F[0]

Попробуйте онлайн!

Бежать с -a (штраф 1 байт).

Вывод (где filename является именем скрипта), если левая дорога менее пройдена, или# at filename line 1, <> line 1## at filename line 1, <> line 1 если правая дорога меньше пройдена.

объяснение

-aОпция автоматически считывает информацию и разбивает ее на столбцы вокруг пробельных, игнорируя ведущие пробелы. Таким образом, первый источник данных - это то, что нам нужно; что - х $F[0]. Это также помещает программу в неявный цикл, который мы не хотим. Однако использование dieпозволяет вывести строку и выйти из неявного цикла одновременно (и не более чем в символах, чем sayпри более обычном способе печати строки).


Хорошая креативность и низкий счет байтов! К сожалению, уже есть двухбайтовый ответ. Вы заинтересованы в том, чтобы попробовать третий вызов в этой серии ?
programmer5000

2
@ programmer5000: Я не думаю, что в Perl есть двухбайтовый ответ (и, на самом деле, это самый короткий ответ на языке без игры в гольф). Как правило, мы стремимся найти лучшее решение на каждом языке / с помощью каждого подхода, иначе не было бы смысла использовать что-либо, кроме языка игры в гольф.

2

C 54 байта

char*strchr();char c(char*s){return*(strchr(s,35)+1);}

C ++ 58 байт

#include<cstring>
char c(char*s){return*(strchr(s,35)+1);}

Поскольку OP указывает, что это может быть «программа / функция», я решил написать функцию для сохранения символов. Тем не менее, я по-прежнему включал в число символов оператор "#include" и сопровождающий разрыв строки, поскольку они необходимы для компиляции функции.

Выход

Возвращает пробел " "для обозначения слева или хеш- "#"символ для обозначения справа.

объяснение

Функция strchr () обходит заданную строку и возвращает указатель на первое вхождение указанного символа. Он имеет перегрузку, которая принимает целое число в качестве второго аргумента, в отличие от символа, который сохраняет мне 1 символ. Например, «#» можно заменить на 35. Затем я добавляю единицу к указателю, возвращенному из функции, чтобы получить сразу следующий символ, и разыменовываю его, а затем возвращаю полученный символ.

Заметка

Я также хотел бы воспользоваться этой возможностью, чтобы формально выразить свое раздражение в Visual Studio, автоматически форматируя мой код, когда я пытаюсь играть в гольф (╯ ° □ °) ╯︵ ┻━┻.

Изменить: Спасибо Рэй за указание на некоторые различия в C и C ++ и где я мог сохранить символы <3.


C / C ++ не является языком: есть выражения, которые означают разные вещи в C и C ++. Например, в C ++, если функция имеет пустой список параметров, это означает, что она не принимает аргументов. Принимая во внимание, что в C это означает, что параметры не определены. Так что если вы решили , что это программа C, вы можете заменить #include <string.h>\nс char*strchr();и сохранить 6 байт в то же время совершенно законно. (А если вы предпочитаете C ++ по какой - либо причине, вы можете заменить #include <string.h>с #include <cstring>и сохранить 1 байт.)
Ray

Интересно, я не знал об этом. Обновил мой ответ, спасибо.
PragmaticProgrammer

1

JavaScript (ES6), 37 байт

p=s=>/^ *#( |$)/.test(s.split("\n")[0])

Объяснение:

p это функция, которая возвращает true если дорога, по которой меньше следуют, находится слева и false в противном случае. Это мой первый ответ на этом сайте, так что, вероятно, это может быть больше в гольфе (может быть, регулярное выражение).

Он работает, беря верхнюю строку ввода и проверяя, соответствует ли она регулярному выражению /^ *#( |$)/(начало строки, любое количество пробелов, # и пробел или конец строки.)

Это просто, чтобы дать людям разъяснения о формате и генерировать идеи. Я уверен, что это может быть разбито и играть в гольф дальше. Удачного игры в гольф!

p=s=>/^ *#[^#]/.test(s.split("\n")[0])
<textarea rows = "8" cols = "8" oninput = "console.log(p(this.value))"></textarea>


Я думаю, что вы можете иметь место вместо[^#]
Kritixi Lithos

Исправлена ​​проблема с регулярным выражением.
programmer5000

Я сделал короткий ответ Javascript .
Дэвид Арчибальд


1

Excel, 17 байт

=left(trim(A1),2)

Предполагает ввод в ячейку A1.

Возвращает ##справа и #( #и пробел) слева.


1

Дивиль , 12 байт

s=>s.trim[1]

Объяснение:

s=>          // lambda expression
   s.trim    // removes leading (and trailing) whitespace
         [1] // gets the second character

Использование:

let f: String -> char = s=>s.trim[1]
print f('...')

Возвращает (пробел) слева и #справа.


1

Java 7, 166 66 63 52 43 байта

int c(String s){return s.trim().charAt(1);}

Выходы 35справа и 32слева.
Основано на ответе @Clashsoft 's Dyvil .

Объяснение:

int c(String s){   // Method with String parameter and integer return-type
  return s.trim()  //  Remove leading and trailing whitspaces
   .charAt(1);     //  and return the second character (as int value)
}                  // End of method

Тестовый код:

class M{
  static int c(String s){return s.trim().charAt(1);}

  public static void main(String[] a){
    System.out.println(c(" ##    #\n  ##  #\n   ###\n    #\n    #\n    #"));
    System.out.println(c(" ##  #   \n  ## #  \n   ###\n    ##\n     #\n     #\n     #"));
    System.out.println(c(" ##  #   \n  ## #  \n   ###\n    ##\n   # \n  #  \n #   "));
    System.out.println(c(" ##   #  \n  ## #  \n   ###\n    #\n   # \n  #  \n  #  "));
    System.out.println(c(" #    ## \n  #  ## \n   ###\n    #\n   # \n  #  \n  #  "));
    System.out.println(c(" #    ## \n  #  ## \n   ###\n    #\n     #\n     #\n     #"));
  }
}

Попробуй это здесь.

Выход:

35
35
35
35
32
32

0

Befunge 98, 11 байт

-!jv~'
@.~<

Попробуйте онлайн!

Печать 32для левой и 35правой стороны, с одним пробелом в конце.

объяснение

-!jv      This is a no-op the first time through, but used later

    ~'    Pushes the ASCII value of the next character, and pushes 32
-!        Subtracts the 2, and nots. If the character was a space, the top will be 1
  jv      Goes to the second line if the character was not a space

  ~<      Pushes the next characer's ASCII value
 .        Prints it (32 for " " and 35 for "#")
@         Ends the program

Один трюк, который я использовал, ставил -!jvпервый, хотя он ничего не делал. Это позволило мне избавиться от пробела после 'и сохранить некоторые отступы. С этим последним код будет

~' -!jv
   @.~<

для 15 байтов.


0

Рубин, 20 байтов

->r{r.strip[1]==' '}

Возвращает true для левого, false для правого.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.