Cel: Napisz program lub funkcję, która wypisze ciąg wejściowy w kształcie sinusoidy.
Sinusoida ASCII
Oto jeden okres sinusoidy:
.......
... ...
.. ..
. .
. .
. .
. . .
. .
. .
. .
.. ..
... ...
.......
Pamiętaj, że w każdej kolumnie jest dokładnie jedna kropka.
- Każdy znak w ciągu wejściowym zastąpi kropkę w powyższym kształcie, od lewej do prawej.
- Spacje na wejściu muszą być wyprowadzane jak zwykłe znaki zamiast kropki.
- Znak początkowy odpowiada lewej kropce na powyższym rysunku.
- To tylko jeden okres, dane wejściowe mogą być dłuższe niż liczba kropek powyżej.
Wkład
- Dane wejściowe to ciągi znaków ASCII, które zawierają tylko znaki między dziesiętnym ASCII 32 (spacja) a dziesiętnym ASCII 126 (tylda ~).
- Wejściami zawsze będą tylko jedna linia (bez podziałów linii).
- Dane wejściowe mogą być pobierane przez STDIN, parametry funkcji, argumenty wiersza poleceń lub cokolwiek podobnego.
Wydajność
- Dane wyjściowe muszą być wydrukowane dokładnie tak, jak w podanych przypadkach testowych.
- Końcowe spacje na liniach są dozwolone, o ile długość linii z tymi końcowymi spacjami nie przekracza długości najdłuższej linii (tej z ostatnim znakiem).
- Niedozwolona linia wiodąca / końcowa.
Przypadki testowe
- Wkład:
.................................................
Wydajność:
.......
... ...
.. ..
. .
. .
. .
. . .
. .
. .
. .
.. ..
... ...
.......
- Wkład:
Programming Puzzles & Code Golf Stack Exchange is a question and answer site for programming puzzle enthusiasts and code golfers. It's 100% free, no registration required.
Wydajność:
ng Puzz ion and siasts stratio
mmi les est an thu and egi n r
ra & qu sw en c r eq
g e o o u
o C a r e d n i
r o l e r
P d s s z , e
e i i z g e d
t u o e .
G e e p l r
ol ng f g fe f
f S cha or min rs. 00%
tack Ex program It's 1
- Wkład:
Short text.
Wydajność:
t.
tex
t
r
o
h
S
- Wkład:
The quick brown fox jumps over the lazy dog
Wydajność:
brown
ick fox
qu j
u
e m
h p
T s
o
v
er
th dog
e lazy
Punktacja
To jest golf golfowy , więc wygrywa najkrótszy program lub funkcja w bajtach.
sin
funkcji, aby ją odtworzyć, ale pozycje są trochę wyłączone.)Odpowiedzi:
Pyth, 59 bajtów (57 znaków)
Demonstracja.
Binarna tablica odnośników jest zakodowana wewnątrz
, która ma wartość 3912. To jest konwertowane na binarne, dając[1, 1, 1, 1, 0, 1, 0, 0, 1, 0, 0, 0]
. Jest to traktowane jako różnica między kolejnymi wysokościami. Przygotowując cyfrę 6, tworząc wszystkie prefiksy i mapując każdą z nich na sumę, generowany jest pierwszy kwartał fali.sM._+6jC\2
ocenia[6, 7, 8, 9, 10, 10, 11, 11, 11, 12, 12, 12, 12]
zgodnie z powyższym opisem. Następnie kod konkatenuje na odwrocie tego ciągu, tworząc pierwszą połowę fali, a następnie odejmuje go od 12, aby dać całą falę.Następnie tworzymy linie każdego znaku wejściowego, po których następuje 12 spacji. Linia ta jest obracana w prawo przez parametr wysokości fali odpowiadający tej lokalizacji, a następnie linie są transponowane i łączone na nowych liniach.
Następnie usuwamy wiodące i końcowe puste linie. Nie możemy jednak usunąć wiodących lub końcowych pustych linii, które mają spacje od wejścia. Jest to realizowane przez zastąpienie spacji na wejściu tabulacjami (
C9
), których nie może znajdować się na wejściu, usunięcie pustych linii i zamiana tabulatorów z powrotem w spacje.źródło
Python 2, 156 bajtów
Wyjaśnienie
Cały kod po prostu tworzy blok spacji (
o
) i zastępuje właściwe spacje literami wejściat
.Zmienna
l
przechowuje listę przesunięć od góry. Tak, abyn
th postaćt
była w siecil[n]
.Bytearray
o
służy jako zmienny ciąg, ponieważ ciągi są niezmienne w Pythonie.-~h
jest taki sam,h+1
ale oszczędza miejsce, ponieważ nie potrzebuję nawiasów.źródło
Java,
219209199 bajtówNadal jestem tutaj nowicjuszem i mam nadzieję, że jest zgodne z regułami wprowadzania podfunkcji (oczywiście, gdy liczone są bajty tej funkcji). Jeśli nie, spróbuję przekształcić
sin
funkcję w sprytne wyszukiwanie tablic ...źródło
char[]
. Tutaj, to pozbyć się()
nalength
i wyeliminowaćcharAt()
jak również. Jeśli dobrze to czytam, możesz także użyćprint()
zamiastprintln()
zaoszczędzić jeszcze kilka....a<24?s(24-a):-s(a-24);
i wywołaj gos(c%48)
.Perl, 222 bajty
Wymaga
-E
dlasay
, przechowuje pozycje jako liczby całkowite rzutowane na liczby binarne, a przerzucanie tablicy prawdopodobnie nie jest zbyt wydajne bajtowo. Jestem też pewien, że jest wiele do zrobienia, więc będę szturchać i szturchać.Przykładowe dane wyjściowe:
źródło
JavaScript,
251243224220217Naprawdę prosta implementacja: wykorzystuje ciąg znaków do reprezentowania pozycji y każdego znaku na fali (przesunięty o
a
, który jest kodem ASCII 97). Następnie iteruje wszystkie możliwe wiersze; jeśli wartość y bieżącego wiersza jest taka sama jak pozycja y na fali, zapisuje znak z ciągu. Na końcu znajduje się również czyszczenie, aby usunąć wiersz, jeśli okazał się całkowicie pusty.Zwróć uwagę, że wydruk będzie dziwny w
alert()
oknie, jeśli nie używa czcionki o stałej szerokości, możesz go zmienić,console.log()
aby sprawdzić, czy wydruk jest prawidłowy.EDYCJA 1:
++
i--
istnieją.EDYCJA 2: Usuwanie pustej linii odbywa się teraz w tej samej pętli co reszta, oszczędzając 17 znaków. Nie potrzebowałem też tych nawiasów, na dodatkowe 2 znaki.
EDYCJA 3: Nie trzeba deklarować przebiegu jako zmiennej, oszczędzając 4 znaki.
EDYCJA 4: Jak zauważył Dom Hastings w komentarzach, liczba bajtów obejmowała powrót karetki, a także znak nowego wiersza, zaktualizowano liczbę bajtów dla wszystkich wersji, aby wykluczyć powrót karetki.
EDYCJA 5: Zaoszczędzono 3 bajty dzięki uprzejmości Dom Hastings. Nie wdrożyłem
o.splice
poprawki, ponieważ nie usuwa ona pustych linii (przynajmniej po mojej stronie).źródło
if(o[i++].trim().length<1)o.splice(--i,1)
zo.splice(i-(t=!o[i++].match(/\s/)),t)
, do -4,s=prompt() o=[]
z:s=prompt(o=[])
-1 ifor(y=0,i=0;y<13;++y){o[i]=""
zfor(y=i=0;y<13;++y){o[i]=""
, -2. Prawdopodobnie można również połączyć swoje pętle for, aby zaoszczędzić więcej ... Na koniec warto zauważyć, że mam tylko 220 dla twojej bieżącej liczby bajtów, więc twoje 225 może być oknami\r\n
zamiast tego,\n
co zakładam, że możesz zignorować (proszę mnie poprawić, jeśli się mylę) ...for(s=prompt(),y=0;y<13;y++,v.trim()&&console.log(v))for(v="",x=0;x<s.length;x++)v+=y=="gfedccbbbaaaaaaabbbccdefghijkklllmmmmmmmlllkkjih".charCodeAt(x%48)-97?s[x]:" "
for(s=prompt(y=0);y<13;y++,v.trim()&&console.log(v))for(v="",x=0;x<s.length;x++)v+="gfedccbbbaaaaaaabbbccdefghijkklllmmmmmmmlllkkjih".charCodeAt(x%48)-97-y?" ":s[x]
Matlab,
133, 130 bajtówJedna wkładka:
I wersja rozszerzona:
Jedna linijka pobiera dane z konsoli (
stdin
) i ma 130 bajtów. Rozszerzona wersja zastępuje dane wejściowe konsoli definicją funkcji (bajt +1), ale jest wygodniejsza w przypadku pętli testowej:Opis:
Indeks liniowy każdego znaku jest obliczany na pół okresu, a następnie dublowany i łączony w celu uzyskania pełnego okresu.
Tworzymy puste tło z białym znakiem (taką samą długość jak łańcuch wejściowy. Każdy znak umieszczamy zgodnie z jego pozycją w odpowiednim wierszu. Jeśli łańcuch wejściowy jest dłuższy niż jeden kropka,
mod
operator (modulo) otacza to, więc nie „ t wyjść poza granicę, gdy żąda numeru linii.Przypadek testowy:
Zapisz wersję funkcji
textsine.m
w swojej ścieżce, a następnie uruchom:wyświetli:
jeśli chcesz przetestować wersję jeden liniowej przy udziale
stdin
, Twój wkład musi być wpisany jako jeden pojedynczystring
, więc trzeba by ująć swój wkład między'
postaciami. Przykład:Dzięki
Luis Mendo
za wygolenie 3 bajtów ;-)źródło
s=input('');
działał.Scala 377 znaków
pierwsze cięcie. Prawdopodobnie można uzyskać lepszy wzór do przetłumaczenia
x
doy
źródło
Common Lisp, 205 bajtów
Testy
Zobacz http://pastebin.com/raw.php?i=zZ520FTU
Uwagi
Wydrukuj linię wyjściową linia po linii, obliczając indeksy w ciągach znaków, które powinny być wydrukowane przy użyciu odwrotnej funkcji sinus
asin
. Dane wyjściowe nie pasują dokładnie do oczekiwanych danych wejściowych w pytaniu, ale ponieważ OP potwierdza, że przykładowe dane wyjściowe nie są prawdziwymi sinusoidami, myślę, że jest to w porządku. Przynajmniej dla każdej kolumny jest zawsze zapisany tylko jeden znak.źródło
Python 2, 172 bajty
To nie jest tak dobre, jak odpowiedź Alexa L. , ale jest całkiem blisko. Pobiera dane ze standardowego wejścia i najlepiej działa w
.py
pliku.Postanowiłem zbudować transponowane dane wyjściowe (każda kolumna to wiersz), a następnie transponować wynik, ponieważ w pythonie transponowana jest macierz
map(*m)
.l
: Binarna reprezentacja9960000
(po odcięciu"0b"
odbin
) jest100101111111101001000000
. Jest to „krok” fali sinusoidalnej w każdej kolumnie, zaczynając od ostatniego znaku najniższego punktu. Kopiuję tę listę, neguję każdą liczbę i przyczepiam ją do samego końca, aby utworzyć pochodną funkcji.s
: Jest to zmienna, która śledzi, do którego wiersza (kolumny w transpozycji) wstawiany jest następny znak.o
: Wyjście końcowe, transponowanei
: Śledzi okres fali sinusoidalnej. Zaczyna się od 9, ponieważl
jest nieznacznie przesunięty.W
for
pętli tworzę listę 13 spacji (używałem bajtarów, ale okazuje się, że listy znaków mają krótszą instrukcję drukowania), a następnie zastępujęs
znak th znakiem wejściowym. Dołączb
na końcuo
, dodaj odpowiedni kroks
i zwiększaji
.Miałem nadzieję, że
print
wypowiedź będzie tak prosta\n'.join(*zip(o))
, ale bez powodzenia.zip(*o+['\n'*13])[::-1]
dołącza kolumnę nowych linii, a następnie odwraca i transponuje całość (bez cofania, fala sinusoidalna jest odwrócona do góry nogami),sum(...,())
łączy krotki razem w jedną kratę znaków, a następnie''.join(...)
łączy znaki i drukuje je.Inne rzeczy, których próbowałem, to utworzenie 12-znakowego szeregu spacji i wstawienie nowej postaci w odpowiednie miejsce oraz zastąpienie
l+=[-c for c in l];
matematyki pewnym rodzajem pomnożenia1
iz-1
wynikiem indeksowania dol
, ale nic nie mogłem wymyślić z czasem był niższy.źródło
Mathematica, 131 bajtów
To 131 znaków, w tym trzy dla
i=foo;
. Wydawało się to rozsądnym sposobem na pozyskanie informacji; Mogłem umieścić to w definicjic
i zaoszczędzić kilka uderzeń, ale to jest niesprawiedliwe.To dość proste - prawie nawet czytelne. Dzieli ciąg na listę znaków, a następnie umieszcza te znaki w rzadkiej tablicy w pozycjach określonych na podstawie
Table
(dowolne miejsce w tablicy, w którym znak nie ma wartości domyślnej spacji). Linie są montowane osobno, a następnie między nimi kropi się nowe linie. Ostatni StringJoin zszywa to wszystko.Uwaga: Podobnie jak niektóre inne rozwiązania, może to nie być poprawne, ponieważ daje prawdziwy sinusoid, a nie (piękny) ręcznie wykonany przykład.
Testy:
źródło