Podsumowanie
Kod golfa jest dobry. Ciasto jest dobre . Po połączeniu tych dwóch rzeczy mogą się zdarzyć tylko dobre rzeczy.
Dane techniczne
W tym wyzwaniu będziesz zarządzać sklepem z ciastkami. Użytkownik będzie mógł wprowadzić pięć różnych poleceń: list
, count
, buy
, sell
, i exit
. Oto specyfikacje dla każdego:
list
Wydrukuj listę wszystkich posiadanych ciast i ich liczby. Oddziel
|
i pad z odstępem po obu stronach.|
s musi być wyrównany. Ilość ciasta może być ujemna (to znaczy, że jesteś komuś winien ciasto:(
). Na przykład:| apple | 500 | | blueberry | 2 | | cherry | -30 |
count [type]
Wydrukuj, ile jest
{{type}}
ciast. Drukuj „Nie ma{{type}}
ciasta!” jeśli nie ma.{{type}}
zawsze będzie pasować do wyrażenia regularnego\w+
(tzn. zawsze będzie to jedno słowo). Na przykład, gdybym miał liczbę ciast pokazanych na powyższej przykładowej liście, wtedy> count apple 500 > count peach There is no peach pie!
buy [n] [type]
Dodaj
{{n}}
do liczby{{type}}
ciast i wydrukuj ją. Utwórz{{type}}
ciasto, jeśli nie istnieje.{{n}}
zawsze będzie pasować do wyrażenia regularnego[0-9]+
(tzn. zawsze będzie liczbą). Oto inny przykład (z takim samym zapasem ciasta jak w poprzednich przykładach):> count blueberry 2 > buy 8 blueberry 10
sell [n] [type]
Odejmij
{{n}}
od liczby{{type}}
ciast i wydrukuj ją. Utwórz{{type}}
ciasto, jeśli nie istnieje. Ciasto może być ujemne (o nie, to znaczy, że jesteś winien komuś ciasto!).> sell 15 blueberry -5 > buy 5 blueberry 0
exit
Drukuj „Sklep z ciastami został zamknięty!” i wyjdź z programu.
> exit The pie store has closed!
Dalsze wyjaśnienia
- Jeśli wywoływana jest nieistniejąca funkcja (pierwsze słowo), wydrukuj „To nie jest poprawne polecenie”.
- Jeśli wywoływana jest istniejąca funkcja z niepoprawnymi argumentami (słowa po pierwszym słowie), zachowanie programu nie ma znaczenia. „Nieprawidłowe argumenty” obejmują zbyt wiele argumentów, zbyt mało argumentów,
{{n}}
nie będący liczbą itp. - Ciasto jest dobre.
- Twój wkład musi być odróżniony od twoich wyników. Jeśli uruchamiasz program w wierszu poleceń / terminalu / powłoce / innej rzeczy opartej na tekście, musisz poprzedzić wejście
> "
znakiem „ (znak„ większy niż ”i spacją) lub inną rzeczą przedrostkową. - Ciasto jest dobre.
Jeśli wszystkie te wyjaśnienia nie są wystarczająco dobre, oto kilka przykładowych wyników:
> list > buy 10 apple 10 > sell 10 blueberry -10 > list | apple | 10 | | blueberry | -10 | > count apple 10 > count peach There is no peach pie! > exit The pie store has closed!
W przypadku zakupu / sprzedaży ciasto i hrabia netto staje się
0
, można też przechowywać go wlist
, czy nie, i można albo powrócić0
lubThere is no {{type}} pie!
kiedycount
go.- To jest golf golfowy ; najkrótszy kod wygrywa.
- Czy wspomniałem, że ciasto jest dobre?
buy 1 apple
isell 1 apple
. I czy w takim przypadku uzasadnionecount apple
byłoby zwrócenie0
zamiastThere is no apple pie!
?Odpowiedzi:
Rubin,
335330Kilka sztuczek tutaj:
Pomysł Doorknob na użycie formatera został dosłownie o krok dalej. Po pierwsze, najdłuższy ciąg w haszu spośród wszystkich kluczy i wartości jest formatowany przy użyciu
" %%%ds |"
takiego łańcucha" %6s |"
. Tak, nie zawijaj kurczowo każdej kolumny osobno. Nigdy nie było takiego wymogu. Jeden rozmiar dla wszystkich. Następnie ciąg ten jest duplikowany i używany jako ciąg formatujący dla tablicy dwuelementowej zawierającej bieżący wiersz. Wreszcie,+
blisko początku zaczyna się słowo i przygotowuje pojedynczą rurkę prowadzącą. Aha, iputs
ma niezłą obsługę tablic.Ruby interpoluje literały regularne. To napięty zapis, ale trochę oszczędza.
Ruby wymaga średnika po
when
wyrażeniu, ale nie przed słowem kluczowym. Prowadzi to do dziwnego artefaktu renderowania, gdy średnik jest zastępowany nową linią.I, oczywiście, perlizm znany jako magiczne globale i automatyczne dopasowywanie literałów regularnych przeciwko nim.
Ponadto większość instrukcji, w tym
case
wyrażenia, są wyrażeniami.źródło
Hash.new(0)
zamiast{}
?nil
(która nie zezwalaj na dodawanie). Dosłownie używanil
jako wartości domyślnejh=Hash.new(0)
=>h=Hash.new 0
,print"> "
=>$><<'> '
i myślę, że[*h]
tak właśnie jesth
. Próbowałem skompletować wersję bez instrukcji switch, ponieważ cały ten tekst na tablicy naprawdę się sumuje: gist.github.com/chron/6315218 . Próbowałem zmusić coś do pracy,ruby -ap
ale wymóg szybkiego pytania utrudnia: <$><<
wydrukowałem nowy wiersz. Jeśli chodzi o ostatnią sugestię ... niestety skróty nie mają metody „spłaszczania”.Rubin,
427384 znakówDzięki Janowi Dvorakowi ogromnej poprawy z 427 do 384 (!)
źródło
loop{...}
zamiastwhile 1do...end
.split
bez jego argumentu. Domyślnie dzieli się według białych znaków (lub$;
jeśli jest ustawiony)p.keys.group_by(&:size).max[0]
- szukaszp.keys.map(&:size).max
czyp.map{|x,_|x.size}.max
? Tutaj:[(t=p.values).max.to_s.size,t.min.to_s.size].max
szukaszp.map{|_,x|x.to_s.size}.max
? Wezmę twój pomysł i nadużywam formatyzatora :-)p[t]=p[t]+m
jest równoważnep[t]+=m
(z wyjątkiemp[t]
jest oceniane dwukrotnie zamiast raz) i dłużej. Użyj tego drugiego.+=
operatora; dlatego go nie użyłem. Może to tylko dla++
. Niedługo będę edytować swój postPytonCiasto - thon 437Jestem pewien, że w drugim ostatnim wierszu jest trochę luzu, ale wymóg wyrównania słupków zarówno dla rodzaju ciasta, jak i liczby jest doozy.
Zgodnie z komentarzem Igby Largeman za przepisy są niejasne wokół tego, co zrobić, jeśli nie było ciasto typu konkretnego, ale istnieje
0
teraz. Zinterpretowałem to na swoją korzyść.Przykładowe dane wyjściowe:
źródło
> count potato
produkujeThat's not a valid command.
zamiastThere is no potato pie!
pie.py
:: PC # -
571 568559Jak zwykle podnosząc tył z beznadziejnie pełnym C #.
Przyjąłem trochę wolności, stosując regułę dotyczącą wyświetlania list. Aby zapisać niektóre znaki, zakodowałem na stałe szerokość kolumny zliczania do maksymalnej szerokości wartości całkowitej. (Reguły nie mówiły, że dodatkowe spacje są niedozwolone).
Sformatowany:
źródło
Python 3, 310
źródło
Java -
772751739713666619Wiem, że nie wygrywa konkursu, ale dla zabawy!
Z podziałami i tabulatorami:
źródło
if/else
być tańszy, ale z powodu tego, że musiałbym to zrobićs[0]=s[0].intern()
, aby porównać==
, zawsze kończyło się to na więcej . Wiem, bardzo sprzeczne z intuicją.