EDYCJA: Jeśli używasz Lisp, podałem kilka wskazówek na dole liczenia bajtów.
Cel: Wykonaj najkrótszą funkcję, która dzieli ciąg na niecyfrowe i zwraca tablicę składającą się tylko z cyfr w każdym ciągu, bez użycia żadnych wyrażeń regularnych. Zera wiodące należy zawrzeć w każdym ciągu.
Aktualne tabele (podzielone na kategorie):
- C / C ++ / C # / Java: 68 (C) ....
- GolfScript / APL / J: 13 (APL)
- Wszystkie pozostałe: 17 (Bash, używa
tr
), 24 (Ruby)
Zasady:
(Przepraszam za długość)
- Format musi być funkcją z pojedynczym argumentem łańcuchowym. W razie potrzeby do poprawnego zwrócenia tablicy można dodać maksymalnie dwa dodatkowe argumenty (np. Sh / csh / DOS Batch wymaga dodatkowej zmiennej odniesienia do zwrócenia itp.).
- Deklaracja funkcji podstawowej nie ma znaczenia, podobnie jak import innych standardowych bibliotek. `# include`s,` import`s i `using`s nie liczą się. Wszystko inne robi. Obejmuje to funkcje `# defin` i pomocnicze. Przepraszam za zamieszanie. Odwołaj się do tego jako pomocnego przewodnika po tym, co się nie liczy (napisane w stylu C)
// nie wlicza się do sumy, można ją pominąć, chyba że // nieoczywiste, jak połowa standardowej biblioteki Java. #include <stdio.h> import some.builtin.Class // się nie liczy, patrz wyżej # zdefiniować printf p // liczy się do sumy / * Liczą się wszelkie inne dyrektywy preprocesora itp. * / int i = 0; // liczy się someFunction (); // liczy się char [] [] myMainSplitFunction (tablica char [] []) {// się nie liczy // Wszystko tutaj się liczy return returnArray; // Nawet to się liczy. } // się nie liczy / * Wszystko tutaj się liczy, łącznie z deklaracją * / char [] [] someHelperFunction (ciąg char []) { // rzeczy } // nawet to się liczy
- Dane wyjściowe muszą być tablicą łańcuchową lub podobną (dopuszczalne są listy tablic w Javie i podobnych). Przykłady wyjścia przyjętych:
String[]
,char[][]
,Array
,List
, iArray
(object). - Tablica musi zawierać tylko prymitywy łańcuchowe o zmiennej długości lub obiekty łańcuchowe. Zwroty nie powinny zawierać pustych ciągów, z wyjątkiem wyjątku poniżej. Uwaga: ciągi powinny zawierać ciąg kolejnych dopasowań, takich jak przykładowe dane wejściowe i wyjściowe poniżej.
- Jeśli nie ma żadnych dopasowań, zwróci treść funkcji
null
, pustą tablicę / listę lub tablicę / listę zawierającą pusty ciąg. - Niedozwolone są biblioteki zewnętrzne.
- Zakończenia linii DOS liczą się jako jeden bajt, a nie dwa (już pokryte meta, ale należy podkreślić)
- I największa reguła tutaj: niedozwolone są wyrażenia regularne.
To jest pytanie do golfa , więc wygrywa najmniejszy rozmiar. Powodzenia!
A oto kilka przykładowych danych wejściowych i wyjściowych (ze znakami zmiany znaczenia w stylu C):
Dane wejściowe: „abc123def456” Wyjście: [„123”, „456”] Dane wejściowe: „aitew034snk582: 3c” Wyjście: [„034”, „582”, „3”] Dane wejściowe: „as5493tax54 \\ [email protected]” Wyjście: [„5493”, „54”, „430”, „52”, „9”] Dane wejściowe: „sasprs] tore \" re \\ forz " Dane wyjściowe: null, [], [""] lub podobny
Podaj, ile bajtów wykorzystałeś w swoich odpowiedziach i, jak zawsze, życzymy udanej gry w golfa!
Wytyczne dla Lisp
Oto, co robi i nie liczy się w dialektach Lisp:
;;; opcja 1 (defun extract-strings (ab); Nie liczy się (rzeczy) ;;; Wszystko tutaj się liczy ); Nie liczy się ;;; Opcja 2 (defun extract-strings (string & aux (start 0) (end 0)); Nie liczy się (rzeczy) ;;; Wszystko tutaj się liczy ); Nie liczy sięWszystkie pozostałe lambdy w pełni liczą się do liczby bajtów.
Odpowiedzi:
APL, 13 znaków
(lub 28/30 bajtów, czytaj poniżej)
Widzę, że zablokowałeś GolfScript od pytania. Rozumiem twoje zdanie, ale mam nadzieję, że ta społeczność ostatecznie nie zbanuje APL, ponieważ jest to naprawdę niezwykły język programowania z długą historią, nie wspominając o dobrej zabawie w kodowaniu. Może mógłby być inaczej oceniony, jeśli ludzie czuję, że konkuruje niesprawiedliwie. Prześlę swoje przemyślenia na ten temat do wątku, który podłączyłeś.
Na tym samym tokenie zawsze dodawałem przypis do moich postów APL, twierdząc, że APL może zostać oceniony jako 1 znak = 1 bajt. Moje twierdzenie opiera się na fakcie, że kilka (głównie komercyjnych) implementacji APL nadal obsługuje własne starsze kodowanie jednobajtowe, z symbolami APL odwzorowanymi na górne 128 bajtów. Ale może jest to zbyt duży odcinek, w którym to przypadku możesz chcieć zapisać ten wpis jako 28 bajtów w UTF-16 lub 30 bajtów w UTF-8.
Wyjaśnienie
Przykłady
Domyślny format wyjściowy tablicy ciągów nie wyjaśnia, ile ciągów jest w tablicy ani ile spacji. Ale szybka manipulacja dodawaniem cudzysłowów powinna dać wystarczająco jasne:
źródło
∊⍕¨⍳10
nie możesz po prostu użyć⎕D
? To powinno być stałe'0123456789'
. Dyalog APL przynajmniej go obsługuje, podobnie jak NARS2000.Python 47
Realizacja
Próbny
Algorytm
Konwertuj każdy znak inny niż cyfrowy na spację, a następnie podziel wynikowy ciąg. Proste i jasne podejście.
I zabawne rozwiązanie z itertools (71 znaków)
źródło
Ruby, 70
Wersja online do testowania
Ponieważ konwersja dowolnego znaku nie będącego cyfrą na liczbę int zwraca 0 w Ruby (z to_i), konwersja każdego znaku na int i powrót na znak jest nieregexowym sposobem sprawdzenia cyfry ...
źródło
bash, 26 (zawartość funkcji: 22 + narzut przypisania tablicy 4)
To nie przebije drugiej
bash
odpowiedzi , ale jest interesujące, ponieważ może sprawić, że podwoisz:Zastosowanie to:
Na pierwszy rzut oka
//+([!0-9])/
wygląda jak podstawienie wyrażenia regularnego, ale tak nie jest. Jest to rozszerzenie parametrów bash , które jest zgodne z regułami dopasowywania wzorców zamiast reguł wyrażeń regularnych.Zwracanie prawdziwych typów tablic bash z funkcji bash jest kłopotliwe, więc postanowiłem zamiast tego zwrócić listę rozdzielaną spacjami, a następnie przekonwertować na tablicę w przypisaniu tablicy poza wywołaniem funkcji. Dlatego w trosce o sprawiedliwość uważam, że
(` `)
wywołanie funkcji powinno być uwzględnione w moim wyniku.źródło
Mathematica 32
Stosowanie
Odpowiednik używania wyrażeń regularnych jest znacznie dłuższy !:
źródło
Bash,
21 bajtów17/21 bajtów (poprawiony przez DigitalTrauma )Budowanie listy oddzielonej spacjami za pomocą
tr
zastępuje każdą cyfrę spacją
Stosowanie
Edytować
jak wskazano w komentarzach poniżej, kod można zmniejszyć do 17 bajtów:
a ponieważ wynik nie mówi ściśle o tablicy Bash, użycie powinno być
i dodatkowe
(``)
należy policzyćźródło
(blah)
zamiast{blah;}
:split()(tr -c 0-9 \ <<<$1)
. W ten sposób twoje ciało funkcyjne ma tylko 17 znaków.a=($(split "12 3a bc123")); echo ${a[@]}
. Można argumentować, że „($ ())” wlicza się do twojego wynikutr
podejścia próbowałem zrobić to z rozszerzeniem parametrów .tr
jest zdecydowanie lepszym podejściem do gry w golfa.tr
operatorem ekspansji? Wychodzi na coś takiego($(tr...))
, a gdy deklaracja funkcji się nie liczy, zewnętrzne nawiasy nie liczą się przeciwko tobie. Będzie to tylko część zastępowania poleceń.(``)
konstrukt jest 1-znakowy lepszy od tego($())
i powinien być preferowany.Smalltalk (Smalltalk / X), 81
wartość f: „abc123def456” -> OrDERCollection („123” „456”)
wartość f: „aitew034snk582: 3c” -> OrDERCollection („034” „582” „3”)
wartość f: „as5493tax54 \ [email protected]” -> Uporządkowana kolekcja („5493” „54” „430” „52” „9”)
wartość f: 'sasprs] tore \ "re \ forz' -> OrdersCollection ()
westchnienie - Smalltalk ma tendencję do używania bardzo długich nazw funkcji ...
źródło
asCollectionOfSubCollectionsSeparatedByAnyForWhich
ಠ_ಠ Ta nazwa jest za długaR, 81
Funkcja przyjmuje ciąg i zwraca listę ciągów.
Przykłady:
-
-
-
Uwaga:
$x
to nazwa elementu listy.źródło
Perl, 53
Edytować: w przypadku braku dopasowań sub zwraca teraz listę z pustym łańcuchem (zamiast pustej listy) zgodnie z wymaganiami.
Unika także podziału na pojedynczą spację, ponieważ powoduje zachowanie „podziału na dowolne białe spacje” , co prawdopodobnie narusza reguły. Mógłbym użyć
/ /
separatora, który podzieliłby się na pojedynczą spację, ale paradoksalnie wyglądałoby to jak użycie wzorca wyrażenia regularnego. Mógłbym użyćunpack
kosztem dodatkowych postaci, więcsplit
całkowicie pozbyć się kontrowersji, ale myślę, że to, co kończę, dzielenie na literalną postać (inną niż spacja) jest w porządku.I nie, operator transliteracji Perla nie robi wyrażeń regularnych. Mogę rozwinąć zakres 0–9,
0123456789
jeśli to jest problem.źródło
C, 68 bajtów (tylko ciało funkcji)
Pierwszy argument to ciąg wejściowy, drugi to tablica wyjściowa, która jest tablicą zakończoną znakiem NULL.
a
Przed wywołaniem funkcji należy zarezerwować wystarczającą ilość pamięci (w najgorszym przypadku:sizeof(char*)*((strlen(s)+1)/2)
.Łańcuch wejściowy jest modyfikowany przez funkcję (każdy znak nie będący cyfrą jest zastępowany przez
'\0'
)Przykład użycia
Wynik
Wersja bez gry w golfa:
źródło
VBScript, 190 (164 bez deklaracji funkcji)
Chociaż wcale nie jestem konkurencyjny, jestem zaskoczony, że VBScript wypowiada się tak krótko, biorąc pod uwagę jego szczegółowość (13 bajtów dla samych CR). Pętla przechodzi przez ciąg, zastępując wszelkie znaki nienumeryczne spacjami, a następnie redukuje wszystkie białe spacje do pojedynczych spacji, a następnie używa separatora spacji, aby go podzielić.
Przypadki testowe
źródło
Common Lisp (1 zgodnie z literą; ≈173 zgodnie z duchem)
Oto czytelna wersja. Liczba bajtów jest dość wysokie, ponieważ długich nazw w rzeczy, jak
digit-char-p
iposition-if
ivector-push-extend
.Pojęcie „deklaracji funkcji” jest niejasne. Oto wersja, która ma tylko jeden bajt (znak
x
w treści funkcji); wszystko inne jest zawarte w zmiennych pomocniczych listy lamba funkcji (część deklaracji funkcji):Rzeczywista liczba bajtów będzie zależeć od liczby deklaracji pomocniczych, które musiałyby zostać przeniesione do ciała, aby uznać to za dopuszczalne. Pomocna byłaby także zmiana nazwy funkcji lokalnej (np. Skrócenie,
position-if
ponieważ pojawia się dwa razy, użycie zmiennych jednoliterowych itp.).To renderowanie programu ma 220 znaków:
Jeśli nic więcej, powinno to promować wspólne zmienne Lisp i zmienne Aux .
Można to napisać bardziej zwięźle
loop
, oczywiście:loop
Tworzą z dodatkową przestrzeń usunięte, ma 173 znaków:źródło
(result
do ostatniego nawiasu, by być ciałem. Część, która definiuje nazwę i parametry, to deklaracja.result
jest zadeklarowanie tutaj jako parametru; po prostu ma bardzo nietrywialną formę inicjalizacji. Zasadniczo jest to to samo, co opcjonalny argument o wartości domyślnej obliczanej przez złożone wyrażenie. (W prostszych przypadkach łatwo sobie wyobrazić coś takiegochar* substring( char *str, int begin, int end(0) )
w jakimś języku ze składnią podobną do C, aby określić, żeend
jest opcjonalna, a jeśli nie jest podana, to jej wartość jest0
. Podkreślam tylko fakt, że niektóre z tych terminów(defun fn (string &aux (start 0) (end 0)
Nie liczyłbym, ale wszystko, co pozostało w lambda, by to zrobiło).JavaScript, 240 bajtów
A dla tych z was, którzy są ciekawi, oto mój prawdopodobnie ogromny golf:
Powyżej w ładnym druku:
Powyżej w normalnym kodzie opisowym
źródło
PHP 134
źródło
array_filter
. Spowoduje to automatyczne usunięcie wszystkich wpisów, które zostaną przesłanefalse
do boolean.C 158
Ponieważ C nie ma wbudowanych funkcji drukowania tablic, musiałem wykonać tę pracę sam, więc przepraszam, że na każdym wyjściu znajduje się końcowy przecinek. Zasadniczo to, co robi ten kod, to czyta ciąg znaków, jeśli nie jest cyfrą, zastępuje go „\ 0”, a następnie po prostu przeglądam kod i wypisuję wszystkie łańcuchy cyfr. (EOF = 0)
źródło
#define
s, deklaracje zmiennych itp. Będą się liczyć, ale deklaracja funkcji nie.char[][]
prawem. Jeśli wrócisz tak (lubchar**
), nic ci nie będzie.C #, 98
Po pierwsze, wykorzystuje LINQ
.Select()
metody rozszerzenia , aby zamienić wszystkie cyfry w przecinki.string.Replace()
byłoby lepiej, ponieważ zwracastring
raczej niż aIEnumerable<char>
, alestring.Replace()
może wziąć tylko jeden znak lub ciąg i nie może użyć predykatu takiego jakchar.IsDigit()
lub47<c&c<58
.Jak wspomniano,
.Select()
zastosowane do łańcucha zwraca anIEnumerable<char>
, więc musimy go przekształcić z powrotem w łańcuch, przekształcając go w tablicę i przekazując tablicę dostring
konstruktora.Wreszcie, rozdzielamy ciąg przecinkami za pomocą
string.Split()
.(StringSplitOptions)1
jest krótszym sposobem powiedzeniaStringSplitOptions.RemoveEmptyEntries
, który automatycznie zajmie się wieloma kolejnymi przecinkami i przecinkami na początku / końcu łańcucha.źródło
char.IsDigit(c)
możesz użyć'/'<c&&c<':'
47<c&&c<58
. (Szczerze mówiąc, jestem zaskoczony, że działa z liczbami, ale najwyraźniej działa).,
, a następnie ręczne usunięcie pustych elementówreturn new string(s.Select(c=>47<c&c<58?c:' ').ToArray()).Split().Where(a=>a!="").ToArray();
JS / Węzeł:
168162147138 znakówWersja upiększona:
źródło
console.log(r)
i kilka innych rzeczyRuby, 24
Definiuje cyfry za pomocą ujemnej spacji w drukowanym zakresie ascii.
źródło
php , 204
Kod opisowy:
To jest dość długi kod i jestem pewien, że będzie dużo krótsza wersja php dla tego kodu golfa. To właśnie mogłem wymyślić w php.
źródło
array()
z[]
,array_push($output[$count], $arr[$i]);
z$output[$count][]=$arr[$i];
, iord()
sprawdza zis_numeric()
. i nie musisz nawet rozdzielać łańcucha, aby iterować jego znaki. liczy się tylko wewnętrzny kod funkcji, więc liczbaPyton
źródło
Python
10483@Abhijit odpowiedź jest zdecydowanie sprytna, to tylko „zminimalizowana” wersja tego, co miałem na myśli.
Nie daje to żadnych wyników, więc kod działa, jeśli jest uruchamiany jeden po drugim, ponieważ niektóre zmienne są zdefiniowane w deklaracji.
źródło
PHP
9889Tak jak w odpowiedzi na bash DigitalTrauma, nie używa to wyrażenia regularnego.
Przypadki testowe:
źródło
Haskell 31
Dzieli ciąg na wszystkie znaki nienumeryczne i usuwa puste ciągi wygenerowane przez kolejne separatory.
źródło
VBA 210, 181 bez deklaracji funkcji
źródło
Rebol (66 znaków)
Nieoznakowane i zapakowane w deklarację funkcji:
Przykładowy kod w konsoli Rebol:
źródło
JavaScript,
1049789Gra w golfa:
Edycja: Gdy pętle schodzą z końca tablicy,
c
jestundefined
schodzą , co jest fałszem i kończy pętlę.2/27: Używanie
?:
ratuje słowoif/else
.Powrót karetki w nadwoziu służy do czytelności i nie stanowi części rozwiązania.
Nie golfowany:
Chodzi o to, aby dołączyć każdy znak do ostatniego wpisu w tablicy, jeśli jest on cyfrą i upewnić się, że ostatni wpis w tablicy jest ciągiem znaków.
źródło
JavaScript, 72
Nie golfił
Przykładowe wejście / wyjście
JSFiddle
źródło
if(+a[i]+1)b+=a[i];else if(b)c.push(b),b=""
jeb=+a[i]+1?b+a[i]:b?(c.push(b),""):b
.(c.push(b),"")
wydawało się sprytne, nigdy tego nie widziałem.R 52
Ta funkcja dzieli łańcuchy znaków na klasy znaków (to nie jest wyrażenie regularne! :)) klasa to N - cyfry, a P {N} oznacza negację tej klasy. o = T oznacza pominięcie pustych podciągów.
źródło
PHP 99
Wynik
źródło
JavaScript 88
88 znaków, gdy nie zlicza się funkcji n (x) {}
źródło