Quelle est la hauteur des monolithes?

29

Voici un exemple d'entrée de monolithes . Il y en a 4 dans cet exemple.

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

Le premier monolithe mesure 4 unités de haut, le second 2, le troisième 3 et le dernier 1.

La tâche

Votre programme doit afficher les hauteurs des monolithes dans l'ordre de gauche à droite. Le format de sortie peut être dans n'importe quel type de liste ou de tableau.

Remarques

  • L'entrée peut être considérée comme n'importe quelle chaîne dimensionnelle, liste de chaînes ou liste de caractères.
  • C'est le , donc les octets les plus bas gagnent .
  • Vous devez supposer que les monolithes ont toujours la même largeur et sont toujours à au moins 1 _de l'autre.
  • Ils peuvent venir en toute hauteur et en toute quantité.

E / S

  _
 | |        _
 | |  _    | |
 | | | |   | |     _
_| |_| |___| |____| |_   >> [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
la source
2
Puis-je supposer que l'entrée est complétée à droite par des espaces?
isaacg
17
Votre [10]monolithe n'est [11]-il pas ?
TessellatingHeckler
Le non défini ne serait-il pas simplement un tableau vide?
Solomon Ucko
@isaacg oui, ce serait bien
Graviton
@SolomonUcko techniquement oui, mais pour le simplifier pour toutes les langues, j'ai décidé de ne pas les gérer.
Graviton

Réponses:

15

Gelée , (8?) 9 octets

Ỵ=”|Sḟ0m2

Un lien monadique acceptant une liste de caractères comme spécifié et renvoyant une liste d'entiers.

Remarque: 8 octets si une liste de chaînes, une par ligne, était vraiment destinée à être un format d'entrée autorisé - supprimez simplement le .

Essayez-le en ligne!

Comment?

Ỵ=”|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
la source
Je ne sais pas, mais ça va?
V. Courtois
1
@ V.Courtois Je ne vois pas pourquoi, car nous n'obtiendrons probablement jamais une telle entrée.
Erik the Outgolfer
D'accord, c'est parce que j'ai vu que d'autres réponses le prennent en compte
V. Courtois
2
@ V.Courtois l'entrée que vous avez suggérée ne correspond pas à la spécification, de même, l'ajout de soulignements dans le ciel, à mi-chemin des monolithes ou sous terre briserait probablement de nombreuses autres soumissions.
Jonathan Allan
Votant - voudriez-vous expliquer vos raisons?
Jonathan Allan
8

Gelée , 11 octets

ỴṚZi€”_ỊÐḟ’

Essayez-le en ligne!

Erik le Outgolfer
la source
Wow, tu as répondu aussi vite.
Graviton
@Graviton Hehe on devrait toujours avoir cette page ouverte quelque part. ;)
Erik the Outgolfer
14
Explication, s'il vous plaît!
Shaggy
6

JavaScript (ES6), 79 78 octets

-1 octet grâce à @Shaggy

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

Prend l'entrée comme un tableau de chaînes.

Extrait de test

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
la source
1
78 octets:a=>a.map((x,y)=>x.replace(/_/g,(_,z)=>c[z]=a.length-y-1),c=[])&&c.filter(n=>n)
Shaggy
@Shaggy Nice, je ne pensais absolument pas utiliser replace. Merci!
Justin Mariner
6

C ++, 171 169 octets

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

Essayez-le en ligne!

C ++ (GCC), 150 octets

Merci à @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<<" ";}}

Essayez-le en ligne!

Steadybox
la source
1
Si vous utilisez g ++, vous pouvez utiliser le non standard f(auto s)et spécifier qu'il faut n'importe quel conteneur à accès aléatoire de conteneurs à accès aléatoire de char.
aschepler
5

Dyalog APL, 29 octets

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

Courez avec ⎕IO←0.

Essayez-le en ligne!

Comment?

⌽⍵='_'- où est '_', les premières lignes en premier

×- multiplier par ...

(⍳≢⍵)- la plage de (indexé zéro)

↑¨ - pour chaque ligne, pad avec zéros par ...

(⌈/⍴¨⍵) - la longueur maximale

↑+/ - additionner les lignes zippées et aplatir

0~⍨ - supprime les zéros

Uriel
la source
5

PowerShell, 133 octets

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

On dirait que ce n'est pas très compétitif; il fait un regex remplacer pour transformer les tours en colonnes de 1, fait un tableau de 0 la longueur de la chaîne d'entrée, puis parcourt les lignes en additionnant les 1.

Tests prêts à fonctionner:

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


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

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


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

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

Japt , 11 octets

z ·mb'_ fw0

Testez-le en ligne!

Explication

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
la source
4

Rétine , 48 38 octets

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

Essayez-le en ligne! Le lien inclut le premier exemple. Explication: Une ligne est préfixée qui collectera les résultats. Comme chaque colonne est supprimée à plusieurs reprises à son tour, celles qui contiennent un _niveau supérieur au sol ont le nombre de lignes restantes dans la colonne compté. Enfin, les lignes désormais vides sont supprimées. Edit: enregistré 10 octets grâce à l'inspriation de @FryAmTheEggman.

