Czy nie podobają Ci się diagramy w widoku rozstrzelonym, w których maszyna lub obiekt są rozbierane na najmniejsze części?
Zróbmy to z łańcuchem!
Wyzwanie
Napisz program lub funkcję, która
- wprowadza ciąg zawierający tylko drukowalne znaki ASCII ;
- dzieli ciąg na grupy znaków spacji równych („części” ciągu);
- wysyła te grupy w dowolnym dogodnym formacie, z pewnym separatorem między grupami .
Na przykład, biorąc pod uwagę ciąg
Ah, abracadabra!
dane wyjściowe będą następujące grupy:
! , ZA aaaaa nocleg ze śniadaniem do re h rr
Każda grupa wyjściowa zawiera równe znaki, ze spacjami usuniętymi. Nowa linia została użyta jako separator między grupami. Więcej informacji o dozwolonych formatach poniżej.
Zasady
Dane wejściowe powinny być ciągiem znaków lub tablicą znaków. Będzie zawierał tylko znaki drukowalne ASCII (obejmujący zakres od spacji do tyldy). Jeśli twój język tego nie obsługuje, możesz wprowadzić dane w postaci liczb reprezentujących kody ASCII.
Możesz założyć, że dane wejściowe zawierają co najmniej jeden znak spacji .
Dane wyjściowe powinny składać się ze znaków (nawet jeśli dane wejściowe są dokonywane za pomocą kodów ASCII). Musi istnieć jednoznaczny separator między grupami , inny niż jakikolwiek znak spacji, który może pojawić się na wejściu.
Jeśli dane wyjściowe są przekazywane przez funkcję return, może to być również tablica lub ciągi znaków, lub tablica tablic znaków lub podobna struktura. W takim przypadku struktura zapewnia niezbędną separację.
Separator między znakami każdej grupy jest opcjonalny . Jeśli istnieje, obowiązuje ta sama zasada: nie może to być znak spacji, który może pojawić się na wejściu. Ponadto nie może być tego samego separatora, co używany między grupami.
Poza tym format jest elastyczny. Oto kilka przykładów:
Grupy mogą być ciągami oddzielonymi znakami nowej linii, jak pokazano powyżej.
Grupy mogą być oddzielone dowolnym znakiem spoza ASCII, takim jak
¬
. Dane wyjściowe dla powyższego wejścia to ciąg:!¬,¬A¬aaaaa¬bb¬c¬d¬h¬rr
Grupy mogą być oddzielone n > 1 spacjami (nawet jeśli n jest zmienna), a znaki między każdą grupą oddzielone pojedynczą spacją:
! , A a a a a a b b c d h r r
Wyjściem może być również tablica lub lista ciągów zwracanych przez funkcję:
['!', 'A', 'aaaaa', 'bb', 'c', 'd', 'h', 'rr']
Lub tablica znaków char:
[['!'], ['A'], ['a', 'a', 'a', 'a', 'a'], ['b', 'b'], ['c'], ['d'], ['h'], ['r', 'r']]
Przykłady formatów, które są niedozwolone, zgodnie z zasadami:
- Przecinka nie można użyć jako separatora (
!,,,A,a,a,a,a,a,b,b,c,d,h,r,r
), ponieważ dane wejściowe mogą zawierać przecinki. - Niedopuszczalne jest upuszczanie separatora między grupami (
!,Aaaaaabbcdhrr
) lub używanie tego samego separatora między grupami i wewnątrz grup (! , A a a a a a b b c d h r r
).
Grupy mogą pojawić się w dowolnej kolejności na wyjściu. Na przykład: kolejność alfabetyczna (jak w powyższych przykładach), kolejność pierwszego pojawienia się w ciągu, ... Kolejność nie musi być spójna, a nawet deterministyczna.
Zauważ, że dane wejściowe nie mogą zawierać znaków nowego wiersza A
i a
są różnymi znakami (w grupowaniu rozróżniana jest wielkość liter ).
Najkrótszy kod w bajtach wygrywa.
Przypadki testowe
W każdym przypadku testowym wprowadzany jest pierwszy wiersz, a pozostałe wiersze są danymi wyjściowymi, a każda grupa znajduje się w innym wierszu.
Przypadek testowy 1:
Ach, abrakadabra! ! , ZA aaaaa nocleg ze śniadaniem do re h rr
Przypadek testowy 2:
\ o / \ o / \ o / /// \\\ ooo
Przypadek testowy 3:
Mężczyzna, plan, kanał: Panama! ! ,, : ZA P. aaaaaaaaa do ll mm nnnn p
Przypadek testowy 4:
„Pokaż mi, jak sobie radzisz z tą sztuczką, która sprawia, że krzyczę” - powiedziała „” , S. aaaaa cc dd eeeeeee hhhhhh ii kk mmmm n ooooo rr ssss tttttt u w W y
Odpowiedzi:
Galaretka , 5 bajtów
Wypróbuj online!
Zwraca tablicę, tyle że po wydrukowaniu do STDOUT separator zniknął.
Jest to rzeczywiście funkcja, którą można wywołać jako taką (w Galaretce każda linia jest funkcją).
źródło
Python 3.5+,
77464441 bajtówDość proste. Przechodzi przez unikalne znaki w ciągu, konwertując go na zestaw (za pomocą rozszerzonego iterowalnego rozpakowywania w Pythonie 3.5), a następnie używa rozumienia listy do budowy rozłożonych diagramów, zliczając liczbę przypadków, w których każdy znak występuje w ciągu
str.count
. Filtrujemy spacje, usuwając je z zestawu.Kolejność danych wyjściowych może się różnić w zależności od serii; zestawy są nieuporządkowane, więc nie można zagwarantować kolejności przetwarzania ich elementów, a tym samym wyników odpowiedzi.
To jest wyrażenie lambda; aby go użyć, przedrostek
lambda
zf=
.Wypróbuj na Ideone!Ideone używa Python 3.4, co nie jest wystarczające.Przykład użycia:
Zaoszczędź 3 bajty dzięki @shooqie!
źródło
{*s}
zaset(s)
.Siatkówka, 13 bajtów
Sortowanie jest bardzo łatwe (jest wbudowane), separuje litery, które zajmują 9 bajtów. Wypróbuj online!
Pierwszy wiersz zawiera
O
wszystkie dopasowania wyrażenia regularnego.
(czyli każdej postaci), dając nam!,Aaaaaabbcdhrr
.Dopasowanie jest domyślnym etapem dla ostatniego wiersza programu i
!
powoduje, że drukuje listę dopasowań wyrażenia regularnego oddzieloną od linii. Wyrażenie regularne szuka jednego lub więcej wystąpień znaku spacji w wierszu.źródło
Perl 6 , 28 bajtów
Pamiętaj, że Bag jak Hash lub Set jest nieuporządkowany, więc kolejność wyników nie jest gwarantowana.
Wyjaśnienie:
źródło
Vim,
50, 46 bajtówWyjaśnienie / gif przyjdzie później.
źródło
Pyth, 6
Wypróbuj tutaj lub uruchom pakiet testowy .
Całkiem proste,
-zd
usuwa spacje z wejścia i.gk
grupuje każdy pozostały element według jego wartości. Niestety nie znalazłem sposobu na użycie zmiennych autouzupełniania. Zauważ, że dane wyjściowe są wyświetlane jako ciągi znaków w języku Python, więc niektóre znaki (czytaj: ukośniki odwrotne) są unikane. Jeśli chcesz, aby był bardziej czytelny, dodaj aj
na początku kodu.źródło
Haskell, 38 bajtów
Zasadniczo rozwiązanie nich , ale jawne sprawdzanie tylko liter pojawiających się w ciągu.
źródło
2sable , 7 bajtów
Kod:
Wyjaśnienie:
Wykorzystuje kodowanie CP-1252 . Wypróbuj online!
źródło
JavaScript (ES6), 41 bajtów
źródło
" "
w zwróconej tablicy? Nie jestem pewien, czy to dozwolonejoin()
się nazywa się tymi podwójnymi uderzeniami wstecznymi?.join([''])
.join
następnie konwertuje to na (pusty) ciąg i używa tego do łączenia elementów tablicy. Nie wszystkie metody konwertują swój parametr na ciąg, ale ta technika jest przydatna dla tych, które to robią.Brachylog ,
147 bajtów7 bajtów dzięki Fatalize.
Wypróbuj online!
źródło
x
do usunięcia@S
(spacja). Uważam, że ten format wyjściowy (lista ciągów znaków) jest prawidłowyHaskell, 40 bajtów
Przykład użycia:
f "Ah, abracadabra!"
->["!",",","A","aaaaa","bb","c","d","h","rr"]
.Wzorzec
v:w
pasuje tylko do listy z co najmniej jednym elementem, więc wszystkie znaki spoza wejścia są ignorowane.Również 40 bajtów:
źródło
group
jest zData.List
. W każdym razie myślę, że ta składnia jestghci
tylko i wymaga REPL, więc jest to własny język . Chcę trzymać się standardowego Haskell.Rubinowy, 41 + 1 = 42 bajty
+1 bajt dla
-n
flagi.Pobiera dane wejściowe na standardowe wejście, np .:
źródło
C #
12598 bajtówWyjaśnienie
ToArray
wywołanie i po prostu niejawnie zwrócić IEnumerable, który łącznie oszczędza 27 bajtówźródło
Func<string, string[]>
ies=>s.GroupBy....
R
1981899695 bajtówNie golfowany:
To rozwiązanie nie działa obecnie w pełni, jeśli\
są zaangażowane.Teraz jest !
Dziękuję o wiele do @JDL do golfa z 102 bajtów!
źródło
for(i in unique(a=strsplit(gsub(" ","",readline()),"")[[1]]))cat(rep(i,sum(a==i)),"\n",sep="")
- zapisuje 2 bajty.<-
pozwoli zaoszczędzić 1 bajt!Szybki,
10591 bajtówDzięki @NobodyNada za 14 bajtów :)
Tak, jestem całkiem nowy w Swift ...
Znaki w grupie są oddzielone jedną nową linią. Grupy są oddzielone dwoma znakami nowej linii.
źródło
[Character]
zamiast aString
, ponieważ reguły mówią „Dane wejściowe powinny być ciągiem znaków lub tablicą znaków”. Ponadto,print("")
może być zastąpiony tylkoprint()
.print
bez argumentów nie działała z jakiegoś powodu, ale[Character]
sugestia była solidna. Dzięki!Oktawa , 61 bajtów
Jest to anoymiczna funkcja, która pobiera ciąg znaków na wejściu i wysyła tablicę komórek ciągów znaków.
Wypróbuj w Ideone .
Jak to działa
sort
sortuje ciąg wejściowy. W szczególności spacje będą na początku.strtrim
usuwa wiodące spacje.diff(+y)
oblicza kolejne różnice między znakami (w celu wykrycia granic grupy) ...diff(find([1 diff(+y) 1])
daje wektor wielkości grup.mat2cell
następnie dzieli posortowany ciąg na kawałki o tych rozmiarach.źródło
Mathematica, 36 bajtów
Wbudowane funkcje
Gather
iCharacters
większość pracy tutaj.źródło
> <> , 49 bajtów
Bardzo obszernie marnotrawstwo w danych wyjściowych, ale zakładam, że nadal jest dozwolone ze względu na łagodność zasad
Wyjaśnienie:
zmieściłem niektóre rzeczy dość ciasno, nawet używając skoków, aby obejść niektóre funkcje, dzięki czemu mogłem uruchomić wskaźnik pionowo.
Zasadniczo powoduje to umieszczenie każdego znaku ASCII we własnej nowej linii, a jeśli żaden z tych znaków nie istnieje, wiersz będzie pusty
Wypróbuj online
Edycja: pomyliłem się, wystąpił błąd w kodzie, który spowodowałby, że nigdy się nie wypełnił, gdyby na wejściu było spacja
źródło
Pyth, 5 bajtów
Wypróbuj tutaj!
Pobiera dane wejściowe jako ciąg znaków w języku Python (tzn. Jest zawijany w cudzysłów, w razie potrzeby jest poprzedzany cudzysłowami i ukośnikami).
Wyjaśnienie:
Jeśli zagwarantujesz przynajmniej jedno miejsce na wejściu, istnieje rozwiązanie 4-bajtowe:
Wypróbuj tutaj!
Wyjaśnienie:
źródło
PowerShell v2 +, 44 bajty
Pobiera dane wejściowe
$args[0]
jako ciąg literału argumentu wiersza poleceń. Rzuca to jakochar
-array i używa operatora-n
ote
Qual do wyciągania spacji (ASCII32
). Działa to, ponieważ rzutowanie ma pierwszeństwo wyższego rzędu, a gdy tablica jest używana jako operator po lewej stronie, a skalar jako prawa ręka, działa jak filtr.Przekazujemy tę tablicę znaków
Group-Object
, która robi dokładnie to, co mówi. Zauważ, że ponieważ przekazujemy znaki , a nie ciągi znaków, odpowiednio grupuje się je z rozróżnianiem wielkości liter.Teraz mamy niestandardowy obiekt (y), który ma nazwy grup, liczby itp. Jeśli po prostu wydrukujemy, będziemy mieli mnóstwo niepotrzebnych danych wyjściowych. Więc musimy rury te w pętlę
|%{...}
i każda iteracja razem w jeden ciąg. Te powstałe ciągi są pozostawione w potoku, a dane wyjściowe są niejawne po zakończeniu programu.-join
.Group
Przykład
źródło
Dyalog APL , 11 bajtów
Funkcja zwracająca listę ciągów.
(⊂∩¨∪)
przecięcie całości i jej unikalnych postaci~∘' '
oprócz spacjiWypróbuj APL online!
źródło
Przetwarzanie, 109 bajtów
Jest to podejście brutalnej siły, posortuj tablicę, a następnie przejdź przez nią. Jeśli nie pasuje do ostatniego drukowanego znaku, najpierw wydrukuj nowy wiersz. Jeśli jest to biały znak, pomiń krok drukowania.
źródło
JavaScript (przy użyciu zewnętrznej biblioteki - Enumerable) (
7867 bajtów)Link do lib: https://github.com/mvegh1/Enumerable
Wyjaśnienie kodu: Właśnie do tego został stworzony Enumerable! Załaduj ciąg do biblioteki, która konwertuje go na tablicę char. Odfiltruj białe znaki. Grupuj według char. Zapisz każdą grupę do wiersza zgodnie z określonym orzeczeniem. Ten predykat mówi, aby połączyć wszystkie elementy bieżącej grupy w ciąg bez separatora.
źródło
MATL, 7 bajtów
Demo online MATL
źródło
Perl6,
484745Dzięki manatwork za ulepszenia.
źródło
$a.trim
wydaje się, że robi to w przypadku stanu.$^a.trim&&say $a x$^b
działa. (Przepraszam, że{
.Rubinowy, 46 bajtów
Wypróbuj online!
Moja oryginalna pełna wersja programu, 48 bajtów po dodaniu
n
flagi:źródło
.count(c)
z.count c
?*
operator jest w pobliżu, więc parser będzie narzekał.map
tego przyłożymy, to potrzebuje dodatkowych parens i((s.chars-[' '])|[]).map
ma taką samą liczbę znaków jak(s.chars-[' ']).uniq.map
. A inny, krótszy sposób sprawdzania unikalnych znaków (przez regex) jest już objęty @Jordan w innej odpowiedziPython, 107
Może zostać skrócony przez lambdę, ale później
źródło
CJam, 10 bajtów
Nienazwany blok, który oczekuje ciągu na szczycie stosu i zastępuje go listą ciągów.
Wypróbuj online!
Wyjaśnienie
źródło
Common Lisp, 123
Nie golfowany:
Nie najbardziej przyjazny język golfowi. Prawdopodobnie można to zmodyfikować, aby zwracać listę list zamiast wypisywać ciąg.
źródło
Emacs, 36 klawiszy
C-SPACE C-EM-x
sort-r
TABRETURN.RETURN.RETURNC-AC-M-S-%\(\(.\)\2*\)
RETURN\1
C-QC-JRETURN!Wynik
A man, a plan, a canal: Panama!
->Wyjaśnienie
sort-r
TAB RETURN .RETURN .RETURN\(\(.\)\2*\)
RETURN\1
C-Q C-JRETURN !sort-regexp-fields
z argumentami.
i.
;\(\(.\)\2*\)
->\1\n
we wszystkich dopasowaniach.źródło