Qual é a altura dos monólitos?

29

Aqui está um exemplo de uma entrada de monólitos . Existem 4 neste exemplo.

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

O primeiro monólito tem 4 unidades de altura, o segundo é 2, o terceiro é 3 e o último é 1.

A tarefa

Seu programa deve gerar as alturas dos monólitos, da esquerda para a direita. O formato de saída pode estar em qualquer tipo de lista ou matriz.

Notas

  • A entrada pode ser tomada como qualquer sequência dimensional, lista de cadeias ou lista de caracteres.
  • Isso é , então os bytes mais baixos vencem .
  • Você deve assumir que os monólitos sempre têm a mesma largura e estão sempre a pelo menos 1 de _distância do outro.
  • Eles podem vir em qualquer altura e quantidade.

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]
Graviton
fonte
2
Posso assumir que a entrada está preenchida corretamente com espaços?
Isaacg
17
O seu [10]monólito não é [11]?
usar o seguinte
O indefinido não seria apenas uma matriz vazia?
Solomon Ucko
@isaacg sim, que seria bom
Graviton
@SolomonUcko tecnicamente sim, embora, para simplificar para todos os idiomas, eu decidi não fazer com que eles lidassem com isso.
Graviton

Respostas:

15

Gelatina , (8?) 9 bytes

Ỵ=”|Sḟ0m2

Um link monádico que aceita uma lista de caracteres conforme especificado e retorna uma lista de números inteiros.

Nota: 8 bytes se uma lista de seqüências de caracteres, uma por linha, realmente pretender ser um formato de entrada permitido - basta remover o .

Experimente online!

Quão?

Ỵ=”|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)
Jonathan Allan
fonte
Eu não sei, mas é isso ok?
V. Courtois
11
@ V.Courtois Não vejo por que não, pois provavelmente nunca obteremos essa informação.
Erik the Outgolfer
Ok, é porque eu vi que algumas outras respostas levam isso em conta
V. Courtois
2
@ V.Courtois a entrada que você sugeriu não se encaixa na especificação, adicionando sublinhados no céu, monolitos a meio caminho ou no subsolo provavelmente quebraria muitos outros envios.
Jonathan Allan
Eleitor descendente - você gostaria de explicar seus motivos?
Jonathan Allan
8

Gelatina , 11 bytes

ỴṚZi€”_ỊÐḟ’

Experimente online!

Erik, o Outgolfer
fonte
Uau, você respondeu tão rápido.
Graviton
@Graviton Hehe deve-se sempre ter esta página aberta em algum lugar. ;)
Erik the Outgolfer
14
Explicação, por favor!
Shaggy
6

JavaScript (ES6), 79 78 bytes

-1 byte graças a @Shaggy

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

Recebe entrada como uma matriz de seqüências de caracteres.

Snippet de teste

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>

Justin Mariner
fonte
11
78 bytes:a=>a.map((x,y)=>x.replace(/_/g,(_,z)=>c[z]=a.length-y-1),c=[])&&c.filter(n=>n)
Salsicha
@ Shaggy Nice, eu totalmente não pensei em usar replace. Obrigado!
Justin Mariner
6

C ++, 171 169 bytes

#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<<" ";}}

Experimente online!

C ++ (GCC), 150 bytes

Graças a @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<<" ";}}

Experimente online!

Steadybox
fonte
11
Se você estiver usando g ++, poderá usar o não padrão f(auto s)e especificar que ele utilize qualquer contêiner de acesso aleatório de contêineres de acesso aleatório de char.
Aschepler
5

05AB1E , 11 bytes

|Rζ'_δkJ®0‚K

Experimente online!

ζfoi substituído pelo .BøTIO, pois ainda não foi puxado para lá.

Erik, o Outgolfer
fonte
5

Dyalog APL, 29 bytes

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

Corra com ⎕IO←0.

Experimente online!

Quão?

⌽⍵='_'- onde está '_', as principais linhas primeiro

×- multiplique por ...

(⍳≢⍵)- o intervalo de (zero indexado)

↑¨ - para cada linha, preencha com zeros por ...

(⌈/⍴¨⍵) - o comprimento máximo

↑+/ - somar as linhas compactadas e achatadas

0~⍨ - remove zeros

Uriel
fonte
5

PowerShell, 133 bytes

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

Parece que não é muito competitivo; ele substitui um regex para transformar as torres em colunas de 1, transforma uma matriz de 0 no comprimento da sequência de entrada e depois percorre as linhas que somam os 1s.

Testes prontos para execução:

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


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

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


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

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

Japonês , 11 bytes

z ·mb'_ fw0

Teste online!

Explicação

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
ETHproductions
fonte
4

Retina , 48 38 bytes

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

Experimente online! O link inclui o primeiro exemplo. Explicação: É prefixada uma linha que coletará os resultados. Como cada coluna é repetidamente excluída por sua vez, aquelas que contêm um _nível acima do solo têm o número de linhas restantes na coluna contado. Finalmente, as linhas agora em branco são excluídas. Editar: salvou 10 bytes graças à inscrição de @FryAmTheEggman.

