Насколько высоки монолиты?


29

Вот пример ввода монолитов . В этом примере 4

  _
 | |        _
 | |  _    | |
 | | | |   | |     _
_| |_| |___| |____| |_

Первый монолит имеет высоту 4 единицы, второй - 2, третий - 3, а последний - 1.

Задание

Ваша программа должна выводить высоты монолитов в порядке слева направо. Выходной формат может быть в любом виде списка или массива.

Заметки

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

I / O

  _
 | |        _
 | |  _    | |
 | | | |   | |     _
_| |_| |___| |____| |_   >> [4,2,3,1]

           _
          | |
  _       | |
 | |  _   | |  _
_| |_| |__| |_| |_   >> [2,1,4,1]


 _   _   _ 
| |_| |_| |_____   >> [1,1,1]

____________________   >> undefined behavior

 _
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |   >> [11]

     _       _       _       _       _
 _  | |  _  | |  _  | |  _  | |  _  | |
| |_| |_| |_| |_| |_| |_| |_| |_| |_| |  >> [1,2,1,2,1,2,1,2,1,2]

2
Могу ли я предположить, что ввод справа заполнен пробелами?
Исаак

17
Твой [10]монолит нет [11]?
TessellatingHeckler

Разве неопределенный не будет пустым массивом?
Соломон Уко

@isaacg да, это было бы хорошо
Гравитон

@SolomonUcko технически да, хотя, чтобы упростить его для всех языков, я решил, что они не будут иметь с этим дело.
Гравитон

Ответы:


15

Желе , (8?) 9 байт

Ỵ=”|Sḟ0m2

Монадическая ссылка, принимающая список символов, как указано, и возвращающая список целых чисел.

Примечание: 8 байт, если список строк, по одной на строку, действительно был задан в качестве разрешенного формата ввода - просто удалите .

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

Как?

Ỵ=”|Sḟ0m2 - Link: list of characters, s
Ỵ         - split at newlines
  ”|      - literal '|'
 =        - equals (vectorises)
    S     - sum (vectorises, hence counts the number of '|' in every column)
     ḟ0   - filter out zeros (only keep the results from the sides of the towers)
       m2 - modulo index with 2 (keep only the left side measurements)

Я не знаю, но это нормально?
В. Куртуа

1
@ V.Courtois Я не понимаю, почему нет, так как мы, вероятно, никогда не получим такой вклад.
Эрик Outgolfer

Хорошо, это потому, что я видел, что некоторые другие ответы учитывают это
В. Куртуа

2
@ V.Courto - то, что вы предлагаете, не соответствует спецификации, аналогичным образом добавление подчеркивания в небе, монолитах на полпути или под землей, вероятно, нарушит многие другие представления.
Джонатан Аллан

Даун избиратель - не могли бы вы объяснить свои причины?
Джонатан Аллан


6

JavaScript (ES6), 79 78 байт

-1 байт благодаря @Shaggy

a=>a.map((b,i)=>b.replace(/_/g,(_,j)=>o[j]=a.length-i-1),o=[])&&o.filter(x=>x)

Принимает ввод как массив строк.

Тестовый фрагмент

f=
a=>a.map((b,i)=>b.replace(/_/g,(_,j)=>o[j]=a.length-i-1),o=[])&&o.filter(x=>x)
I.value="           _\n          | |\n  _       | |\n | |  _   | |  _\n_| |_| |__| |_| |_"
<textarea id=I rows=7 cols=30></textarea><br><button onclick="O.value=`[${f(I.value.split`\n`).join`, `}]`">Run</button> <input id=O disabled>


1
78 байт:a=>a.map((x,y)=>x.replace(/_/g,(_,z)=>c[z]=a.length-y-1),c=[])&&c.filter(n=>n)
Shaggy

@ Shaggy Хорошо, я совсем не думал об использовании replace. Благодарность!
Джастин Маринер

6

C ++, 171 169 байт

#import<vector>
#import<iostream>
int f(std::vector<std::string>s){for(int a,j,i=0,k=s.size()-1;a=s[k][i];++i)if(a==32){for(j=0;(a=s[k-++j][i])-95;);std::cout<<j<<" ";}}

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

C ++ (GCC), 150 байт

Спасибо @aschepler!

