Zadanie
Twoim zadaniem jest wytworzenie ciągu zawierającego przeciętne znaki ciągu. Pierwszy znak wyniku byłby średnim znakiem pierwszego znaku (który jest pierwszym znakiem), a drugi znak średnio dwóch pierwszych znaków i tak dalej.
Co to jest przeciętny charakter?
Ciągi to tablice bajtów. Średni znak ciągu można znaleźć, obliczając średnią wartości ASCII znaków w ciągu i biorąc odpowiedni znak ASCII.
Na przykład ciąg "Hello!"
może być zapisany jako sekwencja bajtów 72 101 108 108 111 33
. Średnia z wartości ascii wynosi 533/6 = 88,833 ... a gdy zostanie zaokrąglona do najbliższej liczby całkowitej, otrzymamy 89, co jest kodem ascii dla litery oznaczonej literą Y
.
Zasady
- Możesz założyć, że dane wejściowe zawierają tylko drukowalne znaki ASCII
- Dane wejściowe można odczytać ze stdin lub jako argumenty wiersza poleceń lub jako argumenty funkcji
- Wyjście musi być standardowe. Jeśli twój program działa, możesz również zwrócić ciąg, który w innym przypadku wydrukowałbyś.
- Musi to być cały program lub funkcja, a nie fragment kodu
- Standardowe luki zastosowanie
- Liczby całkowite są zaokrąglane według funkcji
floor(x+0.5)
lub podobnej funkcji.
Jak wygrać?
To jest golf golfowy , więc najkrótsza odpowiedź (w bajtach) w zwycięstwach.
Przykłady
Hello!
→HW^adY
test
→tmop
42
→43
StackExchange
→Sdccd_ccccddd
Odpowiedzi:
Brainfuck 106 bajtów
To mój pierwszy udział w golfie kodowym, proszę, bądź delikatny! Działa, ale pieprzenie mózgu nie radzi sobie z liczbami zmiennoprzecinkowymi (nie wiem o tym), więc zaokrąglona wartość jest zawsze dolna (może naprawić mój algorytm później).
Ponadto algorytm uśrednia wartości 2 na 2, co oznacza, że w niektórych miejscach może być niedokładny. I muszę naprawić błąd, który wypisuje również liczbę na końcu danych wyjściowych.
źródło
Pyth, 16 bajtów
Całkiem proste. Używanie
s+.5
zamiast zaokrąglania, ponieważ z jakiegoś powoduround(0.5, 0)
w Pythonie jest 0.źródło
0.5
zaokrąglone powinno być1
.Q,
1512 bajtów12 bajtów jako wyrażenie
lub 15 bajtów jako funkcja
wykorzystuje
źródło
"c"$avgs"i"$
? Nie sądzę, aby rozwiązanie mogło stać się o wiele prostsze. :)"c"
na `c i"i"
na 'i.CJam, 19 bajtów
Wypróbuj online w interpretatorze CJam .
źródło
Perl:
3130 znaków(Kod 29 znaków + opcja wiersza poleceń 1 znak).
Przykładowy przebieg:
źródło
C #
189 135 134106 bajtówMożna zobaczyć tutaj
Pierwszy raz golfista
źródło
K, 36 bajtów
Stosowanie:
_ci
i_ic
konwertować odpowiednio ascii na znaki i odwrotnie.{(+/x)%#x}
jest klasycznym idiomem K do obliczania średniej. Całkiem proste.Edycja: och, źle odczytałem specyfikację. `0: jest potrzebne do wydrukowania wyniku na standardowe wyjście. Oczekiwanie na wyjaśnienie na temat danych wejściowych. Pytanie Dennisa.
źródło
{[s]`0:`c${_.5+(+/u)%#u:x#s}'1+!#s}
.`0:`c$_.5+{(+/x)%#x}'1_|(-1_)\
`c$_.5+{(+\x)%+\~^x}`i$
dla 24. Może być krótszy (`c$`i${(+\x)%+\~^x}`i$
), ale twoja REPL ( johnearnest.github.io/ok/index.html ) nie zaokrągla poprawnie podczas rzutowania z float na int. Będę wahał się nazwać ak rozwiązanie, ponieważ_ci
i_ic
nigdzie w specyfikacji K5 O ile mi wiadomo, natomiast0:
nie drukuje na stdout lecz odczytuje plik txt z dysku._ci
i_ic
są całkowicie zastąpione w K5 formularzami podobnymi`c$
. Oryginalne rozwiązanie, które opublikowałem, jest zgodne z Kona, która jest oparta na K2 / K3. Zasadniczo staram się nie publikować rozwiązań za pomocą OK, ponieważ semantyka wciąż się zmienia i jest częściowo niedokładna.`0:_ci_0.5+{(+\x)%1.+!#x}_ic
Mathematica, 75 bajtów
źródło
Julia,
8581 bajtówTworzy to nienazwaną funkcję, która akceptuje ciąg znaków i tworzy wektor punktów kodowych ASCII. Dla każdej sekwencyjnej grupy są pobierane środki, zaokrąglane do liczb całkowitych, konwertowane na znaki, łączone w łańcuch i drukowane do STDOUT.
źródło
Ruby, 46
ideone .
Z przeprosinami dla w0lf moja odpowiedź okazała się na tyle inna, że wydawało się, że warto ją opublikować.
$<.bytes
iteruje się na każdym bajcie w stdin, więc wypisujemy średnią kroczącą w każdej pętli. '% c' przekształca liczbę zmiennoprzecinkową w postać, zaokrąglając w dół i biorąc ASCII, więc wystarczy dodać 0,5, aby poprawnie zaokrąglić.$.
to magiczna zmienna, która zaczyna się od zinicjowania na 0 - ma przechowywać liczbę linii, ale ponieważ tutaj chcemy liczby bajtów, zwiększamy ją ręcznie.źródło
Mathcad, 60 „bajtów”
Mathcad to aplikacja matematyczna oparta na arkuszach 2D składających się z „regionów”, z których każdy może być tekstem, wyrażeniem matematycznym, programem, fabułą lub komponentem skryptowym.
Instrukcja matematyczna lub programowa jest wybierana z paska narzędzi palety lub wprowadzana za pomocą skrótu klawiaturowego. Do celów gry w golfa przyjmuje się, że operacja („bajt”) to liczba operacji na klawiaturze niezbędnych do utworzenia nazwy lub wyrażenia (na przykład, aby ustawić zmienną a na 3, napisalibyśmy a: = 3. Operator definicji : = to pojedyncze naciśnięcie klawisza „:”, podobnie jak a i 3, co daje w sumie 3 „bajty”. Programowanie dla operatora wymaga wpisania ctl-shft- # (lub pojedynczego kliknięcia na pasku narzędzi programistycznych), więc znowu jest to równoważne z 1 bajt.
W Mathcad użytkownik wprowadza polecenia języka programowania za pomocą skrótów klawiaturowych (lub wybierając je z paska narzędzi programistycznych) zamiast pisać je w tekście. Na przykład wpisanie ctl-] tworzy operator pętli while, który ma dwa „symbole zastępcze” odpowiednio do wprowadzenia warunku i jedną linię treści. Wpisanie = na końcu wyrażeń Mathcada powoduje, że Mathcad ocenia to wyrażenie.
(Policz bajty) Patrząc na to z perspektywy wprowadzania przez użytkownika i zrównując jedną operację wprowadzania Mathcada (zwykle klawiatura, kliknij pasek narzędzi, jeśli nie ma skrótu kbd) do znaku i interpretuj to jako bajt. csort = 5 bajtów, ponieważ jest wpisany char-by-char, podobnie jak inne nazwy zmiennych / funkcji. Operator for to specjalna konstrukcja, która zajmuje 11 znaków (w tym 3 puste „symbole zastępcze” i 3 spacje), ale jest wprowadzana przez ctl-shft- #, stąd = 1 bajt (podobny do tokenów w niektórych językach). Wpisanie „(cytat) tworzy zrównoważone nawiasy (zwykle), więc liczy się jako 1 bajt. Indeksowanie v = 3 bajty (wpisz v [k).
źródło
Python 3, 66 bajtów
Jeśli użyję
round()
zamiastint(.5+
itp., Zapisuje jedną postać, ale technicznie nie jest zgodna z wyzwaniem: Pythonaround()
rundy zmniejszane o połowę do najbliższej parzystej liczby całkowitej, a nie w górę. Działa jednak poprawnie na wszystkich przykładowych danych wejściowych.Czuję się trochę brudny, że nie kończę produkcji nową linią, ale wyzwanie nie wymaga tego ...
źródło
print(end=chr(int(...))
aby zapisać niektóre bajtyJavaScript (ES6), 75 bajtów
Nie mogę uwierzyć, że nie ma jeszcze odpowiedzi JS tą techniką ...
źródło
Python 2, 71
Z każdym nowym znakiem aktualizuje sumę znaków
s
i liczbę znakówi
do obliczenia i dołączenia przeciętnego znaku.źródło
print
. Czy to zadziała z Pythonem 2? Zapomniałem właśnie, jak tłumić znaki nowej linii wprint
wyciągu ... przecinek czyni to spacją zamiast tego, prawda?)print _,
aby zostawić spację zamiast znaku nowej linii, ale nie ma dobrego sposobu na pominięcie spacji. Dobra rozmowa zend
argumentem Pythona 3 , zapomniałem o tym.print'\b'+_,
Ruby 59
61Test: http://ideone.com/dT7orT
źródło
c+=1;(s/c)
→(s/c+=1)
ideone.com/H2tB9WJava, 100
Podobnie jak wiele innych odpowiedzi tutaj, sumuję i uśredniam w pętli. Właśnie tutaj reprezentuję Javę :)
Mój oryginalny kod to 97, ale zwraca tylko zmodyfikowany,
char[]
zamiast go wydrukować:Teraz, to tylko na tyle długo, aby pojawić się paski przewijania dla mnie, więc oto wersja z przerwami linii, tylko dlatego, że:
źródło
test
jest tablicą znaków, po prostu użyjf(test);
. Jeśli jest to obiekt String, wówczas możesz użyćf(test.toCharArray());
. Literały łańcuchowe też są w porządku:f("Hello!".toCharArray());
toCharArray()
Głupi, próbowałem to pogodzić z jakimś castingiem. Dziękuję Ci.C, 62 bajty
(link ideone)
Wyniki nieznacznie różnią się od przykładów PO, ale tylko dlatego, że ten kod zaokrągla 0,5 w dół zamiast w górę. Nigdy więcej!
źródło
R
135127 bajtówTrwało to bardzo szybko i naprawdę źle pomyliłem się za pierwszym razem :) Muszę poprawnie przeczytać pytania.
Testowe uruchomienie
źródło
utf8ToInt
pomoże! Mam 68 bajtów tego golfa, jeśli chcesz go zaktualizować.Perl 5, 41 bajtów
Uruchom jako
źródło
TSQL, 118 bajtów
Znaki zwracane w pionie
źródło
> <> , 30 bajtów
&
rejestrzeMożesz go wypróbować na tłumaczu online, ale musisz użyć następującej wersji, ponieważ tłumacz online wypełnia pole kodu prostokątem i stosuje się
?
do spacji.źródło
05AB1E , 15 bajtów [Nie konkuruje?]
Wypróbuj online!
źródło
D
i}
i zastąpienies
przezy
..p
jest teraz o 1 zimęη
xDJapt , 13 bajtów (niekonkurujące)
Przetestuj online!
Jak to działa
źródło
Japt , 11 bajtów
Spróbuj
źródło
PHP , 176 bajtów
Przykład:
Największe jak dotąd rozwiązanie, ale myślę, że oparte na php nie może być znacznie krótsze. 2 bajty można zapisać, usuwając znaki nowego wiersza.
źródło
JavaScript ES7, 122 bajty
Przeważnie wszystko dzieje się w tym kawałku
Reszta to zapętlanie / konwersja kodu znaków
Rozdzielać się:
Jeśli funkcje nie są dozwolone:
133 bajty
Urywek ES5:
źródło
Python 2, 106 bajtów
To nie jest wystarczająco krótkie. Ponieważ jest to python, jest zbyt szczegółowe, możesz nawet przeczytać, co robi, szukając kodu. Ale działa.
źródło
Matlab, 43
Korzystanie z anonimowej funkcji:
Przykłady:
źródło
JavaScript ES6, 111 bajtów
Jest to denerwująco długie, częściowo dzięki długiemu JavaScriptowi
String.fromCharCode
i jegocharCodeAt
funkcjom. Fragment kodu zawiera nieoznakowany, skomentowany, testowalny kod.źródło
Współczynnik, 80 bajtów
źródło