Neil
fonte
Bom, eu tinha uma solução um pouco mais curta , mas não funcionava em grandes entradas, pois atrapalhava minha capacidade de classificá-las. Ir coluna por coluna é uma boa maneira de evitar isso!
FryAmTheEggman
@FryAmTheEggman Mudei para o seu método de contar as linhas usando os _que faz muito mais sentido do que tentar usá- los |, obrigado!
Neil
@FryAmTheEggman Não resolve o problema, mas seu estágio de classificação pode ser simplificado, ignorando o lookhind behind e classificando por $.%`, e o estágio final pode ser !`\d+. E se você mudar o primeiro estágio para um lookahead, não precisará fazer um loop.
Martin Ender
@FryAmTheEggman E aqui está uma correção para sua abordagem, mas termina em 46 bytes.
Martin Ender
@MartinEnder 45 talvez? Experimente online!
Neil
4

Java 8, 133 117 116 114 bytes

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+",");}}

Toma a entrada como (← salva 16 bytes). -2 bytes em troca de uma saída menos legível, graças a @ OlivierGrégoire , alterando para .String[] char[][]
print(l-j+",")println(l-j)

Explicação:

Experimente aqui.

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
Kevin Cruijssen
fonte
Ainda não tentei, mas minha ideia para esse desafio era ir de cima para baixo e procurar _se a loja encontrada fosse sua localização e depois pedir, ignorando a linha inferior, é claro. Pode ajudar a salvar bytes ...
TheLethalCoder
@TheLethalCoder Esse também foi meu pensamento inicial, mas onde você deseja armazená-lo / encomendá-lo? Originalmente, pensei em um mapa, mas esses itens não foram classificados, portanto você precisará de um LinkedMap. Na minha cabeça, tudo parecia um pouco demais, mas se você puder encontrar uma maneira de fazê-lo mais curto do que isso, sinta-se à vontade para postar uma resposta e eu adicionarei +1. :)
Kevin Cruijssen
Eu só consegui baixá-lo para 150 usando o Linq, mas ainda deveria haver espaço para jogar golfe.
TheLethalCoder
Em C #, temos matrizes multidimensionais como: new[,] vez da matriz irregular que você está usando como new[][]. Se você tiver isso em Java, poderá economizar alguns bytes.
TheLethalCoder
11
System.out.println(l-j);parece suficientemente vistoso para eu poupar 2 bytes. Além disso, na explicação, você esqueceu de mudar length()paralength (nenhuma incidência na contagem de bytes, pois está correta no envio).
Olivier Grégoire
3

Haskell, 75 74 bytes

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

A entrada é esperada como uma lista de seqüências de caracteres (linha a linha).

siracusa
fonte
Por que usar um ponto-e-vírgula após a importação, quando uma nova linha tem o mesmo tamanho e é mais idiomática?
Jules
@Jules: Sim, eu costumo fazer
siracusa
3

Ruby , 82 bytes

Recebe uma lista de linhas.

->l{l.map! &:chars;(l.pop.zip(*l).map{|s|s.join.count ?|}-[i=0]).select{0<1&i+=1}}

Experimente online!

Value Ink
fonte
3

APL (Dyalog) , 14 bytes

0~⍨⍳∘≢+.×'_'=⊖

com ⎕IO←0

Experimente online!


Este trem de função equivalente a {((⍳≢⍵)+.×('_'=⊖⍵))~0}

TwiNight
fonte
3

C #, 150 144 137 bytes

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)

Versão completa / formatada:

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();
    }
}
TheLethalCoder
fonte
3

Java 8 - 229 bytes 213 bytes

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+",");}}

Experimente online!

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 + ",");
    }
}

Woo, primeiro post. Qualquer ajuda para melhorá-lo seria ótimo. Eu sei que posso me livrar disso indexOfescrito duas vezes. Sabia! Eu brinquei com a idéia de mudar os tipos no mapa de Inteiro para Longo, mas acho que esse é um beco sem saída.


Eu sei que já existe uma solução Java 8 muito, muito melhor , mas isso leva char[][]como entrada a qual eu acho que é mais fácil trabalhar nesse caso do que String.

Michael
fonte
11
Você não incluiu as importações (elas são necessárias para respostas Java). Não use um Mapmas um int[](talvez inicializado para new int[99]?). Não é necessário um espaço depois String[] l: String[]lfunciona da mesma forma e é mais curto. Use em println(l.length-i-1)vez de println(l.length-i-1+","). Não inicializar j: basta escrever: ,j;. Se você usar um int[]como sugerido anteriormente, declare assim: int m[]=new int[99],i=0,j;e remova a declaração do for-loop.
Olivier Grégoire
11
OlivierGrégoire está realmente certo quanto à importação necessária para o Map. Como para alguns golfe do seu código atual com o mapa, você pode alterá-lo para isto: 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);}. Não é necessário <Integer,Integer>o mapa quando você pode converter int; a.length-1é usado duas vezes, para que você possa usar uma variável; colocando tudo dentro de loops, você pode se livrar de todos os colchetes. Bem-vindo ao PPCG! :)
Kevin Cruijssen
@KevinCruijssen Thanks! Converter o conteúdo desse primeiro loop for em um loop for sem corpo foi inspirador! Super inteligente.
Michael
@ Michael De nada. :) Ah, e se você ainda não viu: Dicas para jogar golfe em Java e Dicas para jogar golfe em <todos os idiomas> podem ser interessantes para ler. Me ajudou muito quando comecei (e ainda o faz às vezes).
Kevin Cruijssen 01/07/19
3

