CodeGolf: ignora il rumore n. 1


15

Istruzioni

Barry è uno sviluppatore di back-end non molto buono responsabile di una piccola API che dovrebbe fornirti informazioni sugli acquisti effettuati nel negozio di un cliente. Tuttavia, non ha fatto un ottimo lavoro e il tuo capo ti dice invece di sistemarlo sul lato client. Idealmente si dovrebbe ricevere valori separati da virgole, come 927,2,45,90che corrispondono a qualcosa di simile item_id, item_amount, unit_price,total

In questo primo enigma ci preoccupiamo solo item_ide item_amountabbiamo bisogno degli altri campi per presentare il problema. Barry a volte ottiene le cose mischiate e ritorna rumore come parte della produzione, si ottiene anche il torto ordine, di ritorno noise, noise, unit_price, total, item_id, item_amount.

Il tuo compito

È necessario memorizzare in una mappa (o struttura simile) le coppie di item_ide item_amountindipendentemente dal fatto che Barry le ritorni correttamente o meno e stampare ogni elemento in una nuova riga nel minor numero possibile di caratteri. (La memorizzazione non è obbligatoria, ci preoccupiamo solo dell'output)

Input di esempio (formati misti corretti e disordinati)

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

In altre parole, l'input sarà a,b,x,xo x,x,x,x,a,bdove ci interessa ae b. Devi fornire il codice supponendo che abbiamo una variabile chiamata G(o qualsiasi altro nome) con tutte le righe di CSV.

Uscita campione

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

Tolleranza

C'è un certo margine di tolleranza quando si tratta della risposta. Saranno accettate anche risposte in formati simili ma aderendo ai valori corretti. Formati come [a,b], (a,b)o {a,b}sono validi, ma a,bè preferito.

Sebbene il primo enigma avesse avuto un'accettazione mista a causa del fatto che era facile e veloce da risolvere, ho anche sentito che anche a qualcuno piaceva. Quindi per ora continuerò a creare quickgolfs


L'input avrà sempre il formato x,x,x,xe x,x,x,x,x,xdove xindica un numero?
Spikatrix,

Sì, l'input seguirà uno di questi due formati, vorrei chiarire
Juan Cortés,

Dobbiamo inviare un programma o una funzione o qualcos'altro? Inoltre, da dove possono essere presi tutti gli input?
Spikatrix,

3
quick-golf è essenzialmente un tag di difficoltà. Il consenso sembra essere che non li vogliamo , quindi sto rimuovendo quel tag per ora. Se desideri rivalutare i tag di difficoltà, crea un meta post. Ma sarebbe un enorme sforzo di ricodifica, che penso dovrebbe avvenire in modo coordinato, piuttosto che singoli utenti che creano nuovi tag arbitrari per esso.
Martin Ender,

2
@CoolGuy Non esiste nulla del genere. Non dovresti battere Pyth con C (perché non lo farai mai). La gioia è nel battere altri argomenti nella stessa lingua o lingue di simile verbosità. Se esistesse già un invio di 50 byte C, potrei capire di non pubblicare (anche se anche allora, potrei pubblicarlo se l'approccio è diverso e interessante). Ma poiché non c'è, per favore pubblica la tua risposta. Sei abbastanza vicino a JavaScript e Python, quindi sicuramente non è eccessivamente lungo per C.
Martin Ender,

Risposte:


8

Pyth, 10 byte

FNG<.<N4 2

Provalo online: Pyth Compiler / Executor

(I primi 4 caratteri =G.Qleggono tutti i dati e li memorizzano in G)

Spiegazione

FNG              for row N in G:
    .<N4            cyclic leftshift by 4
   <     2          print the first two elements

4
bellissimo, sto già iniziando ad apprezzare Pyth
Juan Cortés,

3
@ JuanCortés: questa potrebbe essere una buona risorsa se stai cercando di iniziare con Pyth.
Alex A.,

7

Perl, 24

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

Esempio:

perl -pe's/(\d+,){4}|,\d+,\d+$//' <in
103,2
106,1
67,2
4,20

1
Questo sarebbe 20 byte in Retina . ;)
Martin Ender,

7

Python 3, 123 76 72 62 byte

Sono un nuovo arrivato, devo iniziare da qualche parte ...

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

Con i suggerimenti di xnor e DLosc (62 byte):

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

8
Benvenuto in Puzzle di programmazione e Code Golf! Poiché si tratta di una competizione di code-golf , ti consigliamo di rendere il tuo codice il più breve possibile. Una cosa che potresti fare è ridurre la quantità di spazio utilizzato per i rientri; un unico spazio è sufficiente in Python. Questo post elenca suggerimenti per giocare a golf in Python e può essere un buon riferimento.
Alex A.

@Alex, grazie - Stavo cercando di capire quali fossero le regole esatte, speravo di poter ignorare alcuni spazi bianchi, ma credo di no.
Monguin,

No, le nuove linee e gli spazi incidono entrambi sul conteggio dei personaggi.
Alex A.

In effetti, in questo caso, non hai nemmeno bisogno della nuova riga e del rientro. Le istruzioni di blocco come forpossono essere tutte sulla stessa riga in Python, purché non ci sia un'altra istruzione di blocco nel corpo.
DLosc,

3
Un buon inizio. Puoi mettere tutto sulla stessa riga del forper evitare rientri. Il condizionale [0,4][...] può essere abbreviato in 4*(...) , usando il fatto che il bool è uguale a 0/1. Inoltre, se scrivi d[x:x+2]come d[x:][:2], sebbene un carattere più lungo, ti consente di evitare di salvare l'espressione xin una variabile.
xnor

4

Sed, 32 byte

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

Questo elimina tutto fino alla 4 ° virgola se ce n'è una. Quindi elimina tutto dalla seconda virgola (che potrebbe essere stata in precedenza 6).

E sono persino riuscito a giustificare a destra!


Qualche possibilità di vedere una demo?
Juan Cortés,

Non sono sicuro di cosa desideri da una demo: ho eseguito l'input di test fornito e ho ottenuto l'output richiesto.
Toby Speight,

4

Javascript, 44 byte

Supponendo che l'input sia variabile G.

Modifica: ho appena realizzato che assomiglia molto alla soluzione perl di nutki.

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

Demo dello snippet:

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>


4

Scala, 68 byte

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

- MrBones

Scala, 46 70 byte

Modifica: stampa il risultato

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

dimostrazione


1
1 byte in meno, usando invece mapG.map{k=>val x=k.split(",");println((x++x).slice(4,6).mkString(","))}
Squidly

1
un altro byte salvato facendo cadere la rilegatura:G.map(_.split(",")).map(x=>println((x++x).slice(4,6).mkString(",")))
Squidly,

3

CJam, 18 15 14 byte

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

Provalo online nell'interprete CJam .

Come funziona

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.

3

Shell POSIX, 30 byte

Supponendo POSIX sede cutsono presenti:

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

Duplica la linea, lasciando i dati di interesse pronti per essere estratti dai campi 5 e 6.


3

Javascript, 117 112 99 95 84 76 71 byte

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

JS Fiddle


1
Per favore, pubblica un violino o una demo
Juan Cortés,

Puoi rimuovere due b sostituendoli ;con ,nel corpo del cappio e quindi rimuovendo le parentesi graffe {e}
Juan Cortés,

@ JuanCortés - grazie, non lo sapevo. Qual è la teoria dietro questo?
RichieAHB,

Se non vengono aggiunte parentesi graffe, il corpo del loop sarà la prima espressione dopo la parentesi di chiusura. Un'espressione termina con un punto e virgola. Separare le espressioni con virgole le rende un po 'come un gruppo di espressioni , se possibile, terminando l' espressione dopo di loro
Juan Cortés,

1
Usando for ofpuoi salvare 3 byte. Funziona con qualsiasi browser moderno. for(r of q=G.split('\n'))s=r.split(','),console.log(s[t=s[4]?4:0],s[t+1])
edc65,

2

seme , 12 + 1 = 13 byte

Utilizza il -lflag, che fornisce l'output come elenchi di numeri separati da spazi su ogni riga. *

_@[4 5]Mg^',

Spiegazione:

  • L'elenco dei numeri è previsto in g. Dag normalmente è inizializzato dagli argomenti della riga di comando, puoi anche inserire l'input lì per gli stessi risultati.
  • ^', divide (ogni stringa in) l'elenco tra virgole.
  • M associa una funzione a ciascun elemento nel risultato.
  • _@[4 5]definisce una funzione lambda. L'argomento della funzione è rappresentato da _; @[4 5]restituisce un elenco dei suoi 4o e 5o elemento. Se l'elenco ha sei elementi, questi saranno gli ultimi due. Se ne ha quattro, gli indici si avvolgono e quindi il risultato sono i primi due. (Es "abcd"@4 == "abcd"@0 == "a".)
  • Ora abbiamo un elenco di elenchi, come [[103 2] [106 1] [67 2]], che viene stampato automaticamente alla fine del programma. Il -lflag unisce ogni sottoelenco sullo spazio e quindi l'intera cosa su newline, quindi il risultato è il seguente:
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

* Attualmente. Potrei cambiare questo comportamento, ma sto ancora pensando di avere qualche bandiera che fa la stessa cosa.


1

Perl, 37

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

35personaggi +2per -pe -l. Non sono sicuro che ci sia un approccio in Perl che potrebbe battere @ nutki's soluzione di , ma ho pensato di pubblicare questa idea che avevo comunque.

Corri con:

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

1

bash, 54

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

0

C, 95 byte

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

Il codice è semplice Ecco la versione ungolfed:

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
}

Provalo qui


0

Ruby, 53

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

o va bene.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.