CodeGolf - Zignoruj ​​hałas # 1

15

Instrukcje

Barry nie jest tak dobrym programistą backendowym odpowiedzialnym za małe API, które powinno dostarczać informacji o zakupach dokonanych w sklepie klienta. Jednak nie wykonał świetnej roboty, a twój szef każe ci to naprawić po stronie klienta. Idealnie powinieneś otrzymać wartości oddzielonych przecinkami, takich jak 927,2,45,90które odpowiadają coś takiego item_id, item_amount, unit_price,total

W tym pierwszym układanki interesują nas tylko item_idi item_amountale potrzebujemy innych pól w celu przedstawienia problemu. Barry czasami robi rzeczy mieszają się i powraca hałasu jako część wyjścia, dostaje także niewłaściwej kolejności, powrót noise, noise, unit_price, total, item_id, item_amount.

Twoje zadanie

Musisz przechowywać na mapie (lub podobnej strukturze) pary item_idi item_amountniezależnie od tego, czy Barry zwraca je poprawnie, czy nie, i drukować każdy element w nowym wierszu z możliwie najmniejszą liczbą znaków. (Przechowywanie nie jest obowiązkowe, zależy nam tylko na wydajności)

Przykładowe dane wejściowe (mieszane poprawne i niechlujne formaty)

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

Innymi słowy wejście będzie albo a,b,x,xczy x,x,x,x,a,bgdzie co dbamy o to, a& b. Musisz podać kod, zakładając, że mamy zmienną o nazwie G(lub dowolną inną nazwę) ze wszystkimi wierszami csv.

Próbka wyjściowa

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

Tolerancja

Jeśli chodzi o odpowiedź, istnieje pewien margines tolerancji. Odpowiedzi w podobnych formatach, ale zachowujące prawidłowe wartości, również będą akceptowane. Formaty podoba [a,b], (a,b)czy {a,b}są ważne, ale a,bjest korzystne.

Chociaż pierwsza łamigłówka miała mieszaną akceptację ze względu na to, że była łatwa i szybka do rozwiązania, czułem również, że niektórym się to podobało. Więc na razie będę nadal robić szybkie golfy

Juan Cortés
źródło
Czy dane wejściowe będą zawsze w formacie x,x,x,xi x,x,x,x,x,xgdzie xoznacza liczbę?
Spikatrix
Tak, dane wejściowe będą zgodne z jednym z tych dwóch formatów, wyjaśnię
Juan Cortés
Czy musimy przesłać program, funkcję lub coś innego? Ponadto, skąd można wziąć wszystkie dane wejściowe?
Spikatrix
3
szybka gra w golfa jest zasadniczo trudnością. Wydaje się, że istnieje konsensus, że ich nie chcemy , więc na razie usuwam ten tag. Jeśli chcesz, aby tagi trudności zostały ponownie ocenione, zrób w tym celu post. Byłby to jednak ogromny wysiłek polegający na ponownym tagowaniu, co moim zdaniem powinno się odbyć w skoordynowany sposób, zamiast indywidualnych użytkowników tworzących dla niego dowolne nowe tagi.
Martin Ender
2
@CoolGuy Nie ma czegoś takiego. Nie powinieneś bić Pytha za pomocą C (bo nigdy tego nie zrobisz). Radość polega na pokonaniu innych podań w tym samym języku lub językach o podobnej gadatliwości. Jeśli przesłano już 50 bajtów C, zrozumiałbym, że nie wysyłałem (chociaż nawet wtedy, mógłbym to wysłać, jeśli podejście jest inne i interesujące). Ale ponieważ nie ma, proszę opublikować swoją odpowiedź. Jesteś dość blisko JavaScript i Python, więc zdecydowanie nie jest zbyt długo na C.
Martin Ender

Odpowiedzi:

8

Pyth, 10 bajtów

FNG<.<N4 2

Wypróbuj online: Pyth Compiler / Executor

(Pierwsze 4 znaki =G.Qodczytują wszystkie dane i zapisują je G)

Wyjaśnienie

FNG              for row N in G:
    .<N4            cyclic leftshift by 4
   <     2          print the first two elements
Jakube
źródło
4
piękna, zaczynam już lubić Pytha
Juan Cortés
3
@ JuanCortés: Może to być dobry zasób, jeśli chcesz zacząć pracę z Pyth.
Alex A.,
7

Perl, 24

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

Przykład:

perl -pe's/(\d+,){4}|,\d+,\d+$//' <in
103,2
106,1
67,2
4,20
nutki
źródło
1
Byłoby to 20 bajtów Retina . ;)
Martin Ender
7

Python 3, 123 76 72 62 bajtów

Jestem nowicjuszem, muszę gdzieś zacząć ...

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

Z sugestiami xnor i DLosc (62 bajty):

for l in G:d=l.rstrip().split(',');print(d[4*(len(d)>5):][:2])
Monguin
źródło
8
Witamy w Programowaniu zagadek i Code Golf! Ponieważ są to zawody związane z golfem , będziesz chciał skrócić swój kod tak krótko, jak to możliwe. Jedno, co możesz zrobić, to zmniejszyć ilość miejsca używanego na wcięcia; w Pythonie wystarczy jedna spacja. Ten post zawiera wskazówki dotyczące gry w golfa w Pythonie i może być dobrym źródłem informacji.
Alex A.,
@Alex, dzięki - starałem się dowiedzieć, jakie są dokładne zasady, miałem nadzieję, że mogę zignorować spacje, ale chyba nie.
monguin
Nie, nowe linie i spacje wpływają na liczbę twoich postaci.
Alex A.,
W rzeczywistości w tym przypadku nie potrzebujesz nawet nowej linii i wcięcia. Instrukcje blokowe, takie jak, formogą znajdować się w tym samym wierszu w Pythonie, o ile w treści nie ma innej instrukcji blokowej.
DLosc
3
Dobry start. Możesz umieścić wszystko w tej samej linii, co foraby uniknąć wcięć. Warunek [0,4][...] można skrócić 4*(...) , wykorzystując fakt, że boole są równe 0/1. Ponadto, jeśli piszesz d[x:x+2]jako d[x:][:2], chociaż jeden znak dłużej, pozwala uniknąć zapisywania wyrażenia dla xzmiennej.
xnor
4

Sed, 32 bajty

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

Spowoduje to usunięcie wszystkiego do czwartego przecinka, jeśli taki istnieje. Następnie usuwa wszystko z drugiego przecinka (który mógł być wcześniej szósty).

Udało mi się nawet uzasadnić!

Toby Speight
źródło
Czy jest jakaś szansa na obejrzenie dema?
Juan Cortés
Nie jestem pewien, czego chcesz od wersji demo - uruchomiłem dostarczone wejście testowe i uzyskałem wymagane dane wyjściowe.
Toby Speight
4

JavaScript, 44 bajty

Zakładając wejście w zmiennej G.

Edycja: Właśnie zdałem sobie sprawę, że to bardzo przypomina perlowe rozwiązanie nutki.

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

Prezentacja 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>

nderscore
źródło
4

Scala, 68 bajtów

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

- MrBones

Scala, 46 70 bajtów

Edycja: wydrukuj wynik

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

Próbny

Gabriel Jones
źródło
1
1 bajt mniej, używając zamiast tego mapyG.map{k=>val x=k.split(",");println((x++x).slice(4,6).mkString(","))}
Squidly
1
kolejny bajt uratowany przez upuszczenie wiązania:G.map(_.split(",")).map(x=>println((x++x).slice(4,6).mkString(",")))
Kalmary
3

CJam, 18 15 14 bajtów

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

Wypróbuj online w interpretatorze CJam .

Jak to działa

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
źródło
3

Powłoka POSIX, 30 bajtów

Zakładając POSIX sedi cutsą obecne:

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

Duplikuje linię, pozostawiając interesujące dane gotowe do wyodrębnienia z pól 5 i 6.

Toby Speight
źródło
3

JavaScript, 117 112 99 95 84 76 71 bajtów

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

JS Fiddle

RichieAHB
źródło
1
Proszę zamieścić skrzypce lub wersję demo
Juan Cortés
Można usunąć dwa B zastępując ;ze ,w ciele pętli, a więc usuwanie szelki {i}
Juan Cortés
@ JuanCortés - dzięki, nie wiedziałem o tym. Jaka jest teoria?
RichieAHB
Jeśli nie zostaną dodane nawiasy klamrowe, ciało pętli będzie pierwszym wyrażeniem po nawiasie zamykającym. Wyrażenie kończy się średnikiem. Oddzielenie wyrażeń przecinkami sprawia, że ​​są one jak grupa wyrażeń , jeśli możesz, kończąc wyrażenie po nich
Juan Cortés
1
Za pomocą for ofmożesz zapisać 3 bajty. Działa w każdej nowoczesnej przeglądarce. for(r of q=G.split('\n'))s=r.split(','),console.log(s[t=s[4]?4:0],s[t+1])
edc65
2

Pypeć , 12 + 1 = 13 bajtów

Używa -lflagi, która daje wynik jako rozdzielone spacjami listy liczb w każdym wierszu. *

_@[4 5]Mg^',

Wyjaśnienie:

  • Lista liczb jest oczekiwana w g. Ponieważ gzwykle jest inicjowany z argumentów wiersza poleceń, możesz również umieścić tam dane wejściowe dla tych samych wyników.
  • ^', dzieli (każdy ciąg znaków na) przecinkami.
  • M mapuje funkcję do każdego elementu w wyniku.
  • _@[4 5]definiuje funkcję lambda. Argument funkcji jest reprezentowany przez _; @[4 5]zwraca listę jego czwartego i piątego elementu. Jeśli lista zawiera sześć elementów, będą to dwa ostatnie. Jeśli ma cztery, indeksy się zawijają, a więc wynik to pierwsze dwa. (Np "abcd"@4 == "abcd"@0 == "a".)
  • Mamy teraz listę list, takich jak [[103 2] [106 1] [67 2]] która jest automatycznie drukowana na końcu programu. -lFlaga łączy każdym podmenu w przestrzeni, a następnie całość na nowej linii, więc wynik jest następujący:
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

* Obecnie. Mogę zmienić to zachowanie, ale nadal planuję mieć flagę, która robi to samo.

DLosc
źródło
1

Perl, 37

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

35znaki +2dla -pi -l. Nie jestem pewien, czy jest takie podejście w Perlu, które pokonałoby rozwiązanie @ nutki , ale pomyślałem, że i tak opublikuję ten pomysł.

Biegnij z:

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

bash, 54

while IFS=, read {a..f};do echo ${e:-$a},${f:-$b};done
izabera
źródło
0

C, 95 bajtów

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

Kod jest prosty. Oto wersja bez golfa:

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
}

Sprawdź to tutaj

Spikatrix
źródło
0

Ruby, 53

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

lub jest dobry.

MegaTom
źródło