CodeGolf - Ignore o barulho # 1

15

Instruções

Barry é um desenvolvedor de back-end não tão bom encarregado de uma pequena API que deve fornecer informações sobre compras feitas na loja de um cliente. No entanto, ele não fez um ótimo trabalho e seu chefe pede que você o conserte no lado do cliente. Idealmente, você deve receber valores separados por vírgulas, como 927,2,45,90o que corresponde a algo como item_id, item_amount, unit_price,total

Neste primeiro quebra-cabeça, nos preocupamos apenas item_ide item_amountprecisamos dos outros campos para apresentar o problema. Barry às vezes fica coisas misturadas e retornos de ruído como parte da saída, ele também recebe o errado ordem, retornando noise, noise, unit_price, total, item_id, item_amount.

Sua tarefa

Você precisa armazenar em um mapa (ou estrutura semelhante) os pares de item_ide, item_amountindependentemente de Barry os retornar corretamente ou não, e imprimir cada elemento em uma nova linha no menor número de caracteres possível. (O armazenamento não é obrigatório, apenas nos preocupamos com a saída)

Entrada de amostra (formatos corretos e confusos misturados)

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

Em outras palavras, a entrada será a,b,x,xou x,x,x,x,a,bonde o que nos importa é a& b. Você precisa fornecer o código assumindo que temos uma variável chamada G(ou qualquer outro nome) com todas as linhas de csv.

Saída de amostra

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

Tolerância

Existe uma certa margem de tolerância quando se trata da resposta. Respostas em formatos semelhantes, mas aderentes aos valores corretos, também serão aceitas. Formatos como [a,b], (a,b)ou {a,b}são válidos, mas a,bé o preferido.

Embora o primeiro quebra-cabeça tivesse aceitação mista devido ao fato de ser fácil e rápido de resolver, também senti que algumas pessoas gostaram disso. Então, eu vou continuar fazendo quickgolfs por enquanto

Juan Cortés
fonte
A entrada será sempre do formato x,x,x,xe x,x,x,x,x,xonde xdenota um número?
Spikatrix
Sim, a entrada vai seguir um desses dois formatos, deixe-me esclarecer
Juan Cortés
Precisamos enviar um programa, uma função ou outra coisa? Além disso, de onde todas as entradas podem ser obtidas?
Spikatrix
3
quick-golf é essencialmente uma marca de dificuldade. Parece haver consenso de que não queremos isso , então estou removendo essa tag por enquanto. Se você deseja que as tags de dificuldade sejam reavaliadas, crie uma meta post para isso. Mas isso seria um esforço massivo de reformulação, que acho que deveria acontecer de maneira coordenada, em vez de usuários individuais criarem novas tags arbitrárias para ele.
Martin Ender
2
@CoolGuy Não existe tal coisa. Você não deve vencer Pyth com C (porque você nunca vai). A alegria é superar outras submissões no mesmo idioma ou idiomas de verbosidade similar. Se já havia um envio de 50 bytes C, eu poderia entender que não estava postando (embora, mesmo assim, eu possa publicá-lo se a abordagem for diferente e interessante). Mas como não há, poste sua resposta. Você é bastante perto de JavaScript e Python, por isso definitivamente não é excessivamente longo para C.
Martin Ender

Respostas:

8

Pitão, 10 bytes

FNG<.<N4 2

Experimente on-line: Compilador / Executor Pyth

(Os 4 primeiros caracteres =G.Qlê todos os dados e os armazena G)

Explicação

FNG              for row N in G:
    .<N4            cyclic leftshift by 4
   <     2          print the first two elements
Jakube
fonte
4
lindo, já estou começando a gostar de Pyth #
Juan Cortés
3
@ JuanCortés: Esse pode ser um bom recurso se você deseja começar o Pyth.
Alex A.
7

Perl, 24

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

Exemplo:

perl -pe's/(\d+,){4}|,\d+,\d+$//' <in
103,2
106,1
67,2
4,20
nutki
fonte
1
Isso seria 20 bytes na Retina . ;)
Martin Ender
7

Python 3, 123 76 72 62 bytes

Eu sou um novato, tenho que começar em algum lugar ...

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

Com as sugestões do xnor e do DLosc (62 bytes):

