Estaremos contando estrelas

8

Seu objetivo é usar ASCII multilinha como

|  v  |
* * * *
 * * *

e tenha uma matriz que inclua tudo o que não é uma estrela alterada para uma estrela (exceto espaços com qualquer largura) e o número de estrelas incluídas e o número de estrelas que agora inclui. Portanto, a saída do meu exemplo seria:

['*  *  *
* * * *
 * * *',7,10]

ou

["*  *  *\n* * * *\n * * *", 7, 10]

dependendo do que sua linguagem de código faz.

Este é um desafio de , portanto os bytes mais curtos vencem!

Cilan
fonte
4
Você pode esclarecer os formatos de entrada e saída, por favor? Qual formulário o código deve ter (programa, função)?
Heiko Oberdiek
1
@HeikoOberdiek Oh, sim. Pode ser ambos, o que for mais curto para você.
Cilan
1
@TheWobbuffet E os formatos de entrada / saída? Pode ser apenas uma função que pega um argumento e retorna uma matriz, por exemplo? Ou precisa imprimir a resposta (e qual seria o formato necessário para isso)?
14mRh4X0r

Respostas:

3

GolfScript, 30 caracteres

.{.'
 '?)\42if}%.{@'*'/,(}2*]`

Retorna a entrada de stdin. Exemplo ( teste online ):

> |  v  |
> * * * *
>  * * *

["*  *  *\n* * * *\n * * *\n" 7 10]
Howard
fonte
3

Python - 58 66 caracteres

Sooo ... minha primeira tentativa de Code Golf ...

Código:

import re;p=re.sub(r'\S','*',i);print[p,i.count('*'),p.count('*')]

Resultado:

['*  *  *\n* * * *\n * * *', 7, 10]

Variáveis:

  • i - string de entrada
  • p - padronizar
  • o- saída - removida

Dependências:

reMódulo Python

Código completo:

import re
i = '|  v  |\n* * * *\n * * *'    
p = re.sub(r'\S','*', i)
print [p, i.count('*'), p.count('*')]

Editar% s:

  • Adicionado import reà solução
  • Substituído o=por impressão
  • r'[/\S/g]'foi alterado para r'\S' (obrigado @ 14mRh4X0r)
martynas
fonte
Ei, bem-vindo ao PPCG! Esta é principalmente uma boa resposta, portanto, não leve o resto deste post para o lado pessoal: existem algumas coisas erradas. Você listou o remódulo como uma dependência, mas ainda é necessário incluí-lo na resposta e na pontuação. Seu programa também não gera o resultado como deveria (no entanto, como você não usa a ovariável para nada, pode s/o=/print/perder apenas três). Fora isso, isso parece bom!
Undergroundmonorail
1
Na verdade, há uma pequena outra coisa. Sua ivariável contém em | v | * * * * * * *vez da entrada de teste real (que inclui novas linhas). Dito isto, seu programa ainda funcionará se você incluir as novas linhas, para que seu programa não precise ser alterado, apenas a postagem. :)
undergroundmonorail
1
Oi @undergroundmonorail - Obrigado pelo feedback :) eu vou atualizar meu post agora
Martynas
1
Sem problemas. Além disso, ainda não testei isso, mas o 14mRh4X0r do bate-papo diz que r'[/\S/g]'pode ser substituído por r'\S'para salvar alguns caracteres.
Undergroundmonorail
1
@undergroundmonorail E ele está certo :) Obrigado
Martynas
2

Ruby 2.0, 53 caracteres

p [r=gets($n).gsub(/\S/,?*),$_.count(?*),r.count(?*)]

Não tenho certeza dos formatos exatos de entrada / saída necessários. Isso recebe entrada no STDIN e formata a saída da seguinte maneira:

Entrada:

|  v  |
* * * *
 * * *

Resultado:

["*  *  *\n* * * *\n * * *", 7, 10]
Paul Prestidge
fonte
2

JavaScript (ECMASCript 6) - 51 caracteres

i=j=0,[A.replace(/\S/g,x=>(j++,i+=x=='*','*')),i,j]

Assume que a variável Acontém a entrada ASCII com várias linhas. Para retirá-lo do usuário, substitua Apor prompt()(+7 caracteres) ou como uma função (novamente +7 caracteres):

f=A=>(i=j=0,[A.replace(/\S/g,y=>(j++,i+=y=='*','*')),i,j])

A saída é para o console.

Teste:

A='|  v  |\n* * * *\n * * *'
i=j=0,[A.replace(/\S/g,x=>(j++,i+=x=='*','*')),i,j]

Saídas:

