¿Qué altura tienen los monolitos?

29

Aquí hay un ejemplo de una entrada de monolitos . Hay 4 en este ejemplo.

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

El primer monolito tiene 4 unidades de altura, el segundo es 2, el tercero es 3 y el último es 1.

La tarea

Su programa debería generar las alturas de los monolitos en orden de izquierda a derecha. El formato de salida puede estar en cualquier tipo de lista o matriz.

Notas

  • La entrada se puede tomar como cualquier cadena dimensional, lista de cadenas o lista de caracteres.
  • Este es el , por lo que gana los bytes más bajos .
  • Debe suponer que los monolitos siempre tienen el mismo ancho y siempre están al menos a 1 _distancia de otro.
  • Pueden venir en cualquier altura y en cualquier cantidad.

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
fuente
2
¿Puedo suponer que la entrada está bien rellenada con espacios?
isaacg
17
¿ [10]No es tu monolito [11]?
TessellatingHeckler
¿No sería el indefinido una matriz vacía?
Solomon Ucko
@isaacg sí, eso estaría bien
Graviton
@SolomonUcko técnicamente sí, aunque para que sea más simple para todos los idiomas, decidí que no se ocupen de eso.
Graviton

Respuestas:

15

Jalea , (8?) 9 bytes

Ỵ=”|Sḟ0m2

Un enlace monádico que acepta una lista de caracteres como se especifica y devuelve una lista de enteros.

Nota: 8 bytes si una lista de cadenas, una por línea, realmente tenía la intención de ser un formato de entrada permitido, simplemente elimine el .

Pruébalo en línea!

¿Cómo?

Ỵ=”|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
fuente
No sé, pero ¿ esta bien?
V. Courtois
1
@ V.Courtois No veo por qué no, ya que probablemente nunca recibiremos esa información.
Erik the Outgolfer
Bien, es porque vi que algunas otras respuestas lo toman en cuenta
V. Courtois
2
@ V.Courtois la entrada que sugirió no se ajusta a la especificación, de manera similar, agregar guiones bajos en el cielo, monolitos a medio camino o subterráneos probablemente rompería muchas otras presentaciones.
Jonathan Allan
Votante: ¿le gustaría explicar sus razones?
Jonathan Allan
8

Jalea , 11 bytes

ỴṚZi€”_ỊÐḟ’

Pruébalo en línea!

Erik el Outgolfer
fuente
Wow, respondiste eso rápido.
Graviton
@Graviton Jeje, uno siempre debe tener esta página abierta en alguna parte. ;)
Erik the Outgolfer
14
Explicación, por favor!
Shaggy
6

JavaScript (ES6), 79 78 bytes

-1 byte gracias a @Shaggy

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

Toma la entrada como una matriz de cadenas.

Fragmento de prueba

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
fuente
1
78 bytes:a=>a.map((x,y)=>x.replace(/_/g,(_,z)=>c[z]=a.length-y-1),c=[])&&c.filter(n=>n)
Shaggy
@ Shaggy Nice, no pensé en usarlo replace. ¡Gracias!
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<<" ";}}

Pruébalo en línea!

C ++ (GCC), 150 bytes

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

Pruébalo en línea!

Steadybox
fuente
1
Si usa g ++, puede usar el no estándar f(auto s)y especificar que toma cualquier contenedor de acceso aleatorio de contenedores de acceso aleatorio de char.
aschepler
5

Dyalog APL, 29 bytes

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

Corre con ⎕IO←0.

Pruébalo en línea!

¿Cómo?

⌽⍵='_'- dónde está '_', primero las líneas superiores

×- multiplicar por ...

(⍳≢⍵)- el rango de (indexado a cero)

↑¨ - para cada línea, pad con ceros por ...

(⌈/⍴¨⍵) - la longitud máxima

↑+/ - Sumar las filas con cremallera y aplanar

0~⍨ - elimina ceros

Uriel
fuente
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 no es muy competitivo; hace un reemplazo de expresiones regulares para convertir las torres en columnas de 1, hace una matriz de 0 de la longitud de la cadena de entrada, luego pasa a través de las líneas sumando los 1s.

Pruebas listas para correr:

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


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

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


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

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

Japt , 11 bytes

z ·mb'_ fw0

¡Pruébelo en línea!

Explicación

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
ETHproducciones
fuente
4

Retina , 48 38 bytes

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

Pruébalo en línea! El enlace incluye el primer ejemplo. Explicación: una línea tiene el prefijo que recogerá los resultados. Como cada columna se elimina repetidamente por turno, las que contienen un _nivel sobre el suelo tienen el número de líneas restantes en la columna contada. Finalmente, las líneas ahora en blanco se eliminan. Editar: guardado 10 bytes gracias a la inspiración de @FryAmTheEggman.