for l in G:d=l.rstrip().split(',');print(d[4*(len(d)>5):][:2])
pinguim
fonte
8
Bem-vindo à Programação de Puzzles e Code Golf! Como se trata de uma competição de golfe por código , convém tornar seu código o mais curto possível. Uma coisa que você pode fazer é diminuir a quantidade de espaço usado para os recuos; um único espaço é suficiente em Python. Este post lista dicas para jogar golfe em Python e pode ser uma boa referência.
18715 Alex A.
@ Alex, obrigado - eu estava tentando descobrir quais são as regras exatas, eu esperava poder ignorar algum espaço em branco, mas acho que não.
Monguin
Não, novas linhas e espaços influenciam a contagem de caracteres.
18715 Alex A.
De fato, nesse caso, você nem precisa da nova linha e do recuo. Instruções de bloco como forpodem estar todas na mesma linha no Python, desde que não haja outra instrução de bloco no corpo.
DLosc
3
Um bom começo. Você pode colocar tudo na mesma linha que a forpara evitar recuos. A condicional [0,4][...] pode ser reduzida para 4*(...) , usando o fato de que os bools são iguais a 0/1. Além disso, se você escrever d[x:x+2]como d[x:][:2], embora com mais um caractere, evite salvar a expressão em xuma variável.
Xnor
4

Sed, 32 bytes

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

Isso exclui tudo até a quarta vírgula, se houver um. Em seguida, ele exclui tudo da 2ª vírgula (que pode ter sido anteriormente a 6ª).

E eu até consegui justificar direito!

Toby Speight
fonte
Alguma chance de ver uma demo?
Juan Cortés
Não tenho certeza do que você deseja de uma demonstração - executei a entrada de teste fornecida e obtive a saída necessária.
Toby Speight
4

Javascript, 44 bytes

Assumindo entrada na variável G.

Edit: Acabei de perceber, isso parece muito com a solução perl do nutki.

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

Demonstração de trechos:

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
fonte
4

Scala, 68 bytes

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

- MrBones

Scala, 46 70 bytes

Editar: Imprima o resultado

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

Demo

Gabriel Jones
fonte
1
1 byte a menos, usando o mapaG.map{k=>val x=k.split(",");println((x++x).slice(4,6).mkString(","))}
Squidly
1
outro byte salvo ao soltar a encadernação:G.map(_.split(",")).map(x=>println((x++x).slice(4,6).mkString(",")))
Squidly
3

CJam, 18 15 14 bytes

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

Experimente online no intérprete CJam .

Como 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
fonte
3

Shell POSIX, 30 bytes

Supondo POSIX sede cutestá presente:

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

Duplica a linha, deixando os dados de interesse prontos para serem extraídos dos campos 5 e 6.

Toby Speight
fonte
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
fonte
1
Por favor, poste um violino, ou demo
Juan Cortés
Você pode remover dois b substituindo ;com ,no corpo do loop e, portanto, removendo as chaves {e}
Juan Cortés
@ JuanCortés - obrigado, não sabia disso. Qual é a teoria por trás disso?
RichieAHB
Se nenhum colchete for adicionado, o corpo do loop será a primeira expressão após o parêntese de fechamento. Uma expressão termina com um ponto e vírgula. Separando expressões com vírgulas torna-los como uma espécie de expressão grupo se você pode, terminando a expressão depois deles
Juan Cortés
1
Usando for ofvocê pode salvar 3 bytes. Funciona em qualquer 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

Usa o -lsinalizador, que fornece a saída como listas de números separadas por espaço em cada linha. *

_@[4 5]Mg^',

Explicação:

  • A lista de números é esperada em g. Desde ag normalmente é inicializado a partir dos argumentos da linha de comando, você também pode inserir a entrada para os mesmos resultados.
  • ^', divide (cada string) a lista por vírgulas.
  • M mapeia uma função para cada elemento no resultado.
  • _@[4 5]define uma função lambda. O argumento para a função é representado por _; @[4 5]retorna uma lista de seus 4º e 5º elementos. Se a lista tiver seis elementos, esses serão os dois últimos. Se tiver quatro, os índices serão contornados e, portanto, o resultado serão os dois primeiros. (Por exemplo "abcd"@4 == "abcd"@0 == "a")
  • Agora temos uma lista de listas, como [[103 2] [106 1] [67 2]], que é impressa automaticamente no final do programa. O -lsinalizador une cada sub-lista no espaço e depois a coisa toda na nova linha; portanto, o resultado é o seguinte:
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

* Atualmente. Posso mudar esse comportamento, mas ainda estou planejando ter alguma bandeira que faça a mesma coisa.

DLosc
fonte
1

Perl, 37

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

35caracteres +2para -pe -l. Não tenho certeza se existe uma abordagem no Perl que superaria a solução da @ nutki , mas imaginei que postaria essa ideia que tinha de qualquer maneira.

Correr com:

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

festança, 54

while IFS=, read {a..f};do echo ${e:-$a},${f:-$b};done
izabera
fonte
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);}

O código é simples. Aqui está a versão não destruída:

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
}

Teste aqui

Spikatrix
fonte
0

Ruby, 53

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

ou é bom.

MegaTom
fonte