MATL , 10 bytes

ooYssqtO>)

A entrada é uma matriz de caracteres preenchida.

Experimente online!

taça
fonte
2

Mathematica, 48 47 39 bytes

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

Experimente online!

Functionque espera uma matriz retangular de caracteres. Toma Mostda matriz (exceto a última linha),Reverse s, depois pega o Transpose*, depois encontra todos os Positions nos quais o _caractere aparece. As alturas relevantes são os Lastelementos de cadaPosition .

* é o 3caractere de uso privado de bytes U+F3C7que representa \[Transpose]no Mathematica. Observe que isso não funciona em matemática ; portanto, o link TIO usa apenasTranspose .

ngenisis
fonte
2

SOGL V0.12 , 9 bytes

I{ _WH╥?O

Experimente aqui!
Recebe entrada como uma matriz de matrizes de strings (caracteres).

Explicaçã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
dzaima
fonte
2

JavaScript (ES6), 108 104 88 bytes

Guardado 16 bytes graças a @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)

Entrada tomada como uma matriz de strings

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))

alexanderbird
fonte
88 bytes aqui
Justin Mariner
Obrigado @JustinMariner! Estou entusiasmado com a inicialização da variável como parâmetros não utilizados Array.map, isso é um truque legal.
Alexanderbird
Você realmente precisa atribuir o RegEx a uma variável? Você pode usá-lo diretamente no exece salvar alguns bytes.
Shaggy
Na verdade, é necessário - o loop while itera sobre cada correspondência em uma linha, e sem o estado interno do regex na variável, ele corresponderia à primeira ocorrência de cada vez e repetiria infinitamente. Cada iteração criaria uma nova regex para execcorresponder à primeira. Na verdade, ele trava o editor de trechos de trocas de pilha se você incorporar a regex. A menos que eu esteja perdendo alguma coisa?
alexanderbird
@shaggy eu esqueci de marcar você em meu último comentário
alexanderbird
2

CJam, 15 14 bytes

1 byte salvo graças a @BusinessCat

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

Este é um bloco que pega uma matriz de seqüências de caracteres na pilha e gera uma matriz.

Explicação:

W%    e# Reverse
z     e# Zip
'_f#  e# Get the index of '_' in each element (-1 if not found)
{0>}, e# Filter where positive
Esolanging Fruit
fonte
Você pode economizar 1 byte, revertendo toda a matriz antes da transposição.
Business Cat
1

Pip , 18 17 bytes

15 bytes de código, +2 para -rpsinalizadores.

_FI_@?'_MRVgZDs

Recebe entrada de stdin. Experimente online!

Explicação

                 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)
DLosc
fonte
1

Pitão , 19 15 14 bytes

f>T0mx_d\_.tQd

Teste online! A entrada é uma lista de linhas.

Explicações

          .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
Jim
fonte
1

Perl 6 , 65 bytes

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

Experimente online!

  • m:exhaustive/^^(\N+)_([\N*\n]+:)/procura na string de entrada todos os sublinhados e retorna um objeto de correspondência para cada um, onde os primeiros parênteses de captura contêm a parte anterior da linha na qual o sublinhado é encontrado e os segundos parênteses de captura contêm o restante inteiro da string. O restante da string deve conter pelo menos uma nova linha, para não contarmos os sublinhados no nível do solo. A :exhaustivebandeira permite que essas correspondências se sobreponham.
  • .sort(*[0].chars)classifica esses objetos de correspondência pelo número de caracteres na parte da linha que precede cada sublinhado. Isso os ordena da esquerda para a direita.
  • .map(+*[1].comb("\n"))mapeia cada objeto de correspondência para o número de caracteres de nova linha na parte da sequência de entrada que segue cada sublinhado - ou seja, a altura. O \né um caractere de nova linha real, economizando um byte.
Sean
fonte
0

PHP, 119 bytes

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

Vamos quebrar isso! Nossa entrada aqui é uma matriz 2D de caracteres.

$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)
Xanderhall
fonte
-1

Recebe uma sequência multilinha. O crédito para a instalação (cabeçalho e rodapé) vai para @GarethPW

Python 2 , 29 bytes

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

Experimente online!

Isso simplesmente dividirá a matriz por nova linha e retornará o comprimento-1.

emtree
fonte
Isso não cumpre todo o desafio. Você deve retornar uma matriz ou lista com todas as alturas, não apenas as mais altas.
Scott Milner