Minigolf de 9 hoyos: manipulación de texto [cerrado]

26

Mini golf de 9 hoyos: Descripción

  • 9 (en su mayoría bastante fáciles) desafíos de golf de código de dificultad variable
  • Sanciones por usar el mismo idioma más de una vez
  • Todos los desafíos sobre un tema específico (este tema: Manipulación de texto)
  • La entrada y salida pueden ser razonables (es decir, STDIN y STDOUT, leer / escribir en un archivo, argumento de función y valor de retorno, etc.) pero NO deben estar codificadas en el programa
  • Muy inspirado por 9 Hole Challenge y Text Mechanic

Agujeros

  1. Bolsa de golf con código

    Tome dos cadenas como entrada.
    Genere el recuento de caracteres de la primera cadena, mientras ignora cualquier ocurrencia de cualquier carácter en la segunda cadena.
    Ejemplo: f("foobarbaz", "ao")=>5
  2. Un pre-texto para jugar al golf

    Tome dos cadenas como entrada.
    Salida de la primera cadena, con cada línea prefijada con la segunda.
    Ejemplo: f("foo\nbar\nbaz", "a")=>"a foo\na bar\na baz"
  3. Guerra de pestañas vs espacios

    Tome una cadena s, un número ny un booleano b(especificado como quiera) como entrada.
    Si bes verdadero, salida scon cada pestaña convertida en nespacios.
    De lo contrario, envíe el scon cada nespacio convertido a pestañas.
    Ejemplo: f("if (x) {\n\tdoStuff();\n}", 4, true)=> "if (x) {\n[sp][sp][sp][sp]doStuff();\n}"( [sp]significa espacio)
  4. Pilares del golf

    Tome una cadena s, un número ny otro número mcomo entrada.
    Salida sen columnas de nlíneas cada una y mcaracteres por columna.
    También tenga relleno de un espacio entre las columnas.
    Ejemplo: f("this is some placeholder text, foo bar baz...", 3, 5)=>

    this  aceho  foo 
    is so lder  bar b
    me pl text, az...
    
  5. Cartas amistosas

    Tome una cadena sy un número ncomo entrada.
    Muestra el grupo de nletras más común en s.
    Si hay un empate, envíe uno o todos ellos.
    Ejemplo: f("abcdeabcfghiabc", 3)=>"abc"
  6. Letras de huevos revueltos para el desayuno

    Tome una cadena como entrada.
    Imprima la cadena con todas sus palabras codificadas (orden de letras aleatorizado) excepto sus primeras y últimas letras.
    Para simplificar, suponga que la entrada será una lista de "palabras", separadas por espacios (es decir @$&_():;" foo bar, en , @$&_():;"se considera una "palabra").
    Ejemplo: f("this is a sentence that will be scrambled")=>"tihs is a stcneene that wlil be sclamrbed"
  7. ASCIFIAR

    Tome una cadena como entrada.
    Si la cadena solo contiene números y espacios, reemplace los números con sus respectivos caracteres ASCII (eliminando los espacios).
    De lo contrario, haga lo contrario (caracteres a números).
    Ejemplo: f("ASCIIfy challenge")=>"65 83 67 73 73 102 121 32 99 104 97 108 108 101 110 103 101"
    Ejemplo 2: f("65 83 67 73 73 102 121 32 99 104 97 108 108 101 110 103 101")=>"ASCIIfy challenge"
  8. Transformación mini-mini-markdown

    Tome una cadena como entrada.
    Salida de la cadena convertida con mini-markdown, como se usa en los comentarios en Stack Exchange.
    Esta es una versión aún mini-er: sólo tiene que manejar **bold**, *italics*y `code`.
    No necesita manejar anidamiento no válido, como **foo *bar** baz*. También suponga que cuando vea un delimitador ( *o `), siempre significará formatear (es decir, te**st**ing=> te<b>st</b>ingy foo* bar *baz=> foo<i> bar </i>baz).
    Ejemplo: f("**foo** *bar **baz*** `qux`")=>"<b>foo</b> <i>bar <b>baz</b></i> <code>qux</code>"
  9. Solo los mejores personajes

    Tome una cadena s, un número ny una cadena rcomo entrada.
    Muestra el ncarácter th de cada palabra en s. (0 indexado, las palabras están separadas por espacios).
    Si la longitud de la palabra es menor que n, use rpara esa palabra en su lugar.
    Ejemplo: f("this is a test sentence foo bar baz", 2, "-")=>"i--snorz"

Tanteo

Su puntaje es la suma de los recuentos de caracteres de sus programas. Por cada idioma repetido, multiplique por 110%. Por ejemplo, si tiene tres soluciones Ruby, y el recuento total de caracteres de todas sus soluciones es 1000, su puntaje es 1000 * 1.1 * 1.1 = 1210. Redondee hacia abajo si tiene un puntaje no entero.

¡Buena suerte!

Pomo de la puerta
fuente
1
Challenge 8 toca uno de los aspectos menos especificados de Markdown, y el que es más difícil de hacer realmente bien. Necesita una explicación clara de cómo manejar las ambigüedades y un buen conjunto de pruebas. Vea Emphasis.text desde la suite mdtest.
Peter Taylor
@PeterTaylor Bueno, _no importa ya que especifiqué no incluirlo. He editado para aclarar algunos de los otros.
Pomo de la puerta
¿Qué hay de **foo***bar**baz*?
Peter Taylor
1
El desafío 6 es idéntico a este .
daniero
44
Estoy votando para cerrar esta pregunta como fuera de tema porque es un desafío de varias partes con interacción insuficiente entre las partes
pppery

Respuestas:

12

Puntuación: 382 * 1.1 2 = 462

Idiomas propensos a cambiar.

1. APL, 8 4

Gracias @marinus por eliminar 4 caracteres.

f←⍴~

Llamado con las cadenas como los argumentos izquierdo y derecho, por ejemplo.

      'foobarbaz' f 'ao'
5

2. Ruby, 35 31

Gracias @DoorknobofSnow por eliminar 4 caracteres.

f=->s,r{s.gsub(/(?<=^)/,r+' ')}

3. Python, 48

f=lambda s,n,b:s.replace(*['\t',' '*n][::2*b-1])

4. GolfScript, 20

{@//zip{' '*}%n*}:f;

Asume que los argumentos están en la pila. Prueba en línea

5. J, 50

f=:({~[:(i.>./)+/"1@=@(}.~0-1{$))@|:@([$~],1+[:$[)

Llamado con la cadena como el argumento izquierdo y el número como el derecho, por ejemplo.

   'abcdeabcfghiabc' f 3
abc

6. Ruby, 61

f=->s{s.gsub(/(?<!^| )[^ ]+(?!$| )/){[*$&.chars].shuffle*''}}

7. GolfScript, 39 35 34

{[.10,' '*-{{}/]' '*}{~]''+}if}:f;

Nuevamente, se supone que el argumento está en la pila. Prueba en línea

8. Perl, 98

sub f{$_=@_[0];s!\*\*(.+?)\*\*!<b>$1</b>!g;s!\*(.+?)\*!<i>$1</i>!g;s!`(.+?)`!<code>$1</code>!g;$_}

9. Haskell, 36

f s n r=[(x++cycle r)!!n|x<-words s]
Volatilidad
fuente
¡Excelente! Puede guardar algunos caracteres en Ruby utilizando un proc ( f=->s,r{...}) en lugar de una función. Sin embargo, me niego a votar hasta que se complete: P
Pomo de la puerta
@DoorknobofSnow ah, gracias. No es tan competente con Ruby :)
Volatilidad
Hurra, eres el primero en terminar :-D +1
Pomo de la puerta
Tengo la impresión de que todas las funciones deben devolver una cadena, por lo que para el número 4 creo que tendrá que usar un carácter más.
Peter Taylor el
@PeterTaylor fijo :)
Volatilidad
4

Python - 697 × 1.1 9 ≈ 1644

Vaya, seguro que amo las lambdas

Nota : 3 y 5 se copiaron descaradamente de la respuesta de Volatility , ya que no pude encontrar una mejor alternativa. Además, esto se hizo solo por diversión .

f=lambda a,b:sum([x not in b for x in a])        # 1, 41 chars
f=lambda a,b:b+' '+a.replace('\n','\n'+b+' ')    # 2, 43 chars
f=lambda s,n,b:s.replace(*['\t',' '*n][::b*2-1]) # 3, 47 chars
f=lambda s,n,m:'\n'.join([' '.join([s[x:x+m]for x in range(y*m,len(s),m*n)])for y in range(n)])
                                                 # 4, 94 chars
f=lambda s,n:max([s[x:x+n]for x in range(len(s)+1-n)],key=s.count)
                                                 # 5, 66 chars
import random;f=lambda s:' '.join([''.join(sorted(y,key=lambda*x:random.random()))for y in s.split()])
                                                 # 6, 102 chars
f=lambda s:s.replace(' ','').isdigit()and ''.join(map(chr,map(int,s.split())))or ' '.join(map(str,map(ord,s)))
                                                 # 7, 110 chars
import re;f=lambda s:re.sub('`(.*?)`','<code>\\1</code>',re.sub(r'\*(.*?)\*','<i>\\1</i>',re.sub(r'\*\*(.*?)\*\*','<b>\\1</b>',s)))
                                                 # 8, 128 chars
f=lambda s,n,r:''.join([len(x)>n and x[n]or r for x in s.split()])
                                                 # 9, 66 chars

EDITAR : Gracias a Volatility por los consejos.

Oberon
fuente
Puede usar expresiones generadoras para la mayoría de ellas, lo que le ahorrará un montón de caracteres. Además, para 1. no hay necesidad de usar int, ya que los booleanos son una subclase de ellos, y para 7. all([...])se pueden acortar ax.replace(' ','').isdigit()
Volatilidad
La segunda respuesta no prefijará la primera línea de a.
daniero
1

Puntuación 513 * 1.1 5 = 826 

Recibió una gran paliza por la pena del mismo idioma. Resolví la mayoría de estos en Ruby solo para terminarlos lo más rápido que pude. Podría cambiar algunos idiomas más tarde. Se agregó un pequeño resumen / explicación en cada respuesta.

1: Python (46)

f=lambda a,b:len([x for x in a if not x in b])

Primero, una respuesta más corta en Ruby 2.0 (30) que da más penalización y una puntuación general más alta:

p (gets.chars-gets.chars).size

2: Ruby 1.9+ (37)

Devuelve cada línea de sprefijo con t:

f=->s,t{s.split(?\n).map{|x|t+x}*?\n}

3: Ruby 1.9+ (48)

Devuelve scon pestañas reemplazadas por nespacios o viceversa, dependiendo de b:

f=->s,n,b{r=[" "*n,?\t];b||r.reverse!;s.gsub *r}

4: Ruby 1.9+ (95)

Alguien me disparó.

f=->s,n,m{[*s.chars.each_slice(m).map{|w|w*''}.each_slice(s.size/m/n)].transpose.map{|w|w*' '}}

5: Ruby 1.9+ (58)

Devuelve la ejecución más común de ncaracteres en s:

f=->s,n{(a=s.chars.each_slice(n)).max_by{|v|a.count v}*''}

6: J (47)

Revuelve el texto de alguna manera; Descaradamente robado literalmente de marinus :

''[1!:2&4('\w(\w+)\w';,1)({~?~@#)rxapply 1!:1[3

7: Rubí (57 + 1)

Imprime la entrada ASCIIfied o des-ASCIIfied. Corre con el -pinterruptor.

~/\d/?gsub(/\d+\s*/){$&.to_i.chr}:gsub(/./){"#{$&.ord} "}

8: Sed (87)

Imprime la entrada convertida de (mini) rebaja a HTML:

s:\*\*([^*]+)\*\*:<b>\1</b>:g;
s:\*([^*]+)\*:<i>\1</i>:g;
s:`([^`]+)`:<code>\1</code>:g

9 rubíes 1.9+ (37)

Devuelve una cadena de ncaracteres th de cada primera palabra s, o r:

f=->s,n,r{s.split.map{|w|w[n]||r}*''}
daniero
fuente
¿No la salida 8 <b>test** **test2</b>de **test** **test2**?
Pomo de la puerta
@DoorknobofSnow yes it would;) Solucionado (sed no tiene repetición no codiciosa).
daniero
¿Para qué daría **foo *bar* baz**?
Volatilidad
@Volatility Vaya. No leí la pregunta correctamente, pensé que no habría ningún anidamiento, pero decía que no habría anidamiento inválido . No estoy seguro de que me moleste en arreglarlo ahora.
daniero
¿Para el primer -operador de código ruby funciona con el enumerador?
Siva
1

Trabajo en progreso

1. Java - 66

int f(String s,String b){for(char c:b)s=s.replace(b,"");return s;}

2. Java - 64

String f(String i,String r){return i.replaceAll("(?m)^",r+" ");}

3. Python - 58

def f(s,n,b):t=" "*n;a=t,'\t';print s.replace(a[b],a[b^1])

4. Python - 84

def f(s,n,m):
 a=['']*n;c=0
 while s:a[c%n]+=s[:m]+" ";s=s[m:];c+=1
 for i in a:print i

5)

6)

7. Befunge 98 - 9

&,5j3.~@#

8)

9)

Justin
fuente
En el primer hoyo debería estar for(char c:b.toCharArray())y replace(c+"","");y return s.length();(o algo así) para que funcione.
bobbel