CodeGolf - Ignoriere das Rauschen # 1


15

Anleitung

Barry ist ein nicht so guter Backend-Entwickler, der für eine kleine API zuständig ist, die Ihnen Informationen zu Einkäufen im Geschäft eines Kunden geben soll. Er hat jedoch keine großartige Arbeit geleistet, und Ihr Chef weist Sie an, die Fehler auf der Clientseite zu beheben. Im Idealfall sollten Sie kommagetrennte Werte wie erhalten 927,2,45,90entsprechen , welche so etwas wie item_id, item_amount, unit_price,total

In diesem ersten Puzzle kümmern wir uns nur um item_idund item_amountaber wir brauchen die anderen Felder, um das Problem zu präsentieren. Barry manchmal bekommt Dinge vermischen und kehrt Lärm als Teil der Ausgabe, er bekommt auch die Reihenfolge falsch, Rückkehr noise, noise, unit_price, total, item_id, item_amount.

Deine Aufgabe

Sie müssen die Paare von item_idund item_amountunabhängig davon, ob Barry sie korrekt zurückgibt oder nicht , in einer Karte (oder einer ähnlichen Struktur) speichern und jedes Element in einer neuen Zeile mit der geringstmöglichen Anzahl von Zeichen drucken. (Speicherung ist nicht obligatorisch, wir kümmern uns nur um die Ausgabe)

Probeneingabe (gemischte korrekte und chaotische Formate)

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

Mit anderen Worten, die Eingabe erfolgt entweder über & a,b,x,xoder über x,x,x,x,a,bdas, worum es uns geht . Sie müssen Code bereitstellen, vorausgesetzt, wir haben eine Variable namens (oder einen anderen Namen) mit allen Zeilen von csv.abG

Beispielausgabe

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

Toleranz

Bei der Beantwortung gibt es einen gewissen Spielraum für Toleranz. Antworten in ähnlichen Formaten, aber unter Einhaltung der korrekten Werte, werden ebenfalls akzeptiert. Formate wie [a,b], (a,b)oder {a,b}gültig sind, aber a,bbevorzugt.

Obwohl das erste Rätsel aufgrund der Tatsache, dass es einfach und schnell zu lösen war, gemischte Akzeptanz hatte, hatte ich auch das Gefühl, dass einige Leute das auch mochten. Also mache ich jetzt erstmal weiter Quickgolf


Wird die Eingabe immer vom Format sein x,x,x,xund x,x,x,x,x,xwo xbezeichnet man eine Zahl?
Spikatrix

Ja, die Eingabe erfolgt in einem dieser beiden Formate, lassen Sie mich das klarstellen
Juan Cortés,

Müssen wir ein Programm oder eine Funktion oder etwas anderes einreichen? Woher können alle Eingaben genommen werden?
Spikatrix

3
Quick-Golf ist im Wesentlichen ein Schwierigkeitsgrad. Konsens scheint zu sein, dass wir diese nicht wollen , also entferne ich diesen Tag fürs Erste. Wenn Sie möchten, dass Schwierigkeits-Tags erneut bewertet werden, erstellen Sie einen Meta-Post dafür. Aber das wäre ein massiver Umbau, der meiner Meinung nach koordiniert erfolgen sollte, anstatt dass einzelne Benutzer willkürlich neue Tags dafür erstellen.
Martin Ender

2
@CoolGuy So etwas gibt es nicht. Du sollst Pyth nicht mit C schlagen (weil du es niemals tun wirst). Die Freude besteht darin, andere Einsendungen in derselben Sprache oder in Sprachen mit ähnlicher Ausführlichkeit zu schlagen. Wenn es bereits eine 50-Byte-C-Übermittlung gab, konnte ich verstehen, dass ich nicht postete (obwohl ich es auch dann posten könnte, wenn der Ansatz anders und interessant ist). Aber da dies nicht der Fall ist, posten Sie bitte Ihre Antwort. Sie stehen JavaScript und Python ziemlich nahe, so dass es für C. definitiv nicht allzu lange dauert.
Martin Ender

Antworten:


8

Pyth, 10 Bytes

FNG<.<N4 2

Probieren Sie es online aus: Pyth Compiler / Executor

(Die ersten 4 Zeichen =G.Qlesen alle Daten und speichern sie in G)

Erläuterung

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

4
schön, ich mag Pyth schon
Juan Cortés

3
@ JuanCortés: Dies ist möglicherweise eine gute Ressource, wenn Sie mit Pyth beginnen möchten.
Alex A.

7

Perl, 24

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

Beispiel:

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

1
Dies wären 20 Bytes in der Retina . ;)
Martin Ender

7

Python 3, 123 76 72 62 Bytes

Ich bin ein Neuling, muss irgendwo anfangen ...

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

Mit den Vorschlägen von xnor und DLosc (62 Bytes):

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

8
Willkommen bei Programming Puzzles und Code Golf! Da dies ein Code-Golf- Wettbewerb ist, sollten Sie Ihren Code so kurz wie möglich halten. Eine Möglichkeit besteht darin, den für Einzüge verwendeten Speicherplatz zu verringern. In Python genügt ein einzelnes Leerzeichen. Dieser Beitrag enthält Tipps zum Golfen in Python und ist möglicherweise eine gute Referenz.
Alex A.

@Alex, danke - Ich habe versucht herauszufinden, wie die genauen Regeln lauten. Ich hatte gehofft, ich könnte ein Leerzeichen ignorieren, aber ich denke nicht.
Monguin,

Nein, Zeilenumbrüche und Leerzeichen tragen beide zur Anzahl deiner Charaktere bei.
Alex A.

In diesem Fall benötigen Sie nicht einmal die Zeilenumbrüche und Einrückungen. Blockanweisungen wie forkönnen in Python alle in einer Zeile stehen, solange der Body keine weitere Blockanweisung enthält.
DLosc

3
Ein guter Anfang. Sie können setzen alles auf der gleichen Linie wie die forEinzüge zu vermeiden. Die Bedingung [0,4][...] kann 4*(...) mit der Tatsache, dass bools gleich 0/1 ist, auf abgekürzt werden. Wenn Sie d[x:x+2]als schreiben d[x:][:2], obwohl ein Zeichen länger, können Sie außerdem vermeiden, den Ausdruck für xeine Variable zu speichern .
xnor

4

Sed, 32 Bytes

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

Dies löscht alles bis zum 4. Komma, falls es eines gibt. Dann löscht es alles aus dem 2. Komma (das vorher vielleicht das 6. gewesen ist).

Und ich habe es sogar geschafft, richtig zu rechtfertigen!


Hast du eine Chance, eine Demo zu sehen?
Juan Cortés

Ich bin mir nicht sicher, was Sie von einer Demo erwarten - ich habe Ihre Testeingabe ausgeführt und die erforderliche Ausgabe erhalten.
Toby Speight

4

Javascript, 44 Bytes

Angenommen, Eingabe in Variable G.

Edit: Mir ist gerade aufgefallen, dass das sehr nach Nutki's Perl-Lösung aussieht.

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

Snippet-Demo:

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 Bytes

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

- MrBones

Scala, 46-70 Bytes

Bearbeiten: Drucken Sie das Ergebnis aus

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

Demo


1
1 Byte weniger, stattdessen Map verwendenG.map{k=>val x=k.split(",");println((x++x).slice(4,6).mkString(","))}
Squidly

1
Ein weiteres Byte wurde durch G.map(_.split(",")).map(x=>println((x++x).slice(4,6).mkString(",")))
Löschen

3

CJam, 18 15 14 Bytes

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

Probieren Sie es online im CJam-Interpreter aus .

Wie es funktioniert

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

POSIX-Shell, 30 Byte

Vorausgesetzt, POSIX sedund cutvorhanden sind:

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

Dupliziert die Zeile, sodass die gewünschten Daten aus den Feldern 5 und 6 extrahiert werden können.


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 Geige


1
Bitte posten Sie eine Geige oder Demo
Juan Cortés

Sie können zwei b entfernen durch das Ersetzen ;mit ,in der Schleife und damit die Klammern zu entfernen {und}
Juan Cortés

@ JuanCortés - danke, wusste das nicht. Was ist die Theorie dahinter?
RichieAHB

Wenn keine geschweiften Klammern hinzugefügt werden, ist der Textkörper der Schleife der erste Ausdruck nach der schließenden Klammer. Ein Ausdruck endet mit einem Semikolon. Die Trennung Ausdrücke mit Komma macht sie ein bisschen wie ein Ausdruck Gruppe , wenn Sie können, die Beendigung der Ausdruck nach ihnen
Juan Cortés

1
Mit können for ofSie 3 Bytes sparen. Es funktioniert in jedem modernen Browser. 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

Verwendet das -lFlag, das die Ausgabe als durch Leerzeichen getrennte Zahlenlisten in jeder Zeile ausgibt. *

_@[4 5]Mg^',

Erläuterung:

  • Die Liste der Nummern wird in erwartet g. Da gnormalerweise von den Befehlszeilenargumenten aus initialisiert wird, können Sie die Eingabe dort auch für dieselben Ergebnisse einfügen.
  • ^', Teilt (jede Zeichenfolge in) die Liste in Kommas auf.
  • M ordnet jedem Element im Ergebnis eine Funktion zu.
  • _@[4 5]definiert eine Lambda-Funktion. Das Argument für die Funktion wird dargestellt durch _; @[4 5]Gibt eine Liste der 4. und 5. Elemente zurück. Wenn die Liste sechs Elemente enthält, sind dies die letzten beiden. Wenn es vier gibt, laufen die Indizes umher und das Ergebnis sind die ersten beiden. (ZB "abcd"@4 == "abcd"@0 == "a")
  • Wir haben jetzt eine Liste von Listen, [[103 2] [106 1] [67 2]]die am Ende des Programms automatisch ausgedruckt wird. Das -lFlag verbindet jede Unterliste im Leerzeichen und dann das Ganze im Zeilenumbruch. Das Ergebnis ist also wie folgt:
C: Pip.py-le [4 5] Mg ', 103, 250, 100, 106, 900, 900, 459, 40, 150, 300, 67,2
103 2
106 1
67 2

* Zur Zeit. Ich kann dieses Verhalten ändern, aber ich plane immer noch, eine Flagge zu haben, die dasselbe tut.


1

Perl, 37

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

35Zeichen +2für -pund -l. Ich bin mir nicht sicher, ob es in Perl einen Ansatz gibt, der @ nutki's schlagen würde Lösung von , aber ich dachte, ich würde diese Idee, die ich hatte, trotzdem posten.

Laufen mit:

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

Der Code ist einfach. Hier ist die ungolfed Version:

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 es hier


0

Rubin, 53

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

oder ist gut.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.