Neil
la source
Bien, j'avais une solution légèrement plus courte , mais cela ne fonctionnerait pas sur de grandes entrées car cela gâcherait ma capacité à les trier. Aller colonne par colonne est un bon moyen d'éviter cela!
FryAmTheEggman
@FryAmTheEggman Je suis passé à votre méthode de comptage des lignes en utilisant le _s, ce qui est beaucoup plus logique que d'essayer d'utiliser le |s, merci!
Neil
@FryAmTheEggman Ne résout pas le problème, mais votre étape de tri peut être simplifiée en supprimant le lookbehind et le tri par $.%`, et l'étape finale peut l'être !`\d+. Et si vous changez la première étape en une anticipation, vous n'avez pas besoin de boucler.
Martin Ender
@FryAmTheEggman Et voici un correctif à votre approche, mais cela finit à 46 octets.
Martin Ender
@MartinEnder 45 peut-être? Essayez-le en ligne!
Neil
4

Java 8, 133 117 116 114 octets

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

Prend l'entrée comme un (← enregistre 16 octets). -2 octets en échange d'une sortie moins lisible grâce à @ OlivierGrégoire en passant à .String[] char[][]
print(l-j+",")println(l-j)

Explication:

Essayez-le ici.

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
la source
Je ne l'ai pas encore essayé, mais mon idée pour ce défi était d'aller de haut en bas et de rechercher _si le magasin trouvé était son emplacement, puis de le commander, en ignorant la rangée du bas bien sûr. Pourrait aider à économiser des octets ...
TheLethalCoder
@TheLethalCoder C'était aussi ma pensée initiale, mais où voulez-vous le stocker / le commander? J'ai pensé à l'origine à une carte, mais celles-ci ne sont pas triées, vous aurez donc besoin d'une LinkedMap. Dans ma tête, tout cela sonnait un peu trop d'octets, mais si vous pouvez trouver un moyen de l'accomplir plus court que cela, n'hésitez pas à poster une réponse et je vais le +1. :)
Kevin Cruijssen
Je n'ai réussi à le ramener à 150 qu'avec Linq, mais il devrait toujours y avoir de la place pour jouer au golf.
TheLethalCoder
En C #, nous avons des tableaux multidimensionnels comme: new[,]au lieu du tableau dentelé que vous utilisez en tant que new[][]. Si vous avez cela en Java, cela pourrait vous faire économiser quelques octets.
TheLethalCoder
1
System.out.println(l-j);semble assez listy pour moi d'épargner 2 octets. De plus, dans l'explication, vous avez oublié de changer length()en length(aucune incidence sur le nombre d'octets car il est correct dans la soumission).
Olivier Grégoire
3

Haskell, 75 74 octets

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

L'entrée est attendue sous la forme d'une liste de chaînes (dans le sens des lignes).

siracusa
la source
Pourquoi utiliser un point-virgule après l'importation, quand une nouvelle ligne est de la même longueur et plus idiomatique?
Jules
@Jules: Oui, d'habitude
siracusa
3

Rubis , 82 octets

Prend une liste de lignes.

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

Essayez-le en ligne!

Encre de valeur
la source
3

APL (Dyalog) , 14 octets

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

avec ⎕IO←0

Essayez-le en ligne!


Ce train de fonctions équivalent à {((⍳≢⍵)+.×('_'=⊖⍵))~0}

TwiNight
la source
3

C #, 150 144 137 octets

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)

Version complète / formatée:

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
la source
3

Java 8-229 octets 213 octets

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

Essayez-le en ligne!

Non 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, premier post. Toute aide pour l'améliorer serait formidable. Je sais que je peux m'en débarrasser indexOfdeux fois. Je le savais! J'ai joué avec l'idée de changer les types de la carte d'Integer en Long mais je pense que c'est une impasse.


Je sais qu'il existe déjà une bien meilleure solution Java 8 , mais cela prend char[][]comme entrée qui, je pense, est plus facile à travailler dans ce cas que String.

Michael
la source
1
Vous n'avez pas inclus les importations (elles sont requises pour les réponses Java). N'utilisez pas un Mapmais un int[](peut-être initialisé à new int[99]?). Plus besoin d'espace après String[] l: String[]lfonctionne de la même façon et est plus court. Utilisez println(l.length-i-1)au lieu de println(l.length-i-1+","). Ne pas initialize j: il suffit d' écrire: ,j;. Si vous utilisez un int[]comme suggéré précédemment, déclarez comme ceci: int m[]=new int[99],i=0,j;et supprimez la déclaration du for-loop.
Olivier Grégoire
1
OlivierGrégoire a en effet raison sur l'importation requise pour Map. Pour ce qui est un peu au golf de votre code actuel avec carte, vous pouvez le changer à ceci: 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);}. Pas besoin <Integer,Integer>de la carte quand vous pouvez lancer int; a.length-1est utilisé deux fois, vous pouvez donc utiliser une variable pour cela; en mettant tout à l'intérieur des boucles for, vous pouvez vous débarrasser de tous les supports. Oh, et bienvenue chez PPCG! :)
Kevin Cruijssen
@KevinCruijssen Merci! Convertir le contenu de cette première boucle pour une boucle sans corps pour était inspirant! Super intelligent.
Michael
@Michael Vous êtes les bienvenus. :) Oh, et si vous ne l'avez pas encore vu: des conseils pour jouer au golf en Java et des conseils pour jouer au golf dans <toutes les langues> peuvent être intéressants à lire. Cela m'a beaucoup aidé quand j'ai commencé (et le fait toujours parfois).
Kevin Cruijssen
3