Neil
fuente
Agradable, tenía una solución un poco más corta , pero no funcionaría en entradas grandes, ya que arruinaría mi capacidad para ordenarlas. ¡Ir columna por columna es una buena manera de evitar eso!
FryAmTheEggman
@FryAmTheEggman Cambié a su método de contar las líneas usando la _s, lo que tiene mucho más sentido que intentar usar la |s, ¡gracias!
Neil
@FryAmTheEggman No soluciona el problema, pero su etapa de clasificación puede simplificarse soltando la mirada atrás y ordenando $.%`, y la etapa final puede ser !`\d+. Y si cambia la primera etapa a una búsqueda anticipada, no necesita hacer un bucle.
Martin Ender
@FryAmTheEggman Y aquí hay una solución a su enfoque, pero termina en 46 bytes.
Martin Ender
@MartinEnder 45 tal vez? Pruébalo en línea!
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 la entrada como a (← guarda 16 bytes). -2 bytes a cambio de una salida menos legible gracias a @ OlivierGrégoire al cambiar a .String[] char[][]
print(l-j+",")println(l-j)

Explicación:

Pruébalo aquí.

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
fuente
Todavía no lo he probado, pero mi idea para este desafío fue ir de arriba a abajo y buscar _si se encuentra la tienda en la ubicación y luego hacer un pedido, ignorando la fila inferior, por supuesto. Podría ayudar a guardar bytes ...
TheLethalCoder
@TheLethalCoder Ese fue mi pensamiento inicial también, pero ¿dónde quieres almacenarlo / pedirlo? Originalmente pensé en un mapa, pero no están clasificados, por lo que necesitarás un LinkedMap. En mi opinión, todo sonó demasiado, pero si puedes encontrar una manera de hacerlo más corto que esto, no dudes en publicar una respuesta y haré +1. :)
Kevin Cruijssen
Solo logré reducirlo a 150 usando Linq, pero aún debería haber espacio para jugar al golf.
TheLethalCoder
En C # tenemos matrices multidimensionales como: en new[,]lugar de la matriz irregular que está utilizando como new[][]. Si tiene eso en Java, podría ahorrarle algunos bytes.
TheLethalCoder
1
System.out.println(l-j);se ve lo suficientemente lista para que me sobra 2 bytes. Además, en la explicación, olvidó cambiar length()a length(sin incidencia en el recuento de bytes, ya que es correcto en el envío).
Olivier Grégoire
3

Haskell 75 74 bytes

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

La entrada se espera como una lista de cadenas (rowwise).

siracusa
fuente
¿Por qué usar un punto y coma después de la importación, cuando una nueva línea tiene la misma longitud y es más idiomática?
Julio
@Jules: Sí, generalmente lo hago
siracusa
3

Ruby , 82 bytes

Toma en una lista de líneas.

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

Pruébalo en línea!

Tinta de valor
fuente
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)

Versión completa / formateada:

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

Pruébalo en línea!

Sin golf:

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, primer post. Cualquier ayuda para mejorarlo sería genial. Yo que puedo deshacerse de ese indexOfescrito dos veces. ¡Lo sabía! Jugué con la idea de cambiar los tipos en el mapa de Integer a Long, pero creo que es un callejón sin salida.


Sé que ya existe una solución Java 8 mucho mejor , pero eso toma char[][]como entrada, lo que creo que es más fácil de trabajar en este caso que String.

Miguel
fuente
1
No ha incluido las importaciones (son necesarias para las respuestas de Java). No use un Mappero un int[](¿tal vez inicializado en new int[99]?). No es necesario un espacio después String[] l: String[]lfunciona igual y es más corto. Usar en println(l.length-i-1)lugar de println(l.length-i-1+","). No inicialice j: Sólo tiene que escribir: ,j;. Si usa un int[]como se sugirió anteriormente, declare así: int m[]=new int[99],i=0,j;y elimine la declaración del for-loop.
Olivier Grégoire
1
OlivierGrégoire tiene razón sobre la importación requerida para Map. En cuanto a algunos de golf de su código actual con el mapa, se puede cambiar a lo siguiente: 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);}. No es necesario usar <Integer,Integer>el mapa cuando puedes enviar contenido int; a.length-1se usa dos veces, por lo que puede usar una variable para ello; Al poner todo dentro de los bucles for, puede deshacerse de todos los corchetes. Ah, y bienvenido a PPCG! :)
Kevin Cruijssen 01 de
@KevinCruijssen ¡Gracias! ¡Convertir el contenido de ese bucle for primero en un bucle for bodyless fue inspirador! Súper inteligente
Michael
@ Michael De nada. :) Ah, y si aún no lo has visto: los consejos para jugar golf en Java y los consejos para jugar golf en <todos los idiomas> pueden ser interesantes de leer. Me ayudó mucho cuando comencé (y todavía lo hace a veces).
Kevin Cruijssen 01 de
2