#import<vector>
#import<iostream>
int f(auto s){for(int a,j,i=0,k=s.size()-1;a=s[k][i];++i)if(a==32){for(j=0;(a=s[k-++j][i])-95;);std::cout<<j<<" ";}}

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


1
Если вы используете g ++, вы можете использовать нестандартный f(auto s)и указать, что он принимает любой контейнер произвольного доступа с контейнерами произвольного доступа char.
aschepler


5

Дьялог АПЛ, 29 байт

{0~⍨↑+/(⌈/⍴¨⍵)↑¨(⍳≢⍵)×⌽⍵='_'}

Беги с ⎕IO←0.

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

Как?

⌽⍵='_'- где это '_', верхние строчки первого

×- умножить на ...

(⍳≢⍵) - ассортимент (с нулевым индексом)

↑¨ - для каждой строки, блок с нулями по ...

(⌈/⍴¨⍵) - максимальная длина

↑+/ - суммировать строки в молнии и выровнять

0~⍨ - удаляет нули



5

PowerShell, 133 байта

param($s)$r=,0*($l=($s=$s-replace'\| \|',' 1 ')[0].Length);1..$s.Count|%{$z=$_-1;0..($l-1)|%{$r[$_]+=(''+$s[$z][$_]-as[int])}};$r-ne0

Похоже, это не очень конкурентоспособно; он заменяет регулярное выражение, чтобы превратить башни в столбцы 1, делает массив 0 длиной входной строки, затем перебирает строки, складывая 1.

Тесты готовы к запуску:

$s1 = @'
  _                   
 | |        _         
 | |  _    | |        
 | | | |   | |     _  
_| |_| |___| |____| |_
'@-split"`r?`n"


$s2 = @'
 _
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| | 
'@-split"`r?`n"

$s3 = @'
           _      
          | |       
  _       | |           
 | |  _   | |  _   
_| |_| |__| |_| |_ 
'@-split"`r?`n"


$s4 = @'
 _   _   _      
| |_| |_| |_____ 
'@-split"`r?`n"

$s5 = @'
     _       _       _       _       _ 
 _  | |  _  | |  _  | |  _  | |  _  | |
| |_| |_| |_| |_| |_| |_| |_| |_| |_| | 
'@-split"`r?`n"

4

Japt , 11 байт

z ·mb'_ fw0

Проверьте это онлайн!

объяснение

z ·mb'_ fw0   : Implicit input
z             : Rotate the input clockwise. This puts the "floor" against the left side.
  ·           : Split the 2D string into lines.
   m          : Replace each column (now row) X with
    b'_       :   the index of '_' in X (0-indexed). This gives us the output list, with
              :   0's and -1's mixed in representing the columns that are not monoliths.
        f     : Take only the items X where
         w0   :   max(X, 0) is truthy. Since 0 is falsy, this removes anything <= 0.
              : Implicit: output result of last expression

4

Retina , 48 38 байт

