CodeGolf - Ignora el ruido # 1

15

Instrucciones

Barry es un desarrollador de back-end no tan bueno a cargo de una pequeña API que debería brindarle información sobre las compras realizadas en la tienda de un cliente. Sin embargo, no ha hecho un gran trabajo y su jefe le dice que lo arregle en el lado del cliente. Lo ideal es recibir valores separados por comas, como 927,2,45,90la que corresponde a algo como item_id, item_amount, unit_price,total

En este primer rompecabezas solo nos preocupamos item_idy item_amountnecesitamos los otros campos para presentar el problema. Barry consigue a veces cosas mezcladas y los retornos de ruido como parte de la salida, también se equivoca en el orden, volver noise, noise, unit_price, total, item_id, item_amount.

Tu tarea

Es necesario almacenar en un mapa (o estructura similar) los pares de item_idy item_amountcon independencia de que Barry los devuelve correctamente o no e imprimir cada elemento en una nueva línea en el menor número de caracteres posibles. (El almacenamiento no es obligatorio, solo nos importa la salida)

Entrada de muestra (formatos mixtos correctos y desordenados)

103,2,50,100
106,1,900,900
459,40,150,300,67,2
4,20,30,6000

En otras palabras, la entrada será a,b,x,xo x,x,x,x,a,bdonde lo que nos importa es a& b. Debe proporcionar código suponiendo que tengamos una variable llamada G(o cualquier otro nombre) con todas las líneas de csv.

Salida de muestra

103,2
106,1
67,2 //This one was messy
4,20

Tolerancia

Hay un cierto margen de tolerancia cuando se trata de la respuesta. También se aceptarán respuestas en formatos similares pero que cumplan con los valores correctos. Formatos como [a,b], (a,b)o {a,b}son válidas, pero a,bse prefiere.

Aunque el primer acertijo tuvo una aceptación mixta debido a que fue fácil y rápido de resolver, también sentí que a algunas personas también les gustaba. Así que voy a seguir haciendo quickgolfs por ahora

Juan Cortés
fuente
¿La entrada será siempre del formato x,x,x,xy x,x,x,x,x,xdonde xdenota un número?
Spikatrix
Sí, la entrada seguirá uno de esos dos formatos, déjenme aclarar
Juan Cortés
¿Necesitamos enviar un programa o una función u otra cosa? Además, ¿de dónde se pueden tomar todas las entradas?
Spikatrix
3
golf rápido es esencialmente una etiqueta de dificultad. El consenso parece ser que no queremos esos , así que estoy eliminando esa etiqueta por ahora. Si desea que las etiquetas de dificultad se vuelvan a evaluar, haga una meta publicación para ello. Pero eso sería un esfuerzo de rediseño masivo, que creo que debería suceder de manera coordinada, en lugar de que los usuarios individuales creen nuevas etiquetas arbitrarias para ello.
Martin Ender
2
@CoolGuy No existe tal cosa. Se supone que no debes vencer a Pyth con C (porque nunca lo harás). La alegría está en vencer a otras presentaciones en el mismo idioma o idiomas de verbosidad similar. Si ya hubiera una presentación C de 50 bytes, podría entender que no se publicará (aunque incluso entonces, podría publicarla si el enfoque es diferente e interesante). Pero como no la hay, publique su respuesta. Estás bastante cerca de JavaScript y Python, por lo que definitivamente no es excesivamente largo para C.
Martin Ender

Respuestas:

8

Pyth, 10 bytes

FNG<.<N4 2

Pruébelo en línea: Pyth Compiler / Executor

(Los primeros 4 caracteres =G.Qleen todos los datos y los almacenan G)

Explicación

FNG              for row N in G:
    .<N4            cyclic leftshift by 4
   <     2          print the first two elements
Jakube
fuente
44
hermoso, ya estoy empezando a gustarme Pyth
Juan Cortés
3
@ JuanCortés: este podría ser un buen recurso si está buscando comenzar con Pyth.
Alex A.
7

Perl, 24

perl -pe's/(\d+,){4}|,\d+,\d+$//'

Ejemplo:

perl -pe's/(\d+,){4}|,\d+,\d+$//' <in
103,2
106,1
67,2
4,20
nutki
fuente
1
Esto sería 20 bytes en Retina . ;)
Martin Ender
7

Python 3, 123 76 72 62 bytes

Soy un recién llegado, tengo que comenzar en alguna parte ...

 for l in G:
  d=l.rstrip().split(',');x=[0,4][len(d)>5];print(d[x:x+2])

Con las sugerencias de xnor y DLosc (62 bytes):

for l in G:d=l.rstrip().split(',');print(d[4*(len(d)>5):][:2])
monguin
fuente
8
¡Bienvenido a Programming Puzzles y Code Golf! Como se trata de una competencia de código de golf , querrás que tu código sea lo más corto posible. Una cosa que podría hacer es disminuir la cantidad de espacio utilizado para las sangrías; un solo espacio es suficiente en Python. Esta publicación enumera consejos para jugar golf en Python y puede ser una buena referencia.
Alex A.
@ Alex, gracias. Estaba tratando de averiguar cuáles son las reglas exactas, esperaba poder ignorar algunos espacios en blanco, pero supongo que no.
monguin
No, las nuevas líneas y los espacios tienen en cuenta tu personaje.
Alex A.
De hecho, en este caso, ni siquiera necesita la nueva línea y la sangría. Las declaraciones de bloque como forpueden estar todas en la misma línea en Python, siempre que no haya otra declaración de bloque en el cuerpo.
DLosc
3
Un buen comienzo. Puede poner todo en la misma línea que forpara evitar sangrías. El condicional [0,4][...] se puede acortar a 4*(...) , usando el hecho de que los bools equivalen a 0/1. Además, si escribe d[x:x+2]como d[x:][:2], aunque sea un carácter más largo, le permite evitar guardar la expresión para xuna variable.
xnor
4

Sed, 32 bytes

s/,/=/4
s/.*=//
s/,/:/2
s/:.*//

Esto elimina todo hasta la cuarta coma si hay una. Luego elimina todo de la segunda coma (que puede haber sido previamente sexta).

¡Y hasta logré justificar correctamente!

Toby Speight
fuente
¿Alguna posibilidad de ver una demostración?
Juan Cortés
No estoy seguro de lo que quiere de una demostración: ejecuté la entrada de prueba suministrada y obtuve la salida requerida.
Toby Speight
4

Javascript, 44 bytes

Asumiendo entrada en variable G.

Editar: Me acabo de dar cuenta, esto se parece mucho a la solución perl de nutki.

alert(G.replace(/(\d+,){4}|,\d+,\d+$/gm,''))

Fragmento de demostración:

function run(){
    G = input.value;
    /* start solution */
    alert(G.replace(/(\d+,){4}|,\d+,\d+$/gm,''))
    /* end solution */
}
<textarea id="input" cols="25" rows="6">103,2,50,100
106,1,900,900
459,40,150,300,67,2
4,20,30,6000</textarea><br />
<button id="run" onclick="run();">Run</button>

nderscore
fuente
4

Scala, 68 bytes

G.map(_.split(",")).map(x=>println((x++x).slice(4,6).mkString(",")))

- MrBones

Scala, 46 70 bytes

Editar: imprimir el resultado

for{l<-G;r=l.split(",");x=(r++r).slice(4,6).mkString(",")}{println(x)}

Manifestación

Gabriel Jones
fuente
1
1 byte menos, usando el mapa en su lugarG.map{k=>val x=k.split(",");println((x++x).slice(4,6).mkString(","))}
Squidly
1
otro byte guardado al soltar el enlace:G.map(_.split(",")).map(x=>println((x++x).slice(4,6).mkString(",")))
Squidly
3

CJam, 18 15 14 bytes