MATL , 10 octets

ooYssqtO>)

L'entrée est une matrice de caractères rembourrée.

Essayez-le en ligne!

gobelet
la source
2

Mathematica, 48 47 39 octets

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

Essayez-le en ligne!

Functionqui attend un tableau rectangulaire de caractères. Prend Mostle tableau (tous sauf la dernière ligne), Reverses il, puis prend le Transpose*, puis trouve tous les Positions auxquels le_ caractère apparaît. Les hauteurs pertinentes sont les Lastéléments de chacune Position.

* est le 3caractère à usage privé d'octet U+F3C7qui représente \[Transpose]dans Mathematica. Notez que cela ne fonctionne pas en mathématiques , donc le lien TIO utilise simplement Transpose.

ngenisis
la source
2

SOGL V0.12 , 9 octets

I{ _WH╥?O

Essayez-le ici!
Prend l'entrée comme un tableau de tableaux de chaînes (caractères).

Explication:

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
la source
2

JavaScript (ES6), 108 104 88 octets

16 octets enregistrés grâce à @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)

Entrée prise comme un tableau de chaînes

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
la source
88 octets ici
Justin Mariner
Merci @JustinMariner! Je suis ravi de l'initialisation des variables en tant que paramètres inutilisés Array.map, c'est un truc cool.
alexanderbird
Avez-vous vraiment besoin d'affecter le RegEx à une variable? Vous pouvez l'utiliser directement dans le execet économiser quelques octets.
Shaggy
En fait, il est nécessaire - la boucle while itère sur chaque correspondance sur une ligne, et sans l'état interne de l'expression régulière dans la variable, elle correspondrait à la première occurrence à chaque fois et boucle infiniment. À chaque itération, il créerait une nouvelle expression régulière et execcorrespondrait donc à la première. Il bloque en fait l'éditeur d'extraits de code d'échange de pile si vous insérez l'expression régulière. A moins que je manque quelque chose?
alexanderbird
@shaggy J'ai oublié de vous taguer dans mon dernier commentaire
alexanderbird
2

CJam, 15 14 octets

1 octet enregistré grâce à @BusinessCat

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

Il s'agit d'un bloc qui prend un tableau de chaînes sur la pile et génère un tableau.

Explication:

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
la source
Vous pouvez enregistrer 1 octet en inversant l'ensemble du tableau avant la transposition.
Business Cat
1

Pip , 18 17 octets

15 octets de code, +2 pour les -rpdrapeaux.

_FI_@?'_MRVgZDs

Prend l'entrée de stdin. Essayez-le en ligne!

Explication

                 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
la source
1

Pyth , 19 15 14 octets

f>T0mx_d\_.tQd

Testez-le en ligne! L'entrée est une liste de lignes.

Explications

          .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
la source
1

Perl 6 , 65 octets

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

Essayez-le en ligne!

  • m:exhaustive/^^(\N+)_([\N*\n]+:)/recherche dans la chaîne d'entrée tous les traits de soulignement et renvoie un objet de correspondance pour chacun, où les premières parenthèses de capture contiennent la partie précédente de la ligne sur laquelle le trait de soulignement est trouvé et les secondes parenthèses de capture contiennent le reste de la chaîne. Le reste de la chaîne doit contenir au moins une nouvelle ligne, donc nous ne comptons pas les traits de soulignement au niveau du sol. Le :exhaustivedrapeau permet à ces matchs de se chevaucher.
  • .sort(*[0].chars)trie ces objets de correspondance par le nombre de caractères dans la partie de la ligne précédant chaque trait de soulignement. Cela les ordonne de gauche à droite.
  • .map(+*[1].comb("\n"))mappe chaque objet de correspondance au nombre de caractères de nouvelle ligne dans la partie de la chaîne d'entrée derrière chaque trait de soulignement - c'est-à-dire la hauteur. Le \nest un caractère de nouvelle ligne réel, économisant un octet.
Sean
la source
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)." ";};

Décomposons cela! Notre entrée ici est un tableau 2D de caractères.

$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
la source
-1

Prend une chaîne multiligne. Le crédit pour la configuration (en-tête et pied de page) va à @GarethPW

Python 2 , 29 octets

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

Essayez-le en ligne!

Cela divisera simplement le tableau par une nouvelle ligne et renverra la longueur 1.

emtree
la source
This doesn't fulfill the entire challenge. You must return an array or list with all the heights, not just the tallest.
Scott Milner