^
¶
{`(¶.*)*¶_(.*¶)+
$#2 $&
}`¶.
¶
G`.

Попробуйте онлайн! Ссылка включает в себя первый пример. Объяснение: Префикс строки, которая будет собирать результаты. Поскольку каждый столбец неоднократно удаляется по очереди, в столбцах, находящихся _выше уровня земли, учитывается количество оставшихся строк в столбце. Наконец, теперь пустые строки удаляются. Редактировать: 10 байтов сохранено благодаря использованию @FryAmTheEggman.


Хорошо, у меня было немного более короткое решение , но оно не работало на больших входах, так как это испортило бы мою способность сортировать их. Переход от столбца к столбцу - хороший способ избежать этого!
FryAmTheEggman

@FryAmTheEggman Я перешел на ваш метод подсчета строк с использованием _s, который имеет гораздо больше смысла, чем попытка использовать |s, спасибо!
Нил

@FryAmTheEggman Не решает проблему, но ваш этап сортировки можно упростить, отбросив взгляд назад и выполнив сортировку $.%`, и последний этап может быть !`\d+. И если вы измените первую стадию на предвкушение, вам не нужно зацикливаться.
Мартин Эндер

@FryAmTheEggman А вот и исправление вашего подхода, но оно заканчивается на 46 байтах.
Мартин Эндер

@MartinEnder 45 возможно? Попробуйте онлайн!
Нил

4

Java 8, 133 117 116 114 байт

a->{for(int l=a.length-1,i=0,j;i<a[0].length;i++)if(a[l][i]<33){for(j=0;a[j][i]<33;j++);System.out.print(l-j+",");}}

Принимает ввод как (← сохраняет 16 байт). -2 байта в обмен на менее читаемый вывод благодаря @ OlivierGrégoireString[] char[][]
, изменив print(l-j+",")на println(l-j).

Объяснение:

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

a->{                         // Method with character 2D-array parameter and no return-type
  for(int l=a.length-1,      //  Length of the 2D char-array - 1
      i=0,j;                 //  Index-integers
    i<a[0].length;i++)       //  Loop (1) over the 2D char-array
    if(a[l][i]<33){          //   If the base of the current column is a space
      for(j=0;a[j][i]<33;    //    Loop (2) over the cells in this column as long as
                             //    we encounter spaces (from top to bottom)
        j++                  //     And increase `j` every time, to go down the column
      );                     //    End of loop (2)
      System.out.println(l-j);
                             //    Print the amount of rows - `j`
    }                        //   End of if-block
                             //  End of loop (1) (implicit / single-line body)
}                            // End of method

Я еще не пробовал, но моя идея для этой задачи состояла в том, чтобы пойти сверху вниз и посмотреть, _найден ли магазин, где он находится, а затем заказать его, игнорируя, конечно, нижний ряд. Может помочь сохранить байты ...
TheLethalCoder

@TheLethalCoder Это была моя первоначальная мысль, но где вы хотите сохранить / заказать? Сначала я думал о карте, но они не отсортированы, поэтому вам понадобится LinkedMap. В моей голове все это звучало слишком много байтов, но если вы можете найти способ сделать это короче, чем этот, не стесняйтесь опубликовать ответ, и я +1 +1. :)
Кевин Круйссен

Мне удалось довести его до 150 с помощью Linq, но все еще должно быть место для игры в гольф.
TheLethalCoder

В C # у нас есть многомерные массивы, такие как: new[,]вместо зубчатого массива, который вы используете как new[][]. Если у вас есть это в Java, это может сэкономить вам несколько байтов.
TheLethalCoder

1
System.out.println(l-j);выглядит достаточно объемным для меня, чтобы сэкономить 2 байта. Кроме того, в объяснении вы забыли перейти length()на length(без учета количества байтов, так как это правильно в представлении).
Оливье Грегуар

3

Haskell, 75 74 байта

import Data.List;f=filter(>0).map(length.fst.span(<'!').reverse).transpose

Ввод ожидается в виде списка строк (по строкам).


Зачем использовать точку с запятой после импорта, если символ новой строки такой же длины и более идиоматичен?
Жюль

@Jules: Да, я обычно делаю
siracusa




3

C #, 150 144 137 байт

using System.Linq;a=>a.SelectMany((i,h)=>i.Select((c,w)=>new{c,w,d=a.Length-1-h}).Where(o=>o.c==95&o.d>0)).OrderBy(o=>o.w).Select(o=>o.d)

Полная / Отформатированная версия:

using System;
using System.Collections.Generic;
using System.Linq;

class P
{
    static void Main()
    {
        Func<char[][], IEnumerable<int>> f = a =>
            a.SelectMany((i, h) => i.Select((c, w) => new { c, w, d = a.Length - 1 - h })
                                    .Where(o => o.c == 95 & o.d > 0))
             .OrderBy(o => o.w)
             .Select(o => o.d);

        Console.WriteLine(string.Concat(f(new char[][]
        {
            "  _                 ".ToArray(),
            " | |       _        ".ToArray(),
            " | |  _   | |       ".ToArray(),
            " | | | |  | |    _  ".ToArray(),
            "_| |_| |__| |___| |_".ToArray(),
        })));

        Console.ReadLine();
    }
}

3

Java 8 - 229 байт 213 байт

s->{Map<Integer,Integer> m=new TreeMap();String[] l=s.split("\n");for(int i=0,j=-1;i<l.length-1;++i){s=l[i];while((j=s.indexOf("_",j+1))>=0){m.put(j,i);}}for(int i:m.values()){System.out.print(l.length-i-1+",");}}

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

Ungolfed:

public static void foo(String input)
{
    Map<Integer, Integer> map = new TreeMap(); // Raw types!!
    String[] lines = input.split("\n");

    for (int i = 0, j = -1; i < lines.length - 1; ++i)
    {
        input = lines[i];

        while ((j = input.indexOf("_", j + 1)) >= 0)
        {
            map.put(j, i);
        }
    }

    for(int i:map.values())
    {
        System.out.print(lines.length - i - 1 + ",");
    }
}

Ву, первый пост. Любая помощь по улучшению это было бы здорово. Я знаю, что могу избавиться от indexOfнаписанного дважды. Знал это! Я поиграл с идеей изменить типы на карте с Integer на Long, но я думаю, что это тупик.


Я знаю, что уже есть намного, намного лучшее решение Java 8 , но оно принимает в char[][]качестве входных данных, с которым, я думаю, легче работать в этом случае, чем с String.


1
Вы не включили импорт (они необходимы для ответов Java). Не используйте, Mapно int[](может быть инициализирован для new int[99]?). Не нужно места после String[] l: String[]lработает так же и короче. Используйте println(l.length-i-1)вместо println(l.length-i-1+","). Не инициализации j: просто написать: ,j;. Если вы используете int[]как предложено ранее, объявите так: int m[]=new int[99],i=0,j;и удалите объявление из for-loop.
Оливье Грегуар

1
OlivierGrégoire действительно прав насчет необходимого импорта для Map. Что касается некоторых гольф вашего текущего кода с картой, вы можете изменить его к этому: import java.util.*;s->{Map m=new TreeMap();String[]a=s.split("\n");int l=a.length-1,j=-1,i=j;for(;++i<l;)for(s=a[i];(j=s.indexOf("_",j+1))>=0;m.put(j,i));for(Object o:m.values())System.out.println(l-(int)o);}. Нет необходимости в <Integer,Integer>карте, когда вы можете привести к int; a.length-1используется дважды, поэтому вы можете использовать переменную для него; поместив все в циклы for, вы можете избавиться от всех скобок. О, и добро пожаловать в PPCG! :)
Кевин Круйссен

@KevinCruijssen Спасибо! Преобразование содержимого первого цикла for в цикл for без тела вдохновляло! Супер умный.
Майкл

@ Майкл Не за что. :) Да, и если вы еще этого не видели: советы по игре в гольф на Java и советы по игре в гольф на <все языки> могут быть интересными для чтения. Мне очень помогли, когда я только начал (и до сих пор иногда).
Кевин Круйссен


2

Mathematica, 48 47 39 байт

Last/@(Reverse@Most@#~Position~"_")&

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

Functionкоторый ожидает прямоугольный массив символов. Получает Mostмассив (все, кроме последней строки), Reverses it, затем принимает Transpose*, затем находит все Positions, в которых _появляется символ. Соответствующие высоты являются Lastэлементами каждого Position.

* является 3байтовым символом частного использования, U+F3C7который представляет \[Transpose]в Mathematica. Обратите внимание, что это не работает в математике , поэтому ссылка TIO просто использует Transpose.


2

SOGL V0.12 , 9 байт

I{ _WH╥?O

Попробуй здесь!
Принимает ввод как массив массивов строк (символов).

Объяснение:

I          rotate the array clockwise
 {         for each element
   _       push "_"
    W      get its index in the array (0 if not found, 1 if its the ground, >1 if its what we need)
     H     decrease that
      ╥    palindromize (duplicates the number, if it's <0, then errors and pushes 0, if =0, pushes 0, if >0, then pushes the number palindromized (always truthy))
       ?   if that, then
        T  output in a new line the original decreased index

2

JavaScript (ES6), 108 104 88 байт

Сохранено 16 байт благодаря @JustinMariner

i=>i.map((s,h)=>{while(t=r.exec(s))m[t.index]=i.length-h-1},m=[],r=/_/g)&&m.filter(e=>e)

Ввод принимается как массив строк

let input = [
'  _',
' | |           _',
' | |  _   _   | |',
' | | | | | |  | |     _',
'_| |_| |_| |__| |____| |_'
]

let anonymousFunction =
i=>i.map((s,h)=>{while(t=r.exec(s))m[t.index]=i.length-h-1},m=[],r=/_/g)&&m.filter(e=>e)

console.log(anonymousFunction(input))



Спасибо @JustinMariner! Я в восторге от инициализации переменной как заданных неиспользуемых параметров Array.map, это крутой трюк.
alexanderbird

Вам действительно нужно присвоить RegEx переменной? Вы можете использовать его непосредственно в execи сохранить несколько байтов.
Лохматый

На самом деле, это необходимо - цикл while выполняет итерации по каждому совпадению в строке, и без внутреннего состояния регулярного выражения в переменной он будет соответствовать первому вхождению каждый раз и будет выполняться бесконечно. На каждой итерации создается новое регулярное выражение, поэтому execоно соответствует первому. Это фактически приводит к сбою редактора фрагмента обмена стека, если вы включите регулярное выражение. Если я что-то упустил?
alexanderbird

@shaggy Я забыл пометить тебя в своем последнем комментарии
alexanderbird

2

CJam, 15 14 байтов

1 байт сохранен благодаря @BusinessCat

{W%z'_f#{0>},}

Это блок, который принимает массив строк в стеке и выводит массив.

Объяснение:

W%    e# Reverse
z     e# Zip
'_f#  e# Get the index of '_' in each element (-1 if not found)
{0>}, e# Filter where positive

Вы можете сохранить 1 байт, переставив весь массив перед переносом.
Деловая кошка

1

Пип , 18 17 байт

15 байтов кода, +2 для -rpфлагов.

_FI_@?'_MRVgZDs

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

объяснение

                 g is list of lines from stdin (-r flag); s is space
         RVg     Reverse g
            ZDs  Zip (transpose), filling gaps with a default char of space
        M        Map this function:
   _@?'_          Index of _ in each line (or nil if it doesn't appear)
_FI              Filter, keeping only the truthy (nonzero, non-nil) values
                 Autoprint in repr format (-p flag)

1

Pyth , 19 15 14 байтов

f>T0mx_d\_.tQd

Проверьте это онлайн! Вход представляет собой список строк.

Пояснения

          .tQd     # Transpose, pad with spaces
    mx_d\_         # For each line, reverse it, find the position of "_" (-1 if not found)
f>T0               # Filter on positions greater than zero


1

Perl 6 , 65 байт

{m:ex/^^(\N+)_([\N*\n]+:)/.sort(*[0].chars).map(+*[1].comb("
"))}

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

  • m:exhaustive/^^(\N+)_([\N*\n]+:)/осуществляет поиск во входной строке всех символов подчеркивания и возвращает объект соответствия для каждого из них, где первые круглые скобки содержат предшествующую часть строки, в которой найдено подчеркивание, а вторые круглые скобки содержат всю оставшуюся часть строки. Остальная часть строки должна содержать хотя бы одну новую строку, поэтому мы не учитываем подчеркивания на уровне земли. :exhaustiveФлаг позволяет эти матчи с перекрытием.
  • .sort(*[0].chars)сортирует эти совпадающие объекты по количеству символов в части строки, предшествующей каждому подчеркиванию. Это заказывает их слева направо.
  • .map(+*[1].comb("\n"))сопоставляет каждый совпадающий объект с количеством символов новой строки в части входной строки, тянущейся за каждым подчеркиванием, то есть с высотой. \nЯвляется актуальной символ новой строки, сохраняя один байт.

0

PHP, 119 байт

function($s){$r=array_map(null,...$s);foreach($r as$k=>&$v)if($v=array_count_values($v)['|'])echo($v+$r[$k+2]=0)." ";};

Давайте разберемся с этим! Наш вход здесь представляет собой двумерный массив символов.

$r=array_map(null,...$s) // Neat little snippet to transpose the array

foreach($r as$k=>&$v)    // Loop through the array, grabbing each row of our 2D array 
(which is now each column of the monolith)

if($v=array_count_values($v)['|']) // Count the number of '|' characters in the column 
(which is the height of our monolith), and if it's greater than 0 (truthy in PHP)...

echo($v+$r[$k+2]=0)." "; // Output that number, and simultaneously set the row 2 indices
                            down to null (to remove duplicate values)

-1

Берет многострочную строку. Кредит на настройку (верхний и нижний колонтитулы) идет на @GarethPW

Python 2 , 29 байт

lambda s:len(s.split('\n'))-1

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

Это просто разделит массив на новую строку и вернет length-1.


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