Mathematica, 48 47 39 bytes

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

Pruébalo en línea!

Functionque espera una matriz rectangular de caracteres. Toma Mostla matriz (todos menos la última fila), Reverses, luego toma el Transpose*, luego encuentra todos los Positions en los que _aparece el carácter. Las alturas relevantes son los Lastelementos de cada uno Position.

* es el 3carácter de uso privado de bytes U+F3C7que representa \[Transpose]en Mathematica. Tenga en cuenta que esto no funciona en matemáticas , por lo que solo usa el enlace TIOTranspose .

ngenisis
fuente
2

SOGL V0.12 , 9 bytes

I{ _WH╥?O

Pruébalo aquí!
Toma la entrada como una matriz de matrices de cadenas (caracteres).

Explicación:

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
fuente
2

JavaScript (ES6), 108 104 88 bytes

Guardado 16 bytes gracias 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 una matriz de cadenas

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
fuente
88 bytes aquí
Justin Mariner
Gracias @JustinMariner! Estoy entusiasmado con la inicialización de la variable como parámetros no utilizados Array.map, es un truco genial.
alexanderbird
¿Realmente necesita asignar el RegEx a una variable? Puede usarlo directamente en execy guardar algunos bytes.
Shaggy
En realidad, es necesario: el bucle while itera sobre cada coincidencia en una línea, y sin el estado interno de la expresión regular en la variable, coincidiría con la primera aparición cada vez y se repetirá infinitamente. Cada iteración crearía una nueva expresión regular, por execlo que coincidiría con la primera. En realidad, bloquea el editor de fragmentos de intercambio de pila si alinea la expresión regular. ¿A menos que me falte algo?
alexanderbird
@shaggy Olvidé etiquetarte en mi último comentario
alexanderbird
2

CJam, 15 14 bytes

1 byte guardado gracias a @BusinessCat

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

Este es un bloque que toma una matriz de cadenas en la pila y genera una matriz.

Explicación:

W%    e# Reverse
z     e# Zip
'_f#  e# Get the index of '_' in each element (-1 if not found)
{0>}, e# Filter where positive
Fruta Esolanging
fuente
Puede guardar 1 byte invirtiendo toda la matriz antes de transponer.
Business Cat
1

Pip , 18 17 bytes

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

_FI_@?'_MRVgZDs

Toma información de stdin. Pruébalo en línea!

Explicación

                 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
fuente
1

Pyth , 19 15 14 bytes

f>T0mx_d\_.tQd

¡Pruébelo en línea! La entrada es una lista de líneas.

Explicaciones

          .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
fuente
1

Perl 6 , 65 bytes

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

Pruébalo en línea!

  • m:exhaustive/^^(\N+)_([\N*\n]+:)/busca en la cadena de entrada todos los guiones bajos y devuelve un objeto de coincidencia para cada uno, donde los primeros paréntesis de captura contienen la parte anterior de la línea en la que se encuentra el guión bajo, y los segundos paréntesis de captura contienen el resto de la cadena. El resto de la cadena debe contener al menos una nueva línea, por lo que no contamos los guiones bajos a nivel del suelo. La :exhaustivebandera permite que estas coincidencias se superpongan.
  • .sort(*[0].chars)ordena estos objetos de coincidencia por el número de caracteres en la parte de la línea que precede a cada subrayado. Esto los ordena de izquierda a derecha.
  • .map(+*[1].comb("\n"))asigna cada objeto de coincidencia al número de caracteres de nueva línea en la parte de la cadena de entrada que sigue a cada subrayado, es decir, la altura. los\n es un carácter de nueva línea real, que guarda un byte.
Sean
fuente
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)." ";};

¡Analicemos esto! Nuestra entrada aquí es una 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
fuente
-1

Toma una cuerda multilínea. El crédito para la configuración (encabezado y pie de página) va a @GarethPW

Python 2 , 29 bytes

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

Pruébalo en línea!

Esto simplemente dividirá la matriz por nueva línea y devolverá longitud-1.

emtree
fuente
Esto no cumple todo el desafío. Debe devolver una matriz o lista con todas las alturas, no solo las más altas.
Scott Milner