Definiujemy białe znaki jako dowolny z trzech znaków, tabulacji (0x09), nowej linii (0x0A) lub spacji (0x20).
W tym wyzwaniu musisz napisać dwa programy lub funkcje w tym samym języku programowania, które wykonują następujące zadania:
Policz znaki białych znaków w danym ciągu. Na przykład dane wejściowe
123 -_- abc def
zwróci 7 (pod warunkiem, że nie ma końcowego nowego wiersza).
Podziel dany ciąg przy kolejnych biegach białych znaków. Jeśli ciąg zaczyna się lub kończy spacją, na końcu nie należy zwracać pustych ciągów. Na przykład to samo wejście
123 -_- abc def
wróciłby
["123", "-_-", "abc", "def"]
.
W obu przypadkach możesz pobrać dane wejściowe za pośrednictwem STDIN, argumentu wiersza poleceń lub argumentu funkcji i zwrócić wynik lub wydrukować go STDOUT. W przypadku drugiego programu, jeśli zdecydujesz się na drukowanie do STDOUT, wydrukuj każdy ciąg w osobnym wierszu, bez otaczających go cudzysłowów.
W przypadku obu programów można założyć, że dane wejściowe zawierają tylko drukowalne ASCII (0x20 do 0x7E) i białe znaki.
Teraz jest haczyk:
- Jeśli wszystkie białe znaki zostaną usunięte z obu programów / funkcji, powstałe ciągi muszą być identyczne. Oznacza to, że Twoje dwa zgłoszenia mogą różnić się jedynie liczbą i rozmieszczeniem białych znaków.
- Żaden program / funkcja nie może zawierać literałów łańcuchowych ani wyrażeń regularnych (literały znakowe są w porządku, pod warunkiem, że Twój język ma określony typ znaków).
- Żaden program / funkcja nie może zawierać żadnych komentarzy.
- Nie wolno czytać kodu źródłowego programu, bezpośrednio lub pośrednio.
To jest kod golfowy. Twój wynik to suma rozmiarów obu rozwiązań (w bajtach). Najniższy wynik wygrywa.
Liderów
Poniższy fragment kodu generuje zarówno zwykłą tabelę wyników, jak i przegląd zwycięzców według języka. Więc nawet jeśli wybrany język nie pozwala ci wygrać całego wyzwania, dlaczego nie spróbować zająć miejsca na drugiej liście? Byłbym bardzo zainteresowany, aby zobaczyć, jak ludzie radzą sobie z tym wyzwaniem w różnych językach!
Aby upewnić się, że twoja odpowiedź się pojawi, zacznij od nagłówka, korzystając z następującego szablonu Markdown:
# Language Name, N bytes
gdzie N
jest całkowity rozmiar Twojego zgłoszenia. Jeśli poprawić swój wynik, to może zachować stare porachunki w nagłówku, uderzając je przez. Na przykład:
# Ruby, <s>104</s> <s>101</s> 96 bytes
Możesz także uwzględnić indywidualne liczby przed całkowitą liczbą, np
# Python 2, 35 + 41 = 76 bytes
Ostatni numer, który nie zostanie przekreślony, zostanie użyty przez fragment kodu.
<script src='https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js'></script><script>site = 'meta.codegolf',postID = 5314,isAnswer = true,QUESTION_ID = 42253;jQuery(function(){var u='https://api.stackexchange.com/2.2/';if(isAnswer)u+='answers/'+postID+'?order=asc&sort=creation&site='+site+'&filter=!GeEyUcJFJeRCD';else u+='questions/'+postID+'?order=asc&sort=creation&site='+site+'&filter=!GeEyUcJFJO6t)';jQuery.get(u,function(b){function d(s){return jQuery('<textarea>').html(s).text()};function r(l){return new RegExp('<pre class="snippet-code-'+l+'\\b[^>]*><code>([\\s\\S]*?)<\\/code><\/pre>')};b=b.items[0].body;var j=r('js').exec(b),c=r('css').exec(b),h=r('html').exec(b);if(c!==null)jQuery('head').append(jQuery('<style>').text(d(c[1])));if (h!==null)jQuery('body').append(d(h[1]));if(j!==null)jQuery('body').append(jQuery('<script>').text(d(j[1])))})})</script>
źródło
Odpowiedzi:
Pyth, 16 + 15 = 31 bajtów
Wypróbuj tutaj .
Licznik:
Rozłupnik:
Każdy z nich definiuje funkcję,
y
która pobiera ciąg znaków w celu rozwiązania żądanego zadania.Podziękowania dla @FryAmTheEggman za pomysł wykorzystania funkcji Pytha modułowego indeksowania list do golenia postaci.
Przypadki testowe:
Wyjaśnienie:
źródło
Python, 54 + 56 = 110 bajtów
Licznik:
Rozłupnik:
W przypadku licznika korzystamy z faktu, że Python jest w porządku, mając tylko wyrażenie na linii. Konieczne jest podzielenie
+1
i0<9or x.split()
powstrzymanieNameError
przed wyrzuceniem a, ponieważ0<9
bycieTrue
uniemożliwiax.split()
ocenę z powodu zwarcia.W przypadku rozdzielacza, ponieważ liczba białych znaków jest zawsze nieujemna,
sum(y.isspace()for y in x)+10<9
jest zawszeFalse
i funkcja dzielenia ma zastosowanie.Alternatywnie 1, 59 + 60 = 119 bajtów
Licznik:
Rozłupnik:
Wyniki zarówno liczenia, jak i dzielenia są przechowywane na liście dwuelementowej. Lista jest indeksowana przez albo
min([1])
, zwracając minimum jednoelementowej listy zawierającej1
, lubm in([1])
, która zwracaFalse
(równoważne0
), com
nie jest zawarte w[1]
.Alternatywnie 2, 67 + 69 = 136 bajtów
Licznik:
Rozłupnik:
Podobnie jak powyżej, wyniki zarówno liczenia, jak i podziału są przechowywane na liście dwuelementowej.
sorted
jest wbudowaną funkcją, która jest prawdziwą wartością, więcnot sorted
zwracaFalse
(równoważne0
). Ponieważnot s or ted
, ponieważs
jest funkcją, a także prawdą,not s
jestFalse
ited = 1
jest zwracana.Alternatywnie 3, 59 + 60 = 119 bajtów
Licznik:
Rozłupnik:
Jest to funkcja, w której wynik rozdzielacza jest przechowywany w zmiennej
a
, a wynik licznika jest przechowywany w zmienneja1
. Tak jak poprzednio, w tym przypadku Python ma tylko wyrażenie w wierszu1
. Podziała1
określa, co należy zwrócić z funkcji.źródło
not sorted
.+1
i0<9or x.split()
potrzebne?m=lambda x:sum(y.isspace()for y in x)+00and x.split()
im=lambda x:sum(y.isspace()for y in x)+0;0and x.split()
(co czyni ten średnik nową linią oczywiście)Java 8, 239 + 240 = 479
Policz białe znaki (zwraca liczbę całkowitą)
Podziel w spacji (zwraca Stream <String>)
Wyjaśnienie:
źródło
Biała spacja, 75 + 153 = 228
Odstępy, tabulatory i znaki nowej linii zostały zastąpione odpowiednio przez STL i złożone dla zapewnienia czytelności. Konwertuj na właściwy plik białych znaków za pomocą
tr -d \\n | sed 'y/STL/ \t\n/'
.Licznik
Rozłupnik
źródło
Cudowny, 103 + 92 = 195
Licznik:
Rozłupnik:
Przetestuj te programy tutaj. Płytki cylindryczne, dołącz biblioteki i spacje dla pustych komórek muszą być sprawdzone.
Wejście i wyjście odbywa się poprzez STDIN / STDOUT.
Wyjaśnienie
Licznik:
Niebieska ścieżka odbiera dane wejściowe. Jeśli znak jest znakiem spacji (wartość ascii mniejsza niż 0x21), wybierana jest czarna ścieżka, która synchronizuje się ze ścieżką fioletową.
Purpurowa ścieżka po prostu zwiększa ilość marmuru przechowywanego w
&1
synchronizatorze za każdym razem, gdy wybierana jest czarna ścieżka.Gdy nie ma już danych wejściowych, wybierana jest czerwona ścieżka, wypisująca liczbę białych znaków i wychodząca.
Rozłupnik:
Program zaczyna się od niebieskiej ścieżki, która zapętla się, dopóki nie zostanie znaleziony znak spacji.
Po odzyskaniu znaku spoza białej ścieżki pobierana jest czarna ścieżka, która wypisuje ten znak i przenosi wykonanie na zieloną ścieżkę, która zapętla się i drukuje, aż do otrzymania znaku spacji. Wykonanie następnie przechodzi do fioletowej ścieżki, która zawiera
3W
lub trójdrożny rozdzielacz.Lewa gałąź przenosi wykonanie na niebieską ścieżkę (a białe znaki są odrzucane, dopóki nie zostanie znaleziony znak inny niż biały).
Środkowa gałąź ustawia kopię danych wejściowych na 0 za pomocą
?0
(generuje losową liczbę pomiędzy0
i0
) i dodaje 10 (0x0A
= nowa linia), która jest następnie wyprowadzana.Właściwą ścieżkę odrzuca się.
źródło
CJam, 26 + 27 = 53
59 61 73 77bajtówLicznik
Rozłupnik
Jak to działa
Pomysł jest prosty, obliczyć liczbę białych znaków i podzielić ciąg znaków na kolejne serie białych znaków. Następnie wybierz jeden z nich na podstawie następującego faktu, który
' !
oznacza , żenot of space character
jest to fałsz, podczas gdy'!
jest to!
postać, która jest prawdziwa.Rozszerzony kod:
Dane wejściowe pochodzą ze STDIN, a dane wyjściowe - STDOUT
Wypróbuj online tutaj
źródło
Mathematica, 44 + 43 = 87
97bajtówMyślałem, że dodam inny język do miksu.
Licznik:
Rozłupnik:
Wykorzystuje to funkcję Mathematiki, że separacja przestrzeni jest taka sama jak mnożenie. A to pomnożenie czegoś przez 0 to zawsze 0, a dodanie 0 do czegoś jest zawsze idempotentne.
W przypadku licznika najpierw liczymy białe znaki i dodajemy
0*1*StringSpli*t@#
.StringSpli
it
nie są zdefiniowane, ale Mathematica używa obliczeń symbolicznych, więc traktuje je jako nieznaną zmienną i funkcję.1*
Jest idempotent (tak0+
), przy czym0*
włącza go do zera. Konieczne jest podzielenie tychStringSplit
dwóch zmiennych, ponieważ0
czasami lista jest traktowana jako zwielokrotnienie wektora skalarnego, co daje wektor (listę) zer.W przypadku rozdzielacza używam faktu, że
Count
również istnieje, ale nie analizuje ciągów. Próbuje policzyć wszystkie wyrażenia podrzędne pasujące do wzorca, aleWhitespace
jest to wzorzec, który dotyczy tylko zawartości ciągu. Tak więcCount
zawsze powróci0
, co powodujeString
zniknięcie. Mnożenie podzielonej tablicy przez01 = 1
jest znowu idempotentne.źródło
Rubin,
10791 bajtówRozdzielacz (46 bajtów)
Licznik (45 bajtów)
p
jest predefiniowaną metodą, która bez argumentów zwraca tylkonil
. Używamy tego na kilka sposobów. W rozdzielaczu inicjałp
nic nie robi.gets(p)
wczytuje wszystko ze standardowego wejścia, ponieważ separator jest pusty. Wywołujemy na tym wbudowaną metodę podziału i przypisujemy wynikp
, więc teraz, gdy nie podano argumentów, zostanie przeanalizowana jako zmienna.puts p||...
zwiera i drukuje każdy elementp
zmiennej do własnej linii.W liczniku usuwamy pierwszy znak nowej linii, aby
pp
zamiast tego została przypisana podzielona tablica . Ponieważ nie przypisaliśmy się dop
tej metody, wciąż jest to metoda zwracająca zero, więc druga część||
testów jest oceniana i przekazywana doputs
.$_
jest magiczną zmienną zawierającą wynikgets
, więc łączna ilość białych znaków jest wielkością pomniejszoną o znaki niebiałe, którepp
zawierają. Wydaje mi się, że powinien istnieć krótszy sposób liczenia, ale nie mogę go znaleźć, a w każdym razie używanie podzielonej tablicy w liczniku jest fajne.źródło
Python, 169
W Pythonie jest to prawie zbyt łatwe!
Licznik:
Rozłupnik:
Różnią się tylko jedną spacją i nie robię żadnych sztuczek, takich jak dzielenie liczby lub nazwy zmiennej na pół :)
źródło
C 138 + 136 = 274
W każdym przypadku kod jest programem, który akceptuje dokładnie jeden argument wiersza poleceń i wypisuje wynik na standardowe wyjście.
\t
należy zastąpić znakiem tabulacji. Jeśli chcesz przekazać argument zawierający tabulatory i znaki nowej linii, Twoim zadaniem jest dowiedzieć się, jak;).Rachunkowość
Rozdzielać
źródło
JavaScript, 95 + 96 = 191 bajtów
Licznik:
Rozłupnik:
Nie golfowany:
RegExp(String.fromCharCode(92,115)
Linia tworzy regex białymi dopasowywania/\s/
bez regex lub ciąg literałów.W każdym programie używamy zmiennej
v
lubvv
. Przechowujemy podzieloną tablicę w tej zmiennej (v
lubvv
), a następnie rozgałęziamy nasze zachowanie na wartościv
(tymczasemvv
jest ignorowane). W ladziev
ma prawdziwą wartość; w spliterze ma wartość falsy (ponieważvv
zamiast tego dostała wartość).Alternatywnie: JavaScript, 250 bajtów
Mam inne rozwiązanie, które nie wygrywa żadnych nagród za zwięzłość, ale pomyślałem, że nadużywanie automatycznego wstawiania średnika JavaScript jest ciekawym wyzwaniem.
Licznik:
Rozłupnik:
Licznik bez golfa:
Rozdzielacz jest dokładnie taki sam, z wyjątkiem linii:
jest teraz
Automatyczne wstawianie średnika JavaScript zwykle nie kończy wcześniej instrukcji wieloliniowych, jeśli można je zrozumieć bez podziału linii, ale nie toleruje podziału linii po
return
,continue
lubbreak
. Dlatego linia jest odczytywana po prostu jakobreak
, która wyłamuje się tylko z wewnętrznej pętli, zamiast zrywając z zewnętrznej pętli. Wykonywaneo = a.filter(j=>j)
jest wówczas zachowanie „drugiego przejścia” (w przeciwieństwie do pominięcia w liczniku), ponieważ zewnętrzna pętla otrzymuje drugie przejście.źródło
!!x
różni się od automatycznejBool
konwersji?filter
auto-bools zwraca oddzwonienie według tych samych zasad, co!!
. Dzięki!Python,
228198182166146145 bajtówLicznik ( 72 bajty ):
Rozdzielacz ( 73 bajty ):
ior1
jest zmienną falsey, alei or 1
jest prawdą. To główna sztuczka.źródło
i
pusty ciąg dla rozdzielacza? Można to naprawić, zmieniająciorb
naior1
, co pozwala również zapisać postać pomiędzy1
ielse
.Befunge 98, 61 + 59 = 120
Licznik:
Rozłupnik:
źródło
Bash, 75 + 79 = 154 bajtów
Polega to na tym, że bash będzie mógł kontynuować wykonywanie, nawet jeśli niektóre wiersze lub części wiersza skryptu są zniekształcone (w niektórych okolicznościach). Biała spacja służy do wyłączania znaków ucieczki dla niektórych nawiasów klamrowych i do łamania rury poprzez umieszczenie jej w nowej linii.
Rozłupnik:
Licznik:
Dane wejściowe są za pomocą argumentu wiersza poleceń, dane wyjściowe - przez standardowe wyjście.
Ponieważ zależy to od zachowania błędu bash, użytkownik powinien zignorować stderr.
Przykładowy przebieg (pokazujący dane wejściowe z nową linią i wieloma ciągłymi spacjami):
źródło
Rubinowy,
114 + 116107 + 109 = 216 bajtówTo nie może konkurować z rozwiązaniem ruby autorstwa histokryta, ale pomyślałem, że i tak warto go odłożyć.
Użyłem
$z
donil
inil.to_s
dlaString.new
Dodatkowym znakiem białej spacji, który dodaję na końcu danych wejściowych, jest wymuszenie dodania ostatniego słowa do tablicy (
r
) - słowo jest dodawane tylko na końcu tablicy, gdy znak białej spacji następuje po znaku innym niż biały. Alternatywą było dodanie kolejnejr<<w if w
poeach_byte
bloku.Rachunkowość
Rozdzielać
źródło
Haskell ,
53 + 55 = 10836 + 38 = 74 bajtyLicznik
Rozłupnik
To rozwiązanie wykorzystuje fakt, że w Haskell funkcje są instancją klasy typu Monad, a zatem mogą być używane jako akcje monadyczne w notacji do.
W pierwszym przypadku wynikowa funkcja do-block jest pierwszym argumentem
pure
(który jest zasadniczoconst
dla typu funkcji), co powoduje, że licznik jest końcowym wynikiem, a rozdzielacz jest odrzucany.W drugim przypadku
pure
jest stosowany tylko do jednego argumentu, co czyni go funkcją zwracającą inną funkcję (licznik). Jednak wynik nigdy nie jest wykorzystywany, a zatem odrzucany. Ostatecznym rezultatem jest druga linia do-block, rozdzielacz.źródło
[' ','\t','\n']
można skrócić do" \t\n"
.(<'!')
testując spacje.Java 8, 187 + 188 = 375
Przede wszystkim chciałbym powiedzieć, że ta odpowiedź jest w dużej mierze oparta na @ Ypnypn. Zasadniczo wymieniłem niektóre części na krótsze (w tym część zależną od białych znaków, której IMO jest najważniejsze w tym wyzwaniu), ale kod funkcjonalny jest w większości taki sam.
Policz białe znaki , 187 (zwraca
int
):Podział na białe znaki , 188 (zwraca
Stream<String>
):źródło
J, 48 + 49 = 97 znaków
Dwie funkcje przyjmujące i zwracające pojedynczy argument. Wykorzystałem najbrzydszy sposób, w jaki mogłem wymyślić, aby pokonać regułę z tą samą białą spacją, więc prawdopodobnie są postacie, które można uratować, znajdując bardziej sprytną drogę.
Definiujemy czasownik,
a
aby miał dwie różne akcje, w zależności od tego, czy jest używany z jednym argumentem, czy z dwoma. Z jednym argumentem(e.u:)&9 10 32
sprawdza, czy każdy znak jest spacją, czy nie. Jest to z dwoma argumentami,a:-.~(<;._1~1,}.)
które biorą wektor boolowski po prawej stronie i przecinają lewy argument w tych pozycjach, odrzucając wszelkie puste cięcia za pomocąa:-.~
.Następnie określamy, że
aa
wynikiem będzie liczba wartości Truea
, co ma sens tylko z jednym argumentem. Wreszcie używamyaa
lub wa a
zależności od tego, czy chcemy policzyć, czy podzielić białe znaki ciągu.aa
działa zgodnie z oczekiwaniami.Powodem
a a
jest to, że kiedy J widzi(f g)y
, bierze pod uwagę(f g)
hak i ocenia go w podobny sposóby f (g y)
. W tym przypadkuf
jest to diadyk,a
nad którym wykonuje się wycinanie, ig
jesta[aa
, który oblicza sumęaa
, wyrzuca ją i ponownie oblicza (monadycznie)a
.W REPL:
źródło
Bash, 54 + 50 = 104 bajty
Licznik
Rozłupnik
źródło
Perl, 37 + 38 = 75
Licznik :
Splitter :
źródło
Perl 6, 31 + 32 = 63 bajty
Licznik
Wypróbuj online!
?^1
jest analizowany, jak?^ 1
co powoduje zastosowanie logicznego operatora negacji do 1, w wyniku czegoFalse
.Rozłupnik
Wypróbuj online!
? ^1
konwertuje zakres 0..0 na Bool, w wyniku czegoTrue
.źródło
Python 2, 98
Podział (49)
Zwraca tokeny na liście.
Liczenie (49)
Zwraca listę o długości jeden zawierającą liczbę znaków spacji. Najprawdopodobniej spowoduje to błąd w czasie wykonywania, ale funkcji
f
można użyć po wykonaniu kodu.źródło
C (gcc) , 88 + 89 = 177 bajtów
Rozłupnik
Rozłupnik
Licznik
Licznik
Zniszczony
Pobiera dane wejściowe jako argument funkcji. Funkcja zliczania zwraca liczbę białych znaków. Funkcja podziału używa STDOUT dla swoich danych wyjściowych (ale przy okazji zwraca również liczbę białych znaków minus jeden).
źródło
Zsh , 35 + 35 = 70 bajtów
Nie jestem pewien, czy się
[^$IFS]
kwalifikuje, ponieważ jest on używany do dopasowania wzorca. Oto rozwiązanie 45 + 45 w przypadku, gdy zostanie zbanowany.Rozdzielać:
Liczyć:
:
Wbudowane jest equivilent celutrue
używamy go jako coś pomiędzy komentarz i / dev / null (ponieważ komentarze są niedozwolone) rurami niechciany ekspansję na niego.Zsh ma wbudowaną funkcję podziału na białe znaki
${=var}
. Utrudnia to wykonanie jakiejkolwiek logicznej kombinacji poza wykonaniem obu i odrzuceniem tej, której nie chcemy.Wypróbuj online!
źródło