Гладкий против Коренастых против Сломанных Сквигглов


12

На основе коренастых против гладких струн .

Squiggles /\_/\/\__/\/\/\/\_/\_/\весело делать на клавиатуре, когда вам действительно скучно. Но не все загогулины созданы равными. Некоторые загогулины гладкие, \___/а некоторые коренастые, как /\/\/\/\. Другие просто сломаны, как////_\\\

Внутри каждого загадочного Nперсонажа есть N-1перекрестные узлы. Каждый соединительный кран классифицируется на один из трех типов:

  • Гладкая (угол> «90 градусов»):

    \_ __ _/

  • Коренастый (угол = "90 градусов")

    /\ \/

  • Сломан (все, что не соединяется)

    // \\ /_ _\

Давайте определим гладкость быть доля соединений , которые являются гладкими, с chunkiness и разбитости , определенной аналогично. Каждое значение колеблется между 0и 1. Сумма гладкости, короткости и ломкости закорючка всегда равна 1.

Например, в squiggle /\/\\_//\_есть 3 гладких соединения, 4 коротких соединения и 2 сломанных соединения. Таким образом, он 0.3333гладкий, 0.4444коренастый и 0.2222сломанный.

Пустые строки и строки только с одним символом имеют неопределенные значения, весь ввод будет не менее 2 символов.

Вызов

Напишите программу, которая принимает волнистую произвольную длину и выдает любые два значения: гладкости, краткости и ломкости.

  • Вы можете написать программу или функцию, используя ввод через STDIN, командную строку или строковый аргумент.
  • Вы можете предположить, что ввод имеет по крайней мере длину> = 2 и состоит только из символов /\_с необязательным завершающим переводом строки.
  • Выведите (или верните, если функция), два числа с плавающей запятой с точностью не менее 4 десятичных знаков, округленных или усеченных. Если истинное значение равно 2/3, допустимые значения включают любое значение между 0.6666и 0.6667даже такими вещами 0.666637104. Если точное значение равно 1/3, любой содержащий ответ 0.3333является действительным. Вы можете не указывать конечные нули или ведущий ноль, если значение меньше единицы.
  • Выведите любую пару из трех значений по своему усмотрению, просто обязательно укажите, какие два и в каком порядке.

Самый короткий код в байтах побеждает.

Примеры

/\/\\/\//\\→ Гладкость 0, короткость 0.7, разбитость0.3

_/\\_/\\/__/\\\//_→ Гладкость 0.29411764705, короткость 0.29411764705, разбитость0.41176470588

//\\__/_\/→ Гладкость 0.3333333, короткость 0.2222222, разбитость0.4444444

Бонусный вопрос: что вы предпочитаете: гладкие или короткие или ломаные загогулины?


Может ли быть бонус за вывод всех трех, или у вас есть конкретная причина для выбора только двух?
Aᴄʜᴇʀᴏɴғᴀɪʟ

1
@Callodacity 2 достаточно для определения 3-го, поскольку они составляют 1
trichoplax

2
@trichoplax хороший момент - очевидно, я слишком долго играю в гольф, я не могу больше постигать простые вещи: P
Aᴄʜᴇʀᴏɴғᴀɪʟ

Ответы:


2

Pyth, 25 байт

mcl@.:d2.:z2tlzc2"\__//\/

Тестирование

Выводы гладкость, короткость. По сути, он берет жестко закодированную строку и разрезает ее пополам. Каждая половина разбита на свои 2 символьные подстроки, и то же самое делается для ввода. Возьмем перекресток, в результате чего получится южная и коренастая пары. Затем мы берем длину, делим на количество пар и печатаем.


2

Japt, 42 байта

U=U¬ä@2+"\\/\\__/"bX+Y)f2};[T2]£U¬fX l /Ul

Выходы ломаная, коренастая. Попробуйте онлайн!

Как это устроено

            // Implicit: U = input string
U=UŠ@   }  // Set U to U split into chars, with each pair mapped by this function:
"..."bX+Y)  // Take the index in this string of the two chars concatenated.
            // This is 0-1 for chunky, 2-4 for smooth, and -1 for broken.
2+    f2    // Add two and floor to the nearest multiple of 2.
            // This is now 2 for chunky, 4 or 6 for smooth, and 0 for broken.
[T2]£       // Map each item X in [0,2] through this function:
U¬fX l      //  Count the occurances of X in U.
/Ul         //  Divide by U.length.
            // Implicit: output last expression

Неконкурентная версия, 36 байт

U=Uä@2+"\\/\\__/"bZ)f2};[T2]£UèX /Ul

Работает в основном так же, как и другие, с небольшими изменениями:

  • äсейчас работает на струнах. Символы передаются в функцию по порядку (X, Y, X+Y).
  • è подсчитывает количество вхождений аргумента в строку / массив.

1

Python 3, 149 байт

Это выводит гладкость и коренастость.

def f(s):
 for i in"012":s=s.replace("\_/"[int(i)],i)
 a=len(s)-1;t=["bscbssbbc"[int(s[i:i+2],3)]for i in range(a)]
 for x in"sc":print(t.count(x)/a)

Ungolfed:

def f(s):
    for i in "012":
        s = s.replace("\_/"[int(i)], i)
    a = len(s) - 1
    t = []
    for i in range(a):
        t.append("bscbssbbc"[int(s[i:i+2],3)])
    for x in "sc":
        print(t.count(x) / a)

1

Руби, 71

Выводы гладкость, короткость.

Берет минимальные гладкие и короткие строки и ищет их для каждой двухсимвольной строки в исходной строке.

Спасибо Кевину Лау за ВОСЕМЬ байтов!

->x{%w{\\__/ /\\/}.map{|t|(0..n=x.size-2).count{|i|t[x[i,2]]}/(n+1.0)}}

1
(0..x.size-2).count{|i|t[x[i,2]]}экономит 5 байтов x.chars.each_cons(2).count{|i|t[i*'']}. И теперь, когда вы x.sizeдважды используете функцию, присваиваете ее переменной и используете ее, чтобы сохранить дополнительный байт.
Значение чернил

@KevinLau Удалось сохранить 8 байтов, используя ваш подход. Благодарность!
Не то чтобы Чарльз
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.