r{',/4m<2<pr}h

Pruébelo en línea en el intérprete de CJam .

Cómo funciona

r      e# Read a whitespace separated token from STDIN.
{      e# Do-while loop:
  ',/  e#    Split at commas.
  4m<  e#    Rotate the resulting array 4 units to the left.
  2<   e#    Discard everything but the first 2 elements.
  p    e#    Print the array.
  r    e#    Read a whitespace separated token from STDIN.
}h     e# If the token is a nonempty string, repeat the loop.
Dennis
fuente
3

Shell POSIX, 30 bytes

Asumiendo POSIX sedy cutestán presentes:

sed 's/.*/&,&/'|cut -d, -f5,6

Duplica la línea, dejando los datos de interés listos para ser extraídos de los campos 5 y 6.

Toby Speight
fuente
3

Javascript, 117 112 99 95 84 76 71 bytes

for(r of G.split('\n'))s=r.split(','),console.log(s[t=s[4]?4:0],s[t+1])

JS Fiddle

RichieAHB
fuente
1
Por favor, publique un violín o una demostración
Juan Cortés
Puede quitar dos b reemplazando ;con ,en el cuerpo del bucle y, por lo tanto, quitando los frenos {y}
Juan Cortés
@ JuanCortés: gracias, no lo sabía. ¿Cuál es la teoría detrás de eso?
RichieAHB
Si no se agregan llaves, el cuerpo del bucle será la primera expresión después del paréntesis de cierre. Una expresión termina con un punto y coma. Separar las expresiones con comas las convierte en una especie de grupo de expresiones si puede, terminando la expresión después de ellas
Juan Cortés
1
Usando for ofusted puede guardar 3 bytes. Funciona en cualquier navegador moderno. for(r of q=G.split('\n'))s=r.split(','),console.log(s[t=s[4]?4:0],s[t+1])
edc65
2

Pip , 12 + 1 = 13 bytes

Utiliza el -lindicador, que proporciona la salida como listas de números separadas por espacios en cada línea. *

_@[4 5]Mg^',

Explicación:

  • La lista de números se espera en g. Como gnormalmente se inicializa a partir de los argumentos de la línea de comandos, también puede colocar la entrada allí para obtener los mismos resultados.
  • ^', divide (cada cadena en) la lista en comas.
  • M asigna una función a cada elemento en el resultado.
  • _@[4 5]define una función lambda. El argumento de la función está representado por _; @[4 5]devuelve una lista de sus elementos 4 y 5. Si la lista tiene seis elementos, estos serán los dos últimos. Si tiene cuatro, los índices se ajustan, por lo que el resultado son los dos primeros. (Ej "abcd"@4 == "abcd"@0 == "a".)
  • Ahora tenemos una lista de listas, como [[103 2] [106 1] [67 2]], que se imprime automáticamente al final del programa. La -lbandera se une a cada sublista en el espacio y luego a todo en la nueva línea, por lo que el resultado es el siguiente:
C: \> pip.py -le "_ @ [4 5] Mg ^ '," 103,2,50,100 106,1,900,900 459,40,150,300,67,2
103 2
106 1
67 2

* Actualmente. Puedo cambiar este comportamiento, pero todavía estoy planeando tener una bandera que haga lo mismo.

DLosc
fuente
1

Perl, 37

@c=/(\d+,\d+)/g;$_=@c>2?$c[2]:$c[0]

35caracteres +2para -py -l. No estoy seguro de si hay un enfoque en Perl que supere supere la solución de @ nutki , pero pensé que publicaría esta idea que tenía de todos modos.

Corre con:

cat input.txt | perl -ple'@c=/(\d+,\d+)/g;$_=@c>2?$c[2]:$c[0]'
hmatt1
fuente
1

bash, 54

while IFS=, read {a..f};do echo ${e:-$a},${f:-$b};done
izabera
fuente
0

C, 95 bytes

f(a,b,c,d){scanf("%d,%d,%*d,%*d,%d,%d",&a,&b,&c,&d)>2?printf("%d,%d",c,d):printf("%d,%d",a,b);}

El código es simple. Aquí está la versión sin golf:

f(a,b,c,d){                                    //Four int variables
    scanf("%d,%d,%*d,%*d,%d,%d",&a,&b,&c,&d)>2 //Scan input
        ?                                      //If scanf returned a value > 2
        printf("%d,%d",c,d)                    //Print last two values
        :                                      //else 
        printf("%d,%d",a,b);                   //Print first two values
}

Pruébalo aquí

Spikatrix
fuente
0

Ruby, 53

G.each_line{|x|g=x.split',';p[g[4]||g[0],g[5]||g[1]]}

o es bueno

MegaTom
fuente