["*  *  *
* * * *
 * * *", 7, 10]
MT0
fonte
1

PHP ≥ 5,5, 84 69 63 bytes

$a=[preg_replace('/\S/','*',$s,-1,$n),substr_count($s,'*'),$n];

Não há muito a dizer sobre isso. Como não há especificação de como lidar com entrada / saída, estou assumindo o armazenamento variável. Espera a entrada na variável $se armazena a matriz na variável $a. Pena que esses nomes de função sejam tão longos.

Martin Ender
fonte
1

Rebol, 84

c: s: 0 parse t[any["*"(++ s)|" "|"^/"| m: skip(change m"*" ++ c)]]reduce[t s s + c]

Defina tcomo o texto assim ....

t: {|  v  |
* * * *
 * * *}

e isso retornaria ...

["*  *  *^/* * * *^/ * * *" 7 10]

Versão ungolfed com algumas notas:

c: s: 0    ;; "s" is star count before change, "c" is count of chars changed to stars

; so using single-char ANY rule to parse each character in "t"

parse t [
    any [                              ;; so "t" is made up of ANY...
        "*"     (++ s) |               ;; "*" (if so then increment s)
        " "            |               ;; or a space
        "^/"           |               ;; or a newline
        m: skip (change m "*"  ++ c)   ;; or anything else (skip) 
                                       ;;   (and so change to "*" & increment c)
    ]
]

reduce [t s s + c]      ;; return array with amended text (t) and counts
draegtun
fonte
1

Groovy: 96 92 caracteres

s=System.in.text
t=s.replaceAll(/[^\*\s]/,/\*/)
println "['$t',${s.count"*"},${t.count"*"}]"

Usa o Groovy 2.2.1

Lê de STDIN. IMHO, não especialmente inteligente, mas bastante fácil de ler (dada a sua brevidade)

Michael Easter
fonte
0

Em JavaScript / CoffeeScript - 66 caracteres

Como no exemplo do PHP, o comprimento é devido ao comprimento dos nomes das funções

[x.replace(/\S/g,"*"),x.split("*").length-1,x.match(/\S/g).length]

Exemplo de uso (CoffeeScript):

((x="|  v  |\n* * * *\n * * *")->[x.replace(/\S/g,'*'),x.split('*').length-1,x.match(/\S/g).length])()
Zachary Boyd
fonte
1
3-char mais curto:[x.replace(r=/\S/g,s='*'),x.split(s).length-1,x.match(r).length]
Michael M.
0

C # - 116

A maneira mais curta que consigo pensar em retornar uma matriz ..

object[]R(string a){var o=Regex.Replace(a,"\\S", "*");return new object[]{o,a.Count(x=>x=='*'),o.Count(x=>x=='*')};}
mnsr
fonte
0

Perl, 52 bytes

$_=join'',<>;printf'["%s",%s,%s]',$_,tr/*//,s/\S/*/g

Leva a entrada da entrada padrão, imprime na saída padrão.

Supondo que o formato de saída como você descreveu na sua pergunta, poderia ser um pouco menor se um formato de saída diferente fosse permitido.

14mRh4X0r
fonte
0

Javascript - 50 caracteres

i.replace(/\S/g,'*').replace(/\n/g,':').split(':')

Teste

Entrada

var i = 'Lately I been, I been losing sleep\nDreaming about the things that we could be\nBut baby, I been, I been prayin\' hard';
i.replace(/\S/g,'*').replace(/\n/g,':').split(':')

Resultado

["****** * ***** * **** ****** *****", "******** ***** *** ****** **** ** ***** **", "*** ***** * ***** * **** ******* ****"]
Spedwards
fonte
Isso realmente não atende à especificação. Veja aqui um exemplo.
tomsmeding
0

AWK, (muito longo)

awk '{y+=gsub(/[^* ]/, "*"); x+=NF}NR>1{z=z "\n" $0} NR==1{z=z $0} END{print "[\x27"z (x-y) "," x "\x27]"}'

Como não sou awkmestre, tenho certeza de que isso pode ser melhorado. O ponto principal é que eu me diverti escrevendo! A luta surgiu com a forma de preservar os dados newlinesde entrada, mas não colocar , 7,10]em uma nova linha. Essa parte da lógica ( NR>1{z=z "\n" $0} NR==1{z=z $0}) me custou muitos caracteres. Eu estaria interessado em ver outras awkabordagens nessa frente.

Não forneci o arquivo no final do script, mas obviamente o uso seria awk '{<code>}' ascii.txt, onde ascii.txtcontém a "entrada" de várias linhas.

Resultado

 ['* * *
 * * * *
 * * *',7,10]
Origineil
fonte
0

Java, 199 bytes

Golfe:

class C{public static void main(String[]a){String i=a[0],o=i.replaceAll("\\S","*");System.out.println("["+o+","+g(i)+","+g(o)+"]");}static int g(String x){return x.replaceAll("[^\\*]","").length();}}

Sem golfe:

public class CountingStars {

    public static void main(String[] args) {
        String input = args[0];
        //replace all non-white-space char with *
        String output = input.replaceAll("\\S", "*");
        System.out.println("[" + output + "," + getStars(input) + "," + getStars(output) +"]");
    }

    static int getStars(String x) {
        //replace all non-* characters with empty-string and return length
        return x.replaceAll("[^\\*]", "").length();
    }
}

Execute online .

Hopper Hunter
fonte