CodeGolf - Ignorez le bruit # 1

15

Instructions

Barry n'est pas un bon développeur backend en charge d'une petite API qui devrait vous donner des informations sur les achats effectués dans la boutique d'un client. Cependant, il n'a pas fait un excellent travail et votre patron vous dit de le réparer côté client à la place. Idéalement , vous devriez recevoir des valeurs séparées par des virgules, comme 927,2,45,90qui correspondent à quelque chose comme item_id, item_amount, unit_price,total

Dans ce premier puzzle que nous sur les soins que item_idet , item_amountmais nous avons besoin des autres champs en place pour présenter le problème. Barry a parfois des choses mélangées et retourne le bruit dans le cadre de la sortie, il obtient également le mauvais de l' ordre, le retour noise, noise, unit_price, total, item_id, item_amount.

Ta tâche

Vous devez stocker dans une carte (ou une structure similaire) les paires de item_idet item_amountindépendamment du fait que Barry les renvoie correctement ou non et imprimer chaque élément dans une nouvelle ligne avec le moins de caractères possible. (Le stockage n'est pas obligatoire, nous nous soucions juste de la sortie)

Exemple d'entrée (formats mixtes corrects et salissants)

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

En d'autres termes, l'entrée sera soit a,b,x,xou x,x,x,x,a,boù ce qui nous intéresse est a& b. Vous devez fournir du code en supposant que nous avons une variable appelée G(ou tout autre nom) avec toutes les lignes de csv.

Exemple de sortie

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

Tolérance

Il existe une certaine marge de tolérance en ce qui concerne la réponse. Les réponses dans des formats similaires mais respectant les valeurs correctes seront également acceptées. Formats comme [a,b], (a,b)ou {a,b}sont valides, maisa,b on préfère.

Bien que le premier casse-tête ait rencontré une acceptation mitigée en raison du fait qu'il était facile et rapide à résoudre, j'ai également estimé que certaines personnes l'appréciaient également. Je vais donc continuer à faire des quickgolfs pour l'instant

Juan Cortés
la source
L'entrée sera-t-elle toujours au format x,x,x,xet x,x,x,x,x,xxdésigne un nombre?
Spikatrix
Oui, la saisie suivra l'un de ces deux formats, permettez-moi de clarifier
Juan Cortés
Avons-nous besoin de soumettre un programme ou une fonction ou autre chose? De plus, d'où toutes les entrées peuvent-elles être extraites?
Spikatrix
3
quick-golf est essentiellement un tag de difficulté. Le consensus semble être que nous n'en voulons pas , donc je retire cette balise pour l'instant. Si vous souhaitez que les balises de difficulté soient réévaluées, veuillez en faire une méta-publication. Mais ce serait un effort de redéfinition massif, qui, je pense, devrait se produire de manière coordonnée, plutôt que des utilisateurs individuels créant de nouvelles balises arbitraires pour cela.
Martin Ender
2
@CoolGuy Il n'y a rien de tel. Vous n'êtes pas censé battre Pyth avec C (car vous ne le ferez jamais). La joie est de battre d'autres soumissions dans la même langue ou des langues de verbosité similaire. S'il y avait déjà une soumission de 50 octets C, je pourrais comprendre de ne pas poster (bien que même dans ce cas, je pourrais la poster si l'approche est différente et intéressante). Mais comme il n'y en a pas, veuillez poster votre réponse. Vous êtes assez proche de JavaScript et Python, donc ce n'est certainement pas excessivement long pour C.
Martin Ender

Réponses:

8

Pyth, 10 octets

FNG<.<N4 2

Essayez-le en ligne: Pyth Compiler / Executor

(Les 4 premiers caractères =G.Qlisent toutes les données et les stockent G)

Explication

FNG              for row N in G:
    .<N4            cyclic leftshift by 4
   <     2          print the first two elements
Jakube
la source
4
magnifique, je commence déjà à aimer Pyth
Juan Cortés
3
@ JuanCortés: Cela pourrait être une bonne ressource si vous cherchez à démarrer avec Pyth.
Alex A.
7

Perl, 24

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

Exemple:

perl -pe's/(\d+,){4}|,\d+,\d+$//' <in
103,2
106,1
67,2
4,20
nutki
la source
1
Ce serait 20 octets en rétine . ;)
Martin Ender
7

Python 3, 123 76 72 62 octets

Je suis un nouveau venu, je dois commencer quelque part ...

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

Avec les suggestions de xnor et DLosc (62 octets):

for l in G:d=l.rstrip().split(',');print(d[4*(len(d)>5):][:2])
monguin
la source
8
Bienvenue dans Programmation d'énigmes et Code Golf! Comme il s'agit d'une compétition de golf par code , vous voudrez rendre votre code aussi court que possible. Une chose que vous pourriez faire est de réduire la quantité d'espace utilisée pour les retraits; un seul espace suffit en Python. Cet article répertorie des conseils pour jouer au golf en Python et peut être une bonne référence.
Alex A.
@Alex, merci - J'essayais de comprendre quelles sont les règles exactes, j'espérais pouvoir ignorer certains espaces, mais je suppose que non.
monguin
Non, les nouvelles lignes et les espaces jouent tous deux un rôle dans le nombre de personnages.
Alex A.
En fait, dans ce cas, vous n'avez même pas besoin de la nouvelle ligne et du retrait. Les instructions de bloc comme forpeuvent être toutes sur la même ligne en Python, tant qu'il n'y a pas d'autre instruction de bloc dans le corps.
DLosc
3
Un bon début. Vous pouvez tout mettre sur la même ligne que forpour éviter les retraits. Le conditionnel [0,4][...] peut être raccourci en 4*(...) utilisant le fait que bools est égal à 0/1. De plus, si vous écrivez en d[x:x+2]tant que d[x:][:2], même si un caractère est plus long, vous évitez d'enregistrer l'expression pour xdans une variable.
xnor
4

Sed, 32 octets

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

Cela supprime tout jusqu'à la 4ème virgule s'il y en a un. Ensuite, il supprime tout de la 2e virgule (qui était peut-être auparavant la 6e).

Et j'ai même réussi à justifier à droite!

Toby Speight
la source
Une chance de voir une démo?
Juan Cortés
Je ne sais pas ce que vous voulez d'une démo - j'ai exécuté votre entrée de test fournie et obtenu la sortie requise.
Toby Speight
4

Javascript, 44 octets

En supposant l'entrée en variable G.

Edit: Je viens de réaliser, cela ressemble beaucoup à la solution Perl de Nutki.

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

Démo d'extrait:

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
la source
4

Scala, 68 octets

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

- MrBones

Scala, 46 70 octets

Modifier: imprimer le résultat

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

Démo

Gabriel Jones
la source
1
1 octet de moins, en utilisant la carte à la placeG.map{k=>val x=k.split(",");println((x++x).slice(4,6).mkString(","))}
Squidly
1
un autre octet enregistré en G.map(_.split(",")).map(x=>println((x++x).slice(4,6).mkString(",")))
supprimant
3

CJam, 18 15 14 octets

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

Essayez-le en ligne dans l' interpréteur CJam .

Comment ça fonctionne

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
la source
3

Shell POSIX, 30 octets

En supposant que POSIX sedet cutsont présents:

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

Duplique la ligne, laissant les données d'intérêt prêtes à être extraites des champs 5 et 6.

Toby Speight
la source
3

Javascript, 117 112 99 95 84 76 71 octets

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

JS Fiddle

RichieAHB
la source
1
Veuillez poster un violon ou une démo
Juan Cortés
Vous pouvez retirer deux b en les remplaçant ;par ,dans le corps de la boucle et donc retirer les bretelles {et}
Juan Cortés
@ JuanCortés - merci, je ne le savais pas. Quelle est la théorie derrière ça?
RichieAHB
Si aucun accolade n'est ajouté, le corps de la boucle sera la première expression après la parenthèse fermante. Une expression se termine par un point-virgule. Séparer les expressions par des virgules les rend un peu comme un groupe d' expression si vous le pouvez, mettant fin à l' expression après elles
Juan Cortés
1
En utilisant, for ofvous pouvez économiser 3 octets. Cela fonctionne dans n'importe quel navigateur moderne. 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 octets

Utilise l' -lindicateur, qui donne la sortie sous forme de listes de nombres séparés par des espaces sur chaque ligne. *

_@[4 5]Mg^',

Explication:

  • La liste des numéros est attendue dans g. Comme il gest normalement initialisé à partir des arguments de ligne de commande, vous pouvez également y placer l'entrée pour les mêmes résultats.
  • ^', divise (chaque chaîne) la liste par des virgules.
  • M mappe une fonction à chaque élément du résultat.
  • _@[4 5]définit une fonction lambda. L'argument de la fonction est représenté par _; @[4 5]renvoie une liste de ses 4e et 5e éléments. Si la liste comporte six éléments, ce seront les deux derniers. S'il en a quatre, les indices s'enroulent et le résultat est donc les deux premiers. (Par exemple "abcd"@4 == "abcd"@0 == "a".)
  • Nous avons maintenant une liste de listes, comme [[103 2] [106 1] [67 2]], qui est imprimée automatiquement à la fin du programme. Le -ldrapeau rejoint chaque sous-liste sur l'espace, puis le tout sur la nouvelle ligne, le résultat est donc le suivant:
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

* Actuellement. Je peux changer ce comportement, mais je prévois toujours d'avoir un indicateur qui fait la même chose.

DLosc
la source
1

Perl, 37

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

35caractères +2pour -pet -l. Je ne sais pas s'il y a une approche en Perl qui battrait la solution de @ nutki , mais j'ai pensé que je publierais cette idée que j'avais quand même.

Courir avec:

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

bash, 54

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

C, 95 octets

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

Le code est simple. Voici la version non golfée:

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
}

Testez-le ici

Spikatrix
la source
0

Rubis, 53

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

ou est bon.

MegaTom
la source