Dzięki @KritixiLithos za pomoc w tym wyzwaniu!
V jest językiem programowania, który napisałem, aby móc używać i rozszerzać vima do wyzwań związanych z golfem. Pierwsze zatwierdzenie nastąpiło 3 marca 2016 roku, co oznacza, że dziś V kończy roczek! Woo-hoo
W ciągu pierwszego roku istnienia V wykonano 176 zatwierdzeń od czterech różnych autorów, 140 odpowiedzi od 12 różnych użytkowników i zbyt wielu popsutych zduplikowanych operatorów, aby liczyć . Ma tłumacza online , hojnie obsługiwanego przez @Dennis, który był uruchamiany prawie 8 000 razy od grudnia .
Podejmijmy wyzwanie, aby świętować urodziny V. Ponieważ większość funkcji w V została zaprojektowana z myślą o manipulacji strunami i sztuce ascii , po prostu wydaje się naturalne, że każde wyzwanie świętujące V powinno dotyczyć sztuki ascii. Twoim dzisiejszym wyzwaniem jest przyjęcie słowa jako danych wejściowych i przekształcenie go w kształt litery V. Na przykład wpis „Hello” powinien dać następujące V:
Hello olleH
Hello olleH
Hello olleH
Hello olleH
Hello olleH
HellolleH
HellleH
HeleH
HeH
H
Oto kilka szczegółów na temat tego, jak powinno wyglądać Twoje V. Jeśli ciąg wejściowy ma długość n znaków, litera V powinna mieć n*2
wysokość wiersza. Pierwsza linia powinna składać się z:
<input string><(n*2) - 1 spaces><input string reversed>
W każdym nowym wierszu jedna spacja jest dodawana na początku, a dwie strony łańcucha przesuwają się ku sobie, usuwając nakładające się znaki. Aż do ostatniego wiersza, który jest tylko pierwszym znakiem wprowadzania. Końcowe białe znaki w każdej linii są dopuszczalne, a dozwolony jest także końcowy znak nowej linii.
Możesz założyć, że dane wejściowe zawsze będą możliwe do wydrukowania w formacie ASCII bez żadnych spacji, a także możesz pobierać dane wejściowe i wyjściowe dowolną rozsądną metodą. Oto kilka przykładowych danych wejściowych:
Happy:
Happy yppaH
Happy yppaH
Happy yppaH
Happy yppaH
Happy yppaH
HappyppaH
HapppaH
HapaH
HaH
H
Birthday:
Birthday yadhtriB
Birthday yadhtriB
Birthday yadhtriB
Birthday yadhtriB
Birthday yadhtriB
Birthday yadhtriB
Birthday yadhtriB
Birthday yadhtriB
BirthdayadhtriB
BirthdadhtriB
BirthdhtriB
BirthtriB
BirtriB
BiriB
BiB
B
V!:
V! !V
V! !V
V!V
V
~:
~ ~
~
Oczywiście, ponieważ jest to gra w golfa , standardowe luki są zakazane, a Twoim celem jest napisanie możliwie najkrótszego programu do wykonania tego zadania. Miłej gry w golfa!
Jeśli chodzi o to, co warto, mam słabość do odpowiedzi na vima, więc wymyślone punkty bonusowe za używanie vima lub V, chociaż każdy język jest akceptowalny. :)
Odpowiedzi:
MATL ,
2114 bajtówMATL życzy V wszystkiego najlepszego!
Wypróbuj online!
Wyjaśnienie
Rozważ dane wejściowe
długości
n=5
. Kod oblicza splot 2D tego ciągu z macierzą tożsamości wielkości2*n
,Wynikiem splotu, przekonwertowanego na char i z char 0 pokazanym jako spacja, jest
Następnie kolumny
[1, 2, ..., 2*n-1, 2*n, 2*n-1, ..., 2, 1]
są wybierane z tej macierzy znaków, co daje pożądany wynik:Skomentowany kod
źródło
V ,
24, 23, 20 bajtówWypróbuj online!
Znacznie krótszy teraz, gdy V ma operator „wstecz” .
Nie tak imponujące w porównaniu z innymi językami golfa, które odpowiedziały, ale trzeba było to zrobić. Hexdump:
Wyjaśnienie:
W tym momencie bufor wygląda następująco:
Nie, rekurencyjnie zbudujemy trójkąt.
Tutaj mogę pokazać jedną z moich ulubionych funkcji V. Wiele poleceń wymaga kłótni. Na przykład
>
polecenie spowoduje wcięcie zmiennej liczby linii w zależności od argumentu:ale większość poleceń będzie musiała zakończyć się domyślnym argumentem (zwykle bieżącym wierszem), jeśli jest na końcu programu i nie jest określony. Na przykład V faktycznie działa dla naszej pętli rekurencyjnej:
Drugi
ò
jest niejawnie wypełniony. Fajne jest to, że niejawnie zakończone polecenia nakładają głębokość na kilka warstw, więc nawet jeśli pisaliśmy tylko>
, V domyślnie poda_
swój argument i wciśnie bieżącą linię.źródło
Brainfuck , 152 bajty
To taka doniosła okazja, postanowiłem wypróbować starego tłumacza BF i dać mu szansę.
Z komentarzami
Wypróbuj online!
źródło
> <> , 221 bajtów
Spędziłem sposób zbyt dużo czasu na to. Wszystkiego najlepszego, V!
Możesz wypróbować go online , ale znacznie fajniej jest zdobyć ten interpreter i uruchomić go przy użyciu
--play
flagico powoduje animację poniżej.
Przykład
(zajmuje to nieco mniej niż dwie minuty)
Wyjaśnienie
Ponieważ interesującą częścią tej odpowiedzi jest zawijanie jej w
V
kształt, oto wyjaśnienie, które jest z nią zgodne. W celach informacyjnych wykorzystujemy następującą wersję o numerze liniowym.Czasami strzałki (→ ↓ ←) służą do wskazania kierunku, w którym osiągnięty został fragment kodu.
Inicjalizacja
Pierwszy wiersz popchnie 2n do [0,1], pozostawi n na stosie i doda jedno spację. Następnie idziemy w górę i owijamy się do drugiej linii po prawej, gdzie zaczniemy iść w lewo. Istnieje pętla do dodawania spacji n + 1 . Działa to w następujący sposób.
Po zakończeniu odbija się do linii 3. Tam dwa górne elementy stosu (0 i spacja) są usuwane (
~~
) i przeskakujemy doX
lokalizacji [10,1] (a1.
), kontynuując w prawo. Podbijamy się/
, zawijamy do linii 7 i uruchamiamy główną pętlę programu.Pętla główna ( 2 razy)
To jest warunek pętli. Początkowo stos jest odwracany do drukowania. Następnie pobieramy licznik z [1,0] (
01g
) i przechowujemy wersję zmniejszoną (:1-01p
). Otaczając się i podbijając w prawo, napotykamy warunek zakończenia programu. Jeśli się nie zakończymy, przejdziemy do pierwszej pętli drukowania.Pierwsza pętla drukująca (lewa połowa)
Zaczynamy od długości na górze stosu i wykonujemy następujący kod, dopóki górny element nie jest równy 0.
Spowoduje to wydrukowanie stosu bez jego odrzucania. Jeśli pętla się kończy, przeskakujemy w prawo na linii 5, przygotowując się do następnej pętli drukowania.
Przygotowanie prawej połowy
To była jedna z najtrudniejszych części do dopasowania. Poniżej znajduje się wersja pozbawiona zawijania wszystkich kierunków, aby wskazać, co się stanie.
Następnie przesuwamy długość tego, co ma zostać wydrukowane, i rozpoczynamy drugą pętlę drukującą (z początkowym duplikatem nie będącym częścią pętli).
Druga pętla drukująca (prawa połowa)
Wykonywany kod jest całkowicie taki sam, jak w pierwszej pętli drukującej, a
o}
umieszczany jest nieco dalej, ponieważ były dostępne lokalizacje. Po zakończeniu mamy jeszcze kilka rzeczy do zrobienia, zanim będziemy mogli ponownie zweryfikować niezmiennik głównej pętli. Po wykonaniu~
on-line 9 owijamy się pionowo, kończąc na kolejnym fragmencie kodu.Najpierw
ao
wydrukuje nowy wiersz. Następnie odbijamy się i docieramy do dokładnie tego samego miejsca po inicjalizacji, czyli przeskakiwania doX
.źródło
Brain-Flak , 486 + 1 = 489 bajtów
Wszystkiego najlepszego V od Brain-Flak!
Również dziękuję 0, którzy dostarczyli część kodu użytego w tej odpowiedzi
+1 ze względu na
-c
flagę, która jest wymagana dla wejść i wyjść ASCIIWypróbuj online!
Jest to bez wątpienia najtrudniejsza rzecz, jaką kiedykolwiek zrobiłem w Brain-Flak.
Brain-Flak jest znany ze strasznego powielania i odwracania łańcuchów, a wyzwanie to składa się wyłącznie z powielania i odwracania łańcuchów.
Udało mi się zdobyć ten prawie działający fragment w niecałą godzinę ciężkiej pracy, ale dodanie kilku ostatnich miejsc okazało się jedną z najtrudniejszych rzeczy, jakie kiedykolwiek zrobiłem w Brain-Flak.
Wyjaśnienie
Podstawową ideą jest to, że najpierw utworzymy górę V, a każda iteracja usunie dwie postacie ze środka i doda spację na początku.
W praktyce staje się to dość trudne.
Istnieją istniejące algorytmy kopiowania i odwracania, więc użyłem jednego z tych, aby utworzyć odwróconą kopię kodu na offstacku. Kiedy to zrobię, kładę
2n-1
spacje na oryginalnym stosie i przesuwam tor z powrotem na stos, aby utworzyć kanapkę.Teraz mamy nasz górny rząd. Teraz chcemy usunąć dwie postacie od początku i dodać spację z przodu. To okazuje się najtrudniejsze. Powodem tego jest to, że musimy zasadniczo przechowywać dwie wartości, jedną dla głębokości bieżącego fragmentu i jedną dla głębokości do środka litery V, w której ma nastąpić usunięcie.
To jest trudne.
Z powodu całego powielania i odwracania, które mają miejsce na obu stosach, cały czas są w pełni wykorzystywane. Naprawdę nigdzie na tych stosach nie można niczego umieścić. Nawet przy całej Magii Trzeciego Stosu na świecie nie możesz uzyskać takiego dostępu, jakiego potrzebujesz, aby rozwiązać ten problem.
Jak to naprawić? Krótko mówiąc, tak naprawdę nie; na razie ignorujemy spacje i łatamy je później, dodamy zera do kodu, aby zaznaczyć, dokąd mają iść spacje, ale poza tym tak naprawdę nic nie zrobimy.
Tak więc na każdej iteracji tworzymy kopię ostatniej iteracji i umieszczamy ją na stosie. Używamy zapisanej głębokości, aby podzielić to na pół, więc mamy lewą połowę V na prawym stosie i prawą połowę V na lewym stosie. Usuwamy dwa elementy i łączymy je z powrotem. Dodajemy nowy wiersz dla lepszej miary i rozpoczynamy następną iterację. Za każdym razem, gdy głębokość do środka V zmniejsza się o jeden, a gdy osiągnie zero, zatrzymujemy pętlę.
Teraz mamy zbudowaną większość V. Brakuje nam jednak odpowiednich spacji, a nasze V jest obecnie nieco (czytaj: całkowicie) do góry nogami.
Więc odwracamy to. Aby przerzucić go na drugi stos, musimy przesuwać każdy element jeden po drugim. Podczas przenoszenia elementów sprawdzamy zer. Jeśli go napotkamy, musimy umieścić spacje w miejscu, do którego należą. Obcinamy zero i dodajemy kilka spacji. Skąd wiemy ile? Śledzimy; przerzucanie stosu w przeciwieństwie do powielania lub odwracania jest bardzo nie wymagającym zadaniem, więc faktycznie mamy pamięć do przechowywania i dostęp do dodatkowego licznika, aby śledzić, ile spacji dodać. Za każdym razem, gdy dodajemy spacje, zmniejszamy licznik o jeden. Licznik powinien trafić zero na ostatnim nowym wierszu (na górze litery V) i dlatego jesteśmy gotowi do drukowania.
Na koniec usuwamy kilka nierozstrzygniętych spraw i kończymy program w celu uzyskania niejawnego wyniku.
źródło
-r
flagę?-r
flagę, będę musiał ją odwrócić innym razem. Jest już późno, ale jestem przekonany, że jutro będę starał się znacznie zagrać w golfa. Jeśli uda mi się rozwiązać problem ze spacjami, na pewno użyję-r
flagi.Galaretka ,
1512 bajtówWypróbuj online!
Jak to działa
źródło
Python 3 , 65 bajtów
Wypróbuj online!
Python 2 , 65 bajtów
Wypróbuj online!
źródło
JavaScript (ES6),
1081069894 bajtówźródło
n*2
przezn*4
(w tym znaki nowej linii na końcu każdej linii). Następnie obliczam znak, który powinien pojawić się w każdej komórce.f=
is=>
.f=
tylko część fragmentu, a nie odpowiedź. Jako taki nie jest uwzględniany w liczbie bajtów.Retina ,
5147 bajtówWszystkiego najlepszego z innego języka przetwarzania łańcuchów!
Liczba bajtów zakłada kodowanie ISO 8859-1.
Wypróbuj online!
Wyjaśnienie
To dodaje
n
spacje (gdzien
jest długością łańcucha), dopasowując koniec łańcucha, wyszukując długość łańcucha$.`
i powtarzając spację, z którą wiele razy$*
.Duplikujemy cały ciąg (oddzielony linią), ponownie dopasowując koniec łańcucha i wstawiając sam łańcuch
$`
.To odwraca drugą linię, dopasowując od prawej do lewej (
r
), a następnie dopasowując jeden znak na raz (.
), ale upewniając się, że wszystkie są sąsiadujące (\G
). W ten sposób mecze nie mogą przekroczyć linii. Jest to następnie wykorzystywane na etapie sortowania. Używając trybu sortowania według ($
), ale zastępując każde dopasowanie pustym ciągiem, rzeczywiste sortowanie nie jest wykonywane. Ale z powodu tej^
opcji dopasowania są odwracane na końcu, odwracając całą drugą linię.Ten etap dotyczy danych wyjściowych i wpływa również na resztę programu.
{
opakowuje pozostałe etapy w pętlę, która jest powtarzana, dopóki etapy nie zmienią łańcucha (co się stanie, ponieważ ostatni etap nie będzie już pasował).;
Wyjście wyłącza na końcu programu. Te*
zakręty tym etapie na sucho, co oznacza, że scena jest przetwarzany, a wynik jest drukowany, ale potem poprzedni ciąg zostanie przywrócony.Sam etap usuwa po prostu kanał i poprzedni znak. Co daje nam jeden wiersz pożądanego wyniku (zaczynając od pierwszego wiersza).
Wreszcie ten etap zamienia każdą linię w następną. Odbywa się to przez wstawienie spacji przed pierwszym znakiem spacji, usunięcie ostatniego znaku w pierwszym wierszu, a także pierwszego znaku w drugim wierszu. Proces ten kończy się, gdy w pierwszym wierszu pozostanie tylko jeden znak spacji, który odpowiada ostatniemu wierszowi wyniku.
źródło
s///
znaki, które się sumują, na dłuższe odwracanie łańcucha i inne operacje, które nie mają nic lepszego niż Retina. Dobra lektura. +105AB1E , 12 bajtów
Wypróbuj online!
Wyjaśnienie
Lub dla tej samej liczby bajtów z drugiego kierunku.
Wyjaśnienie
źródło
Japt,
22201614 + 2 bajtyJapt życzy V wielu kolejnych udanych lat gry w golfa!
Wymaga
-R
flagi. Przetestuj online!Wyjaśnienie
Korzysta z funkcji
ç
i,î
które dodałem kilka dni temu:Technika Dennisa jest dłuższa o bajt:
źródło
GNU sed ,
110100 + 1 (flaga r) = 101 bajtówEdycja: 9 bajtów krótszych dzięki Riley
Jako kolejny język manipulacji ciągami, sed życzy V wszystkiego najlepszego!
Wypróbuj online!
Objaśnienie: zakładając, że dane wejściowe są ostatnim przypadkiem testowym („V!”). Dla jasności pokażę przestrzeń wzoru na każdym kroku, zastępując spacje literami „S”.
źródło
Python, 110 bajtów
Wypróbuj online!
Jestem pewien, że nie jest to optymalne, ale przynajmniej jest dość Pythoniczne:
źródło
Jolf, 31 bajtów
Jolf niechętnie życzy V wszystkiego najlepszego!
Wypróbuj tutaj!
␅
powinno być 0x05.Wyjaśnienie
źródło
Węgiel drzewny , 29 bajtów
Wszystkiego najlepszego V, z twojego rozczarowującego języka ASCII-art!
Wypróbuj online!
Wyjaśnienie
Nasza strategia: wydrukuj lewą połowę litery V, zaczynając od dołu i przechodząc do lewej górnej; następnie odzwierciedl to.
(Gdyby tylko węgiel drzewny miał przecinanie sznurka ... niestety, wygląda na to, że nie został jeszcze zaimplementowany).
źródło
CycleChop
, który można wykorzystać do wydobycia główki sznurka, oszczędzając w ten sposób 4 bajty. Istnieje jednak lepsze podejście, które pozwala zaoszczędzić 9 bajtów. Pewne dodatkowe oszczędności, które, jak sądzę, działały w tym czasie:Reflect
domyślnie odzwierciedlają prawo, zapisują kolejny bajt, a jedna ze zmiennych jest predefiniowana dla pierwszego wejścia, oszczędzając dwa bajty.Pip ,
3225 bajtówBierze ciąg wejściowy jako argument wiersza polecenia. Wypróbuj online!
Wyjaśnienie
źródło
R z pakietem stringi, 225 bajtów
Jeśli uruchamiasz R w interaktywnym kodzie, po wklejeniu mojej odpowiedzi po prostu wpisz cokolwiek. Będziesz musiał zainstalować pakiet stringi R (mam nadzieję, że nie jest to niezgodne z regułami).
Wyjaśnienie:
Podstawowym pomysłem jest dodanie spacji do lewej strony, a następnie przycięcie jej na odpowiednią długość. Następnie wklej go z odwróconą wersją jako prawą stronę. Oto dłuższa, czytelna dla człowieka wersja funkcji:
źródło
Ruby,
928985 bajtówMój proces polegał na usunięciu pierwszego znaku z prawej połowy każdej linii po odwróceniu pierwszej połowy. Lubię to:
Nie jestem przyzwyczajony do gry w golfa, więc daj mi znać, jeśli mogę coś zrobić, aby skrócić.
źródło
Partia,
186185 bajtówLinie 1 i 6 mają spację końcową. Edycja: Zapisano 1 bajt dzięki @ ConorO'Brien.
źródło
@set
i usuń@echo off
, wstawiając@
w razie potrzeby.set
s zaoszczędziłoby mi wystarczającej ilości bajtów, aby było warto.Haskell , 76 bajtów
v
jest główną funkcją, biorącString
argument i dającString
wynik.Wypróbuj online!
Uwagi:
i
jest początkowym argumentem / danymi wejściowymi.s
jest początkowoi
zlength i
dołączonymi spacjami.v i
wywołujer s
, a następnie dołącza do linii wynikowych.r
zwraca listęString
linii.t
jests
z odciętą ostatnią postacią.r t
tworzy linie oprócz pierwszej, minus początkowa spacja na każdej linii.źródło
v
. : Dunlines.r.((++)<*>(' '<$))
.Galaretka , 13 bajtów
Wypróbuj online!
W jaki sposób?
źródło
Rubinowy,
8583 bajtówedycja: usunięto nadmiar białych znaków
Naprawdę trudno mi było grać w golfa w Ruby. Po dodaniu spacji rozwija się do całkiem czytelnego fragmentu kodu:
źródło
s=ARGV[0];(s+=' '*s.size).size.times{|i|puts s+s[i..-2].reverse;s=' '+s[0..-2]}
MATLAB (R2016b),
223183 bajtówGra w golfa po raz pierwszy. Wskazówki są mile widziane!
Wyjście programu:
Edytować:
Zaoszczędzono 40 bajtów dzięki Luisowi Mendo.
źródło
's'
zinput
. Nie rozumiem też, dlaczego używaszevalc(disp(...))
, ale myślę, że możesz po prostu użyćcell2mat
tego w ten sposóbflip
jest krótszy niżend:-1:1
, patrz tutajPHP,
959285807877 bajtówUwaga: używa kodowania IBM-850
Uruchom tak:
Wyjaśnienie
Poprawki
str_pad
domyślnie spacja, czego potrzebujemy)substr
~"0"
sprawy (ASCII 207), ponieważ można przyjąć, że wszystkie dane wejściowe można wydrukować jako ascii (Thx @Titus)źródło
echo$s,strrev($s=" $s"^$s^$s),~§;
oszczędza 5 bajtów.~$s[$i++]
jest wystarczające (dane wejściowe można wydrukować w formacie ASCII, i tak też jest$s
)JavaScript (ES6),
169157 bajtów(-10 bajtów dzięki Conorowi O'Brienowi)
Rozwiązanie rekurencyjne. Jestem nowy w JavaScript, więc proszę, bądź delikatny! Wszelkie wskazówki dotyczące gry w golfa są bardzo mile widziane. :)
I, oczywiście, wszystkiego najlepszego z okazji urodzin
V
!Test Snippet
Pokaż fragment kodu
źródło
s.split("")
można zmienić[...s]
, ia.join("")
może zostaća.join
następnie przez parę backticks. Możesz zaoszczędzić dodatkowe 3 bajty poprzez zastąpienie[r='repeat']
i[r]
z powtórzeniem Plain ol”, z tym samymslice
.CJam , 26 bajtów
Wszystkiego najlepszego od twojego starego kumpla CJama!
Wypróbuj online!
Wyjaśnienie
źródło
PowerShell,
126 bajtów124 bajtyNazwij to jednym parametrem, takim jak
.\V.ps1 Hello
.Edycja: 2 bajty zapisane z końcówką z AdmBorkBork
źródło
$l=($s="$args")|% Le*;
Pyke , 14 bajtów
Wypróbuj online!
źródło
JavaScript (ES6), 94 bajty
Przypadki testowe
Pokaż fragment kodu
źródło
J, 44 bajtów
źródło
|."0 1
do|."{
(zapisane 2 bajty)