Contaremos estrellas

8

Su objetivo es tomar ASCII multilínea como

|  v  |
* * * *
 * * *

y tener una matriz que incluye todo lo que no es una estrella cambiada a una estrella (excepto los espacios [de cualquier ancho]) y la cantidad de estrellas que incluyó y la cantidad de estrellas que ahora incluye. Entonces la salida de mi ejemplo sería:

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

o

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

dependiendo de lo que haga tu lenguaje de código.

Este es un desafío de , por lo que gana los bytes más cortos.

Cilan
fuente
44
¿Puedes aclarar los formatos de entrada y salida, por favor? ¿Qué forma debe tener el código (programa, función)?
Heiko Oberdiek
1
@HeikoOberdiek Oh, sí. Pueden ser ambos, lo que sea más corto para ti.
Cilan
1
@TheWobbuffet ¿Qué pasa con los formatos de entrada / salida? ¿Puede ser simplemente una función que toma un argumento y devuelve una matriz, por ejemplo? ¿O tiene que imprimir la respuesta (y cuál sería el formato requerido para eso)?
14mRh4X0r

Respuestas:

3

GolfScript, 30 caracteres

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

Toma la entrada de stdin. Ejemplo ( prueba en línea ):

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

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

Python - 58 66 caracteres

Así que ... mi primer intento de Code Golf ...

Código:

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

Salida:

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

Variables:

  • i - cadena de entrada
  • p - patrón
  • o- salida - eliminado

Dependencias:

reMódulo de Python

Código completo:

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

Ediciones:

  • Agregado import rea la solución
  • Reemplazado o=con impresión
  • r'[/\S/g]'fue cambiado a r'\S' (gracias @ 14mRh4X0r)
martynas
fuente
¡Hola, bienvenido a PPCG! Esta es principalmente una buena respuesta, así que no tomes el resto de esta publicación personalmente: hay algunas cosas que están mal. Ha enumerado el remódulo como una dependencia, pero aún es necesario incluirlo en la respuesta y la puntuación. Su programa tampoco genera el resultado como se supone que debe hacerlo (sin embargo, dado que en realidad no usa la ovariable para nada, solo puede s/o=/print/perder tres). Aparte de eso, ¡esto se ve bien!
undergroundmonorail
1
En realidad, hay una pequeña cosa más. Su ivariable contiene en | v | * * * * * * *lugar de la entrada de prueba real (que incluye nuevas líneas). Dicho esto, su programa aún funciona si incluye las nuevas líneas, por lo que no es necesario cambiar su programa, solo la publicación. :)
undergroundmonorail
1
Hola @undergroundmonorail: gracias por los comentarios :) Actualizaré mi publicación ahora
martynas
1
No hay problema. Además, no he probado esto en absoluto, pero 14mRh4X0r del chat dice que r'[/\S/g]'podría reemplazarse r'\S'para guardar algunos caracteres.
undergroundmonorail
1
@undergroundmonorail y tiene razón :) gracias
martynas
2

Ruby 2.0, 53 caracteres

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

No estoy seguro de los formatos exactos de entrada / salida requeridos. Esto toma la entrada en STDIN y formatea la salida de la siguiente manera:

Entrada:

|  v  |
* * * *
 * * *

Salida:

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

JavaScript (ECMASCript 6) - 51 caracteres

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

Asume que la variable Acontiene la entrada ASCII multilínea. Para tomarlo del usuario, reemplace el Acon prompt()(+7 caracteres) o como una función (nuevamente +7 caracteres):

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

La salida es a la consola.

Prueba:

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

Salidas:

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

PHP ≥ 5.5, 84 69 63 bytes

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

No hay mucho que decir sobre esto. Como no hay una especificación sobre cómo manejar la entrada / salida, supongo que el almacenamiento variable. Espera la entrada en variable $sy almacena la matriz en variable $a. Lástima que esos nombres de funciones sean tan largos.

Martin Ender
fuente
1

Rebol, 84

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

Establezca tel texto así ...

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

y esto volvería ...

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

Versión sin golf con algunas 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
fuente
1

Groovy: 96 92 caracteres

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

Utiliza Groovy 2.2.1

Lecturas de STDIN. En mi humilde opinión, no es especialmente inteligente, pero bastante fácil de leer (dada su brevedad)

Michael Easter
fuente
0

En JavaScript / CoffeeScript - 66 caracteres

Al igual que el ejemplo de PHP, la longitud se debe a la longitud de los nombres de las funciones

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

Ejemplo de uso (CoffeeScript):

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

C # - 116

El camino más corto que puedo pensar es que devuelve una matriz ...

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

Perl, 52 bytes

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

Toma entrada de entrada estándar, imprime en salida estándar.

Suponiendo que el formato de salida como describió en su pregunta, se podría acortar un poco si se permitiera un formato de salida diferente.

14mRh4X0r
fuente
0

Javascript - 50 caracteres

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

Prueba

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(':')

Salida

["****** * ***** * **** ****** *****", "******** ***** *** ****** **** ** ***** **", "*** ***** * ***** * **** ******* ****"]
Spedwards
fuente
Esto realmente no cumple con las especificaciones. Mira aquí para ver un ejemplo.
tomsmeding
0

AWK, (demasiado largo)

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

No soy un awkmaestro, así que estoy seguro de que se puede mejorar. La conclusión es que me divertí mucho escribiéndola. La lucha vino con la forma de preservar la newlinesinformación, pero no ponerla , 7,10]en una nueva línea. Ese poco de lógica ( NR>1{z=z "\n" $0} NR==1{z=z $0}) me costó muchos personajes. Me interesaría ver otros awkenfoques en ese frente.

No proporcioné el archivo al final del script, pero obviamente el uso sería awk '{<code>}' ascii.txt, donde ascii.txtcontiene la "entrada" de varias líneas.

Salida

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

Java, 199 bytes

Golfizado:

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

Sin golf:

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

Correr en línea .

Hopper Hunter
fuente