Napisz program lub funkcję, która przyjmuje dodatnią liczbę całkowitą (za pomocą stdin, wiersza poleceń lub funkcji arg) i wypisuje lub zwraca ciąg wielu z tych małych trójkątów połączonych ze sobą, naprzemiennie w taki sposób, w jaki wskazują:
/\
/__\
Ten jedyny trójkąt jest wyjściem, jeśli wejście jest 1
.
Jeśli wejście jest 2
, wyjście jest
____
/\ /
/__\/
Jeśli wejście jest 3
, wyjście jest
____
/\ /\
/__\/__\
Jeśli wejście jest 4
, wyjście jest
________
/\ /\ /
/__\/__\/
I tak dalej. Twój program musi obsługiwać wejścia do 2 16 - 1 = 65535.
Detale
- Najbardziej wysunięty w lewo trójkąt zawsze wskazuje w górę.
- Mogą występować spacje końcowe, ale może nie być niepotrzebnych spacji wiodących.
- Może występować opcjonalny znak nowej linii.
- Zauważ, że na
1
wyjściu są dwa wiersze, ale w przeciwnym razie trzy. To jest wymagane. - Najkrótsze przesłanie w bajtach wygrywa.
SQL,
182175173187 bajtówNie, żeby to kiedykolwiek było najkrótsze, ale nadal zabawnie jest próbować zminimalizować sql;) lol Zrobiłem to w Oracle 11, jednak powinny to być podstawowe SQL. [edytuj], jak wskazano, nie zastosowałem reguły when input = 1 - pokaż tylko 2 linie. nie mogę wymyślić lepszego sposobu, aby to zrobić, jednak zaoszczędziłem kilka bajtów, modyfikując logikę v;) dodanie 2 z wyprzedzeniem pozwala zaoszczędzić kilka bajtów, ponieważ nie muszę powtarzać tego później [/ edit]
[edit1] usunął niepotrzebne spacje [/ edit1] [edit2] zmienił && i na just & i. Zmniejsza 2 znaki, ale zmusza użytkownika do dwukrotnego wprowadzenia # trójkątów ...: PI zdał sobie sprawę, że moje „dobre nawyki kodowania” przy użyciu && i kosztowały 2 bajty !! Horror!! [/ edit2]
Objaśnienie (uwaga: używam && 1 w tym objaśnieniu, więc pyta tylko raz, powyższy & 1 oszczędza miejsce na kod, ale pyta wiele razy;))
Wynik
źródło
from
? Jeśli tak, uratuje ci to bajt.Python 2,
8988878583 o nazwie / 81 bez nazwy(Dzięki @orlp za bajt i @xnor za kolejne trzy)
Jest to funkcja, która przyjmuje wartość int
n
i zwraca trójkąty jako ciąg znaków, stosując podejście rząd po rzędzie.np.
print f(10)
dajeW pierwszym rzędzie zamiast
(n>1)*
używamy1%n*
, ponieważ1%n
wynosi 0 ifn == 1
i 1 ifn > 1
.źródło
" /\\ "
w" /\ "
."\n".join()
do 3 elementów, nawet jeśli lista służy do warunkowego usunięcia pierwszego elementu. Być może coś takiegob*(x+"\n")+y+"\n"+z
jest krótsze?JavaScript (ES6), 101
109Zbyt długo
Wyjaśnienie
Używanie grubej strzałki do definicji funkcji. Ponadto brak
{}
bloku: ciało funkcji jest pojedynczym wyrażeniem, które jest wartością zwracaną.f=(a,b,c)=>expr
jest równaWewnątrz jednego wyrażenia nie można używać instrukcji takich jak
if
lubvar
, ale?:
działają dobrze zamiastif else
w
jest drugim (nieużywanym) parametrem funkcjiz
Możemy przepisać
f
funkcję jakoTest w konsoli Firefox / FireBug
Wynik
źródło
w
n=>(n>1?' '+'____'.repeat(n/2)+'\n':'')+' /\\ '.repeat(n).slice(0,n*2+2-n%2)+'\n'+'/__\\'.repeat(n).slice(0,n*2+1+n%2)
119 (celowo nie używając ciągów szablonów itp., Aby dopasować odpowiedź).CJam,
555351 bajtówPróbowałem przenieść moją odpowiedź w języku Python i okazało się, że jest krótsza niż inne CJamy.
Permalink .
źródło
Haskell
155153139131 bajtówZnalazłem nieco inne podejście, które okazało się krótsze niż moja pierwotna metoda. Moja oryginalna próba została zachowana poniżej. Tak jak poprzednio, wskazówki dotyczące gry w golfa są mile widziane.
Dzięki Nimi za wskazówki dotyczące gry w golfa.
Poprzednia próba
197179 bajtówźródło
(mod n 2)==0
jesteven n
lub lepiej użyćodd n
i zamienić częśćthen
ielse
.concat.take(div n 2).repeat
totake(4*div n 2).cycle
dlatego, że wszystkie elementy listy mają długość 4. Przypisz krótkie nazwy do funkcji o długich nazwach, np.z=zipWith
- następnie użyjz
. Możesz wykopać kilka pól...repeat""else[...
.foldr z["","",""]
jestfoldr1 z
, ponieważ lista do złożenia nigdy nie jest pusta. Zamiast tegoall(==' ')
możesz użyć==" "
(<- dwie spacje między nimi), ponieważ służy on do usuwania pustej linii w przypadku n = 1, a tutaj jest pierwsza linia" "
. Pierwsza definicjat
może być napisany w jednym wierszu:t n|odd...
.CJam,
7368636260 bajtówTo zdecydowanie wymaga gry w golfa ...
Sprawdź to tutaj.
Wyjaśnienie
źródło
Julia, 115 bajtów
Tworzy to nienazwaną funkcję, która akceptuje liczbę całkowitą i drukuje trójkąty. Aby to nazwać, nadaj mu nazwę, np
f=n->(...)
.Niegolfowane + wyjaśnienie:
Przykładowe dane wyjściowe:
Jestem dość zaskoczony, że to tak długo. Jestem pewien, że istnieje wiele możliwości gry w golfa, ale w tej chwili nie są dla mnie jasne. Daj mi znać, jeśli masz jakieś sugestie lub dodatkowe wyjaśnienia!
źródło
CJam,
68 6260 bajtówO ile widzę, jest to zupełnie inne podejście niż inne rozwiązanie CJam. Można w to dużo grać w golfa.
Wypróbuj online tutaj
źródło
C # 190
Bez golfa
źródło
while
pętli, a raczejfor
pętli. W takim przypadku możesz zaoszczędzić 2 bajty, włączając definicjęm
w inicjalizacji pętli for, ab=!b
na końcu, jak to się nazywa. Można również dokonać oszczędności przez zastąpieniestring
ibool
zvar
. Nie potrzebujesz także „()” wokółn>1
klauzul, a ws+=
klauzuli możesz użyć zwarcia,&
a nie&&
ponieważ nie ma żadnych skutków ubocznych lub dereferencji, które mogłyby się nie udać. Wreszcie1>0
jest krótszy niżtrue
;)C #,
257183 bajtówEdycja: Dzięki wskazówkom @VisualMelon zapisano 74 bajty.
Wiem, że nie jest to najlepszy język do gry w golfa, ale najbardziej interesuje mnie nauka o różnych niuansach C #, niż wygrywanie zawodów. Jest to w zasadzie port tej odpowiedzi w języku Pyth.
Myślę, że pętle for można by dalej grać w golfa, ale nie jestem do końca pewien, jak, biorąc pod uwagę zawarte w nich trzeciorzędowe stwierdzenia.
Przykład (1, 2, 3, 10):
Nie golfowany:
źródło
s+=
jest twoim przyjacielem. Rzeczywiście, jesteś za pętle mogą być nieco bardziej kompaktowe. Radość / horror operatorów++
i--
oznaczają, że możesz wykonać większość pracy w ramach kontroli warunkowejfor(i=0;i++<=t;)
(to sprawdza, czyi
jest mniejsza lub równa,t
a następnie ją zwiększa). Dobrze byłoby zdefiniowaćint i
zewnętrzną pętlę for i użyć jej ponownie, a ponieważ możesz zagwarantować, żei
nigdy nie będzie ona ujemna,i%2==0
możesz ją zamienići%2<1
. Dzięki tym zmianom można łatwo uzyskać wynik poniżej 200 bajtów.Enumerable
zwykle wymagausing System.Linq
dyrektywy i myślę, że generalnie zamierzone jest włączenie takich klauzul. Jednak w tym przypadku jedyny LINQ można zastąpić,var s=" "+string.Join("____",new string[1+t/2])+n;
który nie zawiera LINQ i jest krótszy niż obecny kod;) Łączy wiele ciągów zerowych z tym, na czym nam naprawdę zależy, „____” (1 + t / 2 ponieważ potrzebujemy kolejnego łańcucha zerowego, aby pasował do innego „____” wcześniej). Zmiennan
jest zadeklarowana jako „\ r \ n”.Console.Write
zamiastConsole.WriteLine
Java, 185
Wyjaśnienie
źródło
C # -
151146141138Zainspirowany odpowiedzią @ bacchusbeale
Bez golfa
źródło
new String
jest dla mnie nowe! Wygląda na to, że przegapiłeś swojąt=""
wersję z golfem, choć lepiej byłoby zainicjować jąt
jako „\ n”. Można zaoszczędzić kilka bajtów przez dołączenie dot
której klapkib
, oszczędzając „{}” na pętli for:t+=(b=!b)?"/":"__\\"
.t
przeds
i dodaćt
do łańcucha zamiast"\n"
;)Iść,
156144Nie golfowany:
Jedyną prawdziwą sztuczką (i wcale nie jest dobrą) jest użycie 3 akumulatorów, dzięki czemu mogę skondensować rozwiązanie do 1 pętli.
Kod można uruchomić tutaj: http://play.golang.org/p/urEO1kIjKv
źródło
c += `__\`
zamiastif i<n{c+="_"}
> <> (Ryby) ,
215183156 bajtówEdycja: Notepad ++ dał mi 5 dodatkowych bajtów z powodu CR, więc zmodyfikowane liczniki odpowiednio
Nieco bardziej golfowy, ale to jak dotąd mój pierwszy program rybny> _ <Wymóg, aby nie mieć pustej pierwszej linii dla 1 trójkąta, podwoił rozmiar programu.
Może przetestować na http://fishlanguage.com/ (Int na początkowym stosie dla długości)
Wyjaśnienie:
źródło
perl
109108106Myślę, że to jest w porządku dla mojego pierwszego golfa, użyłem sekcji Vynce dla pierwszej linii, z resztą mojego kodu, aby ominąć nowy problem z 1 trójkątem.
Teraz sprawdź, czy uda mi się to skrócić :)
Edycja : białe znaki
Edycja 2 : zastąpiona
"\n"
przez$/
źródło
C89, 150
Wersja bez golfa:
Wyjście:
Stos przepełnia się, jeśli wejdę
65535
(ale nie jeśli się kompilujesz-O3
!), Ale teoretycznie powinien działać ;-)edit: program spełnia teraz wymaganie, aby wyprowadzić tylko dwa wiersze, jeśli
1
zostanie przekazany do programu edit 2: użyjint*
zamiastchar*
źródło
main
jakomain(c,v)**v;
czy zadziała.c
lubn
jako zmienną globalną, dzięki czemu nie trzeba przechodzić ten parametrr()
. Nie wydaje mi się, żeby twoja odpowiedź była zgodnaNote that for 1 the output is two lines long but otherwise it's three. This is required.
error: expected declaration specifiers before ‘*’ token main(c,v)**v;{
n
lubc
też krótszego.int**
?C ++ stdlib, 194 bajty
Program testowy:
źródło
Bash,
166127125119105 bajtówW funkcji:
Z niektórymi prezentacjami:
Może renderować (jeśli masz zainstalowany figlet ):
Zapisz 2 znaki, jeśli wprowadzasz zmienną zamiast
$1
: 103W pętlę:
Czyni (w przybliżeniu) to samo:
źródło
Węgiel drzewny , 27 bajtów (niekonkurencyjny)
Niekonkurencyjny, ponieważ język jest późniejszy niż wyzwanie.
Wypróbuj online! Link jest do pełnej wersji kodu. Wyjaśnienie:
Wygeneruj listę naprzemiennych bitów długości
n
i zapętl je.Rysuj
____
bez przesuwania kursora.Na pierwszym i co drugim trójkącie narysuj lewą
/
stronę.Narysuj
\
bok bez poruszania kursorem.Na drugim i co drugim trójkącie narysuj
\
ponownie lewą stronę, aby przesunąć kursor.Na drugim i co drugim trójkącie narysuj prawą
/
stronę, nie przesuwając kursora.źródło
PowerShell ,
11695 bajtówOgromne podziękowania dla Mazzy i ASCII-Only za oszczędność 21 bajtów
Wypróbuj online!
Nie zezwalając na pustą linię dla n = 1 zjadł jak
1410 bajtów. To rozwiązanie jestcałkiem martwe jak mózg,teraz znacznie mądrzejsze przy minimalnej ilości powtarzanego kodu. Zaokrąglanie bankierów to wciąż prawdziwy diabeł.źródło
C, 368 bajtów
To więcej, jeśli policzysz
#include
instrukcje, ale skompilowane na gcc, choć z ostrzeżeniami, bez nich. Wiem, że zdecydowanie nie jest najkrótszy, ale nadal podoba mi się, że zrobiłem to w C.źródło
#define p(c)printf(c)
jest krótsze niż twoja funkcja. Możesz pominąć typy zwracane przez funkcje (domyślnie są toint
). Możesz także zdefiniować funkcję wC89
takim stylumain(c,v)char**v;{}
. To krótkoint main(int c, char** v){}
Perl (prosty)
131125120dość proste pierwsze przejście:
och, kto potrzebuje wyraźnej int?
źródło
Prolog, 126 bajtów
Wywołaj jak
$3
.Bardziej czytelny:
Przykład:
źródło
C #: 1 wiersz LINQ, 198 bajtów
źródło
Siatkówka , 88 bajtów (niekonkurencyjne)
Niekonkurencyjny, ponieważ język jest późniejszy niż wyzwanie.
Wypróbuj online! Wyjaśnienie:
Zastąp dane wejściowe parą trójkątów.
Pomnóż trójkąty przez oryginalne wejście.
Podziel trójkąty przez 2.
Usuń lewy pół trójkąt.
Usuń pierwszy wiersz, jeśli jest teraz pusty.
źródło
Perl 6 , 83 bajtów
Wypróbuj online!
Anonimowy blok kodu, który pobiera liczbę i zwraca ciąg znaków.
źródło
C (gcc) ,
117115 bajtów-2 dzięki pułapkowi cat.
Wszystkie te nawiasy sugerują, że coś mniej niezgrabnego jest z pewnością możliwe.
Wypróbuj online!
źródło
05AB1E , 37 bajtów
Wypróbuj online lub sprawdź pierwsze 10 wyników .
Wyjaśnienie:
źródło
Java 11, 122 bajty
Wypróbuj online.
Wyjaśnienie:
źródło