Rozważ ciąg długości N, taki jak Peanut Butter
N = 13. Zauważ, że w ciągu znajduje się para N-1 sąsiadujących znaków. Bo Peanut Butter
pierwsza z 12 par to Pe
druga to ea
ostatniaer
.
Gdy pary są w większości różnymi znakami, ciąg ma masywną jakość, np chUnky
.
Gdy te pary są w większości tego samego znaku, łańcuch ma gładką jakość, npsssmmsss
.
Zdefiniuj masywność łańcucha jako stosunek liczby par z dwoma różnymi znakami do łącznej liczby par (N-1).
Określ gładkość łańcucha jako stosunek liczby par o dwóch identycznych znakach do całkowitej liczby par (N-1).
Na przykład, Peanut Butter
ma tylko jedną parę z identycznymi znakami ( tt
), więc jego gładkość wynosi 1/12 lub 0,0833, a jej bryła to 11/12 lub 0,9167.
Puste łańcuchy i łańcuchy zawierające tylko jeden znak są zdefiniowane jako 100% gładkie i 0% masywne.
Wyzwanie
Napisz program, który pobiera ciąg o dowolnej długości i wyświetla jako wynik zmiennoprzecinkowy albo jego kruchość, albo współczynnik gładkości.
- Weź dane wejściowe za pomocą stdin lub wiersza poleceń, albo możesz napisać funkcję, która pobiera ciąg.
- Możesz założyć, że ciąg wejściowy zawiera tylko drukowalne znaki ASCII (a zatem jest jednowierszowy).
- Wydrukuj zmiennoprzecinkowe na stdout do 4 lub więcej miejsc po przecinku, lub możesz zwrócić go, jeśli napisałeś funkcję. Miejsca dziesiętne, które nie przekazują żadnych informacji, nie są wymagane, np.
0
Jest w porządku zamiast0.0000
. - Wybierz masywność lub gładkość według własnego uznania. Pamiętaj tylko, aby powiedzieć, który program generuje.
Najkrótszy kod w bajtach wygrywa.
Przykłady
Peanut Butter
→ Masywność:, 0.91666666666
Gładkość: 0.08333333333
chUnky
→ Masywność:, 1.0
Gładkość: 0.0
sssmmsss
→ Masywność:, 0.28571428571
Gładkość:0.71428571428
999
→ Chunkiness: 0.0
, gładkość: 1.0
AA
→ Chunkiness: 0.0
, gładkość: 1.0
Aa
→ Chunkiness: 1.0
, gładkość: 0.0
!
→ Chunkiness: 0.0
, gładkość: 1.0
[pusty łańcuch] → Chunkiness: 0.0
, Gładkość:1.0
Dodatkowe pytanie: które preferujesz , grube lub gładkie sznurki ?
źródło
Odpowiedzi:
APL, 10 bajtów
Odczytuje dane wejściowe ze standardowego wejścia i wypisuje masywność na standardowe wyjście. Algorytm jest taki sam, jak w przypadku rozwiązania J.
źródło
CJam, 19 bajtów
100% masywny kod źródłowy, który oblicza masywność .
Wypróbuj tę masywną dobroć online.
Jak to działa
Oczywiście NaN w zaokrągleniu do 4 miejsc po przecinku wynosi 0.
źródło
2ew
podejście, które próbowałem. Zabijały mnie specjalne przypadki z listem 0/1._
poruszył. Nie jestem pewien, czy to ważne.Pyth,
1312 bajtówW pełni masywny kod obliczający masywność.
Demonstracja. Uprząż testowa.
źródło
z
powoduje błąd na pustym wejściu online. Pójdę i naprawię ten błąd. Ten kod jest jednak w porządku.TI-BASIC, 46 bajtów
sub(x1,x2,x3
podaje podłańcuch łańcuchax1
rozpoczynający się (jeden) od liczbyx2
i kończący się na liczbiex3
, a następnieseq(
buduje sekwencję.Podaje wartość gładkości.
Ans
Zmienna jest0
domyślnie, więc nie potrzebująElse
doIf
rachunku lub zapisać do niczegoAns
wcześniej.źródło
Matlab (
3736 bajtów)Można to zrobić za pomocą następującej anonimowej funkcji, która zwraca masę:
Komentarze:
W starych wersjach Matlaba (takich jak R2010b) musisz
+
rzutować tablicę charx
na podwójną tablicę:Ale nie jest tak w najnowszych wersjach (testowanych w R2014b), co oszczędza jeden bajt. Dzięki Jonasowi za komentarz.
max
obsługuje przypadki jednoznakowe i zerowe (dla masowości)Przykład:
źródło
diff('abc')
nie wygeneruje ostrzeżenia.> <> ,
4036 bajtówTen program zwraca masę łańcucha.
Wyjaśnienie
Poprzednie przesłanie (37 + 3 = 40 bajtów)
Ten program zwraca gładkość łańcucha. Wejście odbywa się za pomocą
-s
flagi, npźródło
DO#,
9489 bajtówPod 100 bajtów, więc myślę, że to jakaś forma zwycięstwa sama w sobie?
To jest definicja funkcji (dozwolona zgodnie ze specyfikacją), która zwraca gładkość łańcucha wejściowego:
Całkiem proste, jeśli długość wynosi 0 lub 1, zwraca 1, w przeciwnym razie porównuje ciąg do siebie mniejszego pierwszego znaku, a następnie zwraca liczbę identycznych par podzieloną przez liczbę par.
Edytuj - zastąpiono podciągiem Pomiń. Błąd nowicjusza!
źródło
J,
1413 bajtówOblicza masę. Wyrazy uznania dla J za zdefiniowanie
0 % 0
równe 0.Wypróbuj online
Oto wyjaśnienie:
źródło
(]+/%#)2~:/\]
oszczędza 1 bajt.CJam, 23 bajty
Wyjaśnienie:
Daje to współczynnik gładkości.
źródło
CJam, 16 bajtów
Cheaty kod źródłowy, który oblicza gładkość .
Dla danych wejściowych o długości 0 lub 1, drukuje poprawny wynik przed wyjściem z błędem. W przypadku interpretera Java dane wyjściowe błędów są przekazywane do STDERR ( tak jak powinno) ).
Jeśli wypróbujesz kod online , po prostu zignoruj wszystko oprócz ostatniego wiersza wyniku.
Jak to działa
źródło
Julia, 52 bajty
Gładkość!
Tworzy to nienazwaną funkcję, która akceptuje ciąg znaków i zwraca wartość liczbową.
Jeśli długość danych wejściowych jest mniejsza niż 2, gładkość wynosi 1, w przeciwnym razie obliczamy proporcję identycznych sąsiednich znaków, przyjmując średnią z tablicy logicznej.
źródło
Nim,
1059691 bajtówPróbuję nauczyć się Nima. Oblicza to wielkość łańcucha.
(
Jeśli spróbuję odczytać to jako Python, wcięcie wygląda na pomieszane ...Teraz wygląda bardziej jak Ruby ...)źródło
Python 3, 63 bajtów
Jest to anonimowa funkcja lambda, która przyjmuje argument jako argument i zwraca jego masywność.
Aby go użyć, nadaj mu nazwę i zadzwoń.
źródło
def f(n):
który ma dokładnie taką samą liczbę znaków jaklambda n:
. Eliminuje to konieczność nazwania funkcji.def f(n):
również potrzebujereturn
Python 3, 52 bajty
Oblicza to masywność i wyniki
-0.0
dla pustego ciągu. Jeśli nie lubisz ujemnych zer, zawsze możesz to naprawić za pomocą dodatkowego bajtu:źródło
Haskell, 64 bajty
Wykazuje gładkość. na przykład
f "Peanut Butter"
->8.333333333333333e-2
.Jak to działa:
sum(x>>[1])
jest długością x, ale ponieważ system silnego typu Haskella wymaga karmienia ułamków zwykłych/
, nie mogę użyć,length
która zwraca liczby całkowite. Konwersja liczb całkowitych na ułamki zwykłe przezfromInteger$length x
jest zdecydowanie za długa.źródło
import Data.Ratio
jest zbyt drogie.JavaScript (ES6), 55 bajtów
Gładkość, 56 bajtów
Masywność, 55 bajtów
Próbny
Oblicza gładkość, ponieważ wolę to. Na razie działa tylko w przeglądarce Firefox, ponieważ jest to ES6.
źródło
KDB (Q), 30
Zwraca gładkość.
Wyjaśnienie
Test
źródło
Rubinowy ,
6966 bajtówWypróbuj online!
Ogolono kilka bajtów z komentarzami z IMP. Ponadto w nadchodzącej wersji 2.7.0 Ruby można zapisać niektóre bajty, zastępując
|x,y|x!=y
je@1!=@2
źródło
.to_f/~-s.size
do przypisania c, możesz ogolić bajt za pomocą operacji trójskładnikowej:f=->s{(c=s.chars.each_cons(2).count{|x,y|x!=y}.to_f/~-s.size)>0?c:0}
f=
? Nie jestem w 100% na tych zasadach. Wyzwanie mówi, że możesz zwrócić funkcję, która pobiera ciąg, którym jest stabilna lambda.Python 3, 69 bajtów
Nikt jeszcze nie opublikował rozwiązania w języku Python, więc oto dość prosta implementacja funkcji „chunkiness”. To zwiera ciąg długości
1
i drukuje0
(która jest liczbą całkowitą, a nie liczbą zmiennoprzecinkową, ale wydaje się, że jest dozwolona zgodnie z regułami).Na pusty ciąg wyświetla dane wyjściowe
-0.0
zamiast0.0
. Prawdopodobnie można to uznać za akceptowalne, jako-0.0 == 0 == 0.0
zwrotyTrue
.Przykłady:
(Python 3 jest używany jako domyślny podział zmiennoprzecinkowy).
źródło
C, 83 bajty
Funkcja powraca masę .
Wyjaśnienie
Zaakceptuj ciąg C i zwróć liczbę zmiennoprzecinkową (podwójne działałoby, ale jest więcej znaków).
Liczniki -
a
dla par całkowitych,b
dla par niepasujących. Użycieint
ogranicza „dowolną długość” łańcucha, ale to tylko niewielkie naruszenie wymagań i nie zamierzam tego naprawiać.Przypadek specjalny pusty ciąg - pozostaw oba liczniki zerowe.
Niepuste ciąg - iteruj go z przyrostem wstępnym (więc po raz pierwszy przez pętlę
s[a]
będzie drugim znakiem. Jeśli ciąg ma tylko jeden znak, treść pętli nie zostanie wprowadzona ia
będzie wynosić 1.Jeśli obecny znak różni się od poprzedniego, zwiększaj
b
.Po pętli istnieją trzy możliwości: „a == 0, b == 0” dla pustych danych wejściowych, „a == 1, b == 0” dla danych jednoznakowych lub „a> 1, b> = 0 'dla wprowadzania wielu znaków. Odejmujemy 1 od
a
(?
operator jest punktem sekwencyjnym, więc jesteśmy bezpieczni), a jeśli jest zero, mamy drugi przypadek, więc powinien zwrócić zero. W przeciwnym razieb/a
jest to, czego chcemy, ale najpierw musimy awansowaćb
do typu zmiennoprzecinkowego , w przeciwnym razie uzyskamy podział na liczby całkowite. W przypadku pustego ciągu otrzymamy ujemne zero, ale reguły tego nie zabraniają.Testy:
Co daje:
jako wymagane.
źródło
a,b;float f(char*s){if(*s)for(a=b=0;s[++a];)b+=s[a]!=s[a-1];return--a?1.*b/a:b;}
Perl, 69
Funkcja zwracająca gładkość :
Wyjaśnienie
Testy
źródło
Mathematica,
7372 bajtyTo nie wygrywa nic ze względu na rozmiar, ale jest proste:
Gładkość
źródło
Length[#]
->Length@#
zapisuje skok. Podobnie eliminacjaN@
i zmiana1
na1.
GeL:
7673 znakówGładkość.
Przykładowy przebieg:
(GeL = wiązania Gema + Lua. Znacznie lepiej, ale wciąż daleko od zwycięstwa.)
Gema:
123120 znakówGładkość.
Przykładowy przebieg:
(To było dla mnie więcej ćwiczenia, aby zobaczyć, jakie są szanse na rozwiązanie go w języku bez obsługi liczb zmiennoprzecinkowych i ogólnie bolesnego wsparcia arytmetycznego. Druga linia, szczególnie
\P
sekwencja, to czysta magia, ostatnia linia to prawdziwa tortura.)źródło
Java 8,
8482 bajtówWykazuje gładkość.
Wypróbuj online.
Wyjaśnienie:
źródło
Kokos , 38 bajtów
Wypróbuj online!
Port Python 3 miałby 50 bajtów .
źródło
PowerShell, 55 bajtów
Gładkość
Trochę głupie wydaje się uzyskanie zmiennej stdin, a następnie nadanie jej identyfikatora, ale jest to szybsze niż posiadanie funkcji.
źródło
Python 3, 61 bajtów
obliczyć masę:
źródło
K (22)
poprawione rozwiązanie Q WooiKent:
źródło
Ruby, 63 bajtów
Wytwarza chunkiness.
f=->s{s.chars.each_cons(2).count{|x,y|x!=y}/[s.size-1.0,1].max}
Podobne do rozwiązania @ daniero, ale nieznacznie skrócone przez bezpośrednie podzielenie przez długość łańcucha - 1, a następnie poleganie na .count równym zero przy łańcuchach długości 0 i 1 (.max zapewnia, że nie podzielę przez 0 lub -1).
źródło
Mathematica, 107 bajtów
Oblicza masywność, przyjmując połowę odległości Levenshteina między każdym wykresem a jego odwrotnością.
Jeśli wolisz dokładną racjonalną odpowiedź, usuń
.5
i umieść/2
przed ostatnią&
bez kary. Sam program ma masywność 103/106, czyli około 0,972.źródło