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


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

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

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])

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ć!


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>


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


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.

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.


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


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.


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]'


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


0

Ruby, 53

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

lub jest dobry.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.