Mój kolega niedawno przesłał mi jako żart następujący fragment JavaScript:
let butScript = (nrOfButs) => {
for(var i = 0; i < nrOfButs; i++){
if(i % 3 == 0){
console.log("Yeah")
}
if(i % 2 == 0){
console.log("But")
}
if(i % 3 == 1){
console.log("No")
}
}
}
Ponieważ kod został napisany w godzinach pracy, było to oczywiście ogromne marnotrawstwo zasobów firmy. Aby zapobiec podobnym zdarzeniom w przyszłości, musimy zminimalizować marnowanie przepracowanych godzin. A ponieważ powszechnie wiadomo, że krótszy program jest szybszy do napisania, musimy zagrać w ten kod, aby był jak najkrótszy!
Wejście
Pojedyncza nieujemna liczba całkowita. Nie wolno obsługiwać błędnych danych wejściowych.
Wynik
Twój program musi generować dane wyjściowe identyczne jak w powyższym skrypcie. Powinieneś wypisać jedno słowo w wierszu, a liczba słów powinna być zgodna z oryginalnym skryptem.
Dozwolone jest umieszczanie znaków spacji nie-nowej linii na końcu każdej linii (ale nie na początku), ponieważ są one niewidoczne. Jeden dodatkowy znak nowej linii jest dozwolony na samym końcu danych wyjściowych.
Przykłady
Input: 0
Output:
Input: 1
Output:
Yeah
But
Input: 2
Output:
Yeah
But
No
Input: 10
Output:
Yeah
But
No
But
Yeah
But
No
Yeah
But
No
But
Yeah
nrOfButs
zmienna jest raczej źle nazwana i wprowadza w błąd. W każdym razie całkiem proste wyzwanie.if
spadek koryta i kontynuuj w bieżącej pętli, jeśli ich warunek jest spełniony.Odpowiedzi:
Excel, 78 bajtów
Zakłada wejście w komórce A1 i formatowanie Wordwrap jest włączone dla komórki. Użyj Alt + Enter, aby dodać informacje o wierszach w ciągu i zwróć uwagę na białe znaki. Obsługuje tylko dane wejściowe do 3570 ze względu na limit funkcji REPT (powodzenia, aby komórka była tak wysoka).
Przedruk, z kropkami na białe znaki
Jak to działa: wzór powtarza się co 6 liczb:
Każdy z nich można wyrazić za pomocą 9 znaków, więc ciąg znaków składa się z 54 znaków (9 * 6), a następnie powtarzany tak długo, jak pozwala na to Excel. Następnie jako wynik przyjmuje lewe 9 * (liczba znaków wejściowych).
Podawanie wiersza dla „ale i nikt” nie jest umieszczane za pustym miejscem, tak że Yeah dla # 6, # 12, (itd.) Jest formatowany po lewej, a nie po prawej stronie, i że nie ma dodawanego pustego kanału co 6 linii dla tego przedmiotu.
źródło
JavaScript (ES6),
5957 bajtówWypróbuj online!
W jaki sposób?
Używamy funkcji rekurencyjnej, która przechodzi od do 1 zamiast od 0 do n - 1 .n 1 0 n - 1
W rezultacie testy są wyłączone o porównaniu z kodem referencyjnym:1
Dzięki temu możemy zapisać prostszą wielkość liter jako pierwszy wpis w naszej tablicy odnośników, w której możemy zdefiniować : zmienną zawierającą jeden lub pusty ciąg znaków.sn ≡ 0( mod3 ) s
"But\n"
Dwa pozostałe wpisy są zdefiniowane odpowiednio
"Yeah\n" + s
is + "No\n"
.Uwaga: Poprzez iterację od do , moglibyśmy również zdefiniować w pierwszym wpisie, ale to kosztowałoby dwa dodatkowe nawiasy .0 sn - 1 0 s
Skomentował
źródło
LOLCODE , 257 bajtów
Wypróbuj online!
źródło
VISIBLE "But"
odnosi się do braku spodni w programie?Biała spacja ,
315304300277276 bajtówDzięki @JoKing za -11 bajtów (zmniejszenie liczby używanych etykiet z 8 do 7) i -24 dodatkowych bajtów (zmiana ogólnego przebiegu programu i zmniejszenie ilości używanych etykiet z 7 do 5 w procesie).
Litery
S
(spacja),T
(tab) iN
(nowa linia) dodane tylko jako wyróżnienia.[..._some_action]
dodano tylko jako wyjaśnienie.Wypróbuj online (tylko z surowymi spacjami, tabulatorami i nowymi wierszami).
Biała spacja zdecydowanie nie jest właściwym językiem dla tego wyzwania. W białej spacji zarówno pętle, jak i instrukcje if są tworzone za pomocą etykiet i skoków do etykiet, a ponieważ nie są to przypadki if-elseif-else, ale wiele przypadków if,
oznacza to,że I będę musiał cofać się co każde, co czyni go dość długim, oznacza to, że będę musiał nieco zmodyfikować kontrole, aby pominąć niektóre odbitki (dzięki @JoKing ).Objaśnienie w pseudo-kodzie:
Dodatkowe wyjaśnienie:
Ogólnie rzecz biorąc, pętla od wejścia w dół do 0, przesuwając nowy wiersz i słowo odwrócone (więc w kolejności „\ noN”, „\ ntuB”, „\ nhaeY” zamiast „Yeah \ n”, „Ale \ n ”,„ Nie \ n ”). A gdy wejście zapętli się do 0 i wszystkie znaki znajdą się na stosie, wydrukuje te znaki w odwrotnej kolejności (więc w prawidłowej kolejności wyjściowej).
Bardziej dogłębnie: chociaż musimy wydrukować słowa z zakresu
(input, 0]
, zapętli się ono w zakresie[input, 0)
. Z tego powodu możemy użyć czekuif(i%3 == 2)
dla „\ noN” (lub faktycznieif(i%3 != 2)
pominąć wypychanie „\ noN”) i możemy użyć czekuif(i%2 != 1)
dla „\ ntuB” (lub faktycznieif(i%2 == 0)
pominąć naciśnięcie „\ ntuB” ). Dopiero po tych dwóch kontrolach zmniejszamy iteracjęi
o 1. Następnie wykonujemyif(i%3 == 0)
czekanie, aby wypchnąć „\ nhaeY”, podobnie jak w przykładowym kodzie JS w opisie wyzwania. Pomijanie z czekami if-not zamiast przejścia do etykiety i powrót z etykiety z if-czekami zapisanymi 23 bajty.Również w białych znakach wartości znaków są przechowywane na stosie jako ich wartości Unicode (tj.
10
Dla nowych wierszy,65
dla „A”,97
dla „a” itd.). Ponieważ muszę już zapętlić stos, aby wydrukować znaki, mogę również użyć mojej białej końcówki, aby obniżyć liczbę bajtów, dodając stałą do wartości liczbowych, przed wydrukowaniem ich jako znaków.Ta stała jest
104
w tym przypadku generowana za pomocą tego programu Java , którego wcześniej użyłem również do gry w golfa w innej odpowiedzi Whitespace . To jest również powód, dla którego ta część kodu:ma wartości
-94
dla nowej linii,7
dla „o” i-26
dla „N”. Ponieważ dodanie stałą104
poprawnie dać nasze wartości Unicode10
,111
oraz78
dla tych znaków odpowiednio.źródło
if i modulo-3 != 1 jump to next if else push NO
i
przedif(i is 0) call PRINT
prawdą, ale twój drugi to sprawdzaniei
przed odjęciem i pomijanie wydruków. Właściwie całkiem sprytny. Będzie nadal go wdrażać.Python 3 ,
8582 bajtówWypróbuj online!
Python 3 ,
7976 bajtówPort Keeta „s odpowiedź Excel .
Wypróbuj online!
źródło
Perl 6 ,
6350 bajtówWypróbuj online!
Anonimowy blok kodu, który pobiera liczbę i zwraca listę wierszy
Wyjaśnienie:
źródło
C (gcc) , 75 bajtów
Wypróbuj online!
C (gcc) , 60 + 11 = 71 bajtów (użycie
-D$=||puts(
)Wypróbuj online!
źródło
05AB1E (starsza wersja) ,
272524 bajtówZaoszczędził 1 bajt dzięki Kevinowi Cruijssenowi .
Wypróbuj online!
Wyjaśnienie
źródło
×
, nie myślałem o tym!Θ
teraz, z którego już nie korzystasz×
, ponieważÏ
będzie patrzeć tylko na1
s, więc ignoruje2
(i0
oczywiście).Python 2 , 73 bajty
Wypróbuj online!
źródło
Python 2 ,
979592908381 bajtówWypróbuj online!
-2 bajty, dzięki ovs
Python 3 ,
92908583 bajtówWypróbuj online!
-4 bajty, dzięki ovs
-4 bajty, dzięki Jo King
źródło
len(w)<3
->'N'in w
, 81 bajtów :len(w)%2
->(w<'N')
Płótno , 27 bajtów
Wypróbuj tutaj!
źródło
Groovy (funkcja), 79 bajtów
Od czasu przesłania mojej odpowiedzi przejrzałem tutaj kilka historycznych dyskusji na temat tego, co stanowi odpowiednią odpowiedź. Ponieważ wydaje się powszechnie akceptowane dostarczanie tylko metody w Javie (w tym deklaracji typu i deklaracji parametrów), oto krótsza, Groovy, metoda, której odpowiedzią jest wartość zwracana przez metodę. Zastosowanie
def
oznacza, że wywodzi się typ zwrotu.W przeciwieństwie do oryginalnej odpowiedzi poniżej, która zapętla się od 0 do n-1, ta wywołuje się od n do 1, ale zmniejsza wejście dla reszty linii w wywołaniu rekurencyjnym.
Wypróbuj online!
Groovy (program), 87 bajtów
Skrypty Groovy nie wymagają pewnych wspólnych importów, więc może to być program drukujący odpowiedź na STDOUT Javy bez konieczności
System.out.
wcześniejszego deklarowaniaprint
. Zapewnia także niektóre typowe metody narzędzi, takie jak ta,toLong()
która pozwala nam rozsądnie i dokładnie analizować argument wejściowy.Zasadniczo odpowiedź na Javę 10, ale wykorzystując krótszą składnię pętli Groovy i zdolność do oceny prawdziwych stwierdzeń.
Wypróbuj online!
źródło
Retina 0.8.2 , 45 bajtów
Wypróbuj online! Wyjaśnienie:
Przekształć dane wejściowe w jednoargumentowe.
Dla każdej liczby całkowitej
0...n-1
wygeneruj trzy wiersze tekstu, po jednym dla każdego słowa, każdy zei
1
znakiem s przed nim, z wyjątkiemNo
, który ma dwa dodatkowe1
s, aby obliczyć,(i+2)%3==0
który jest równoważnyi%3==1
.Usuń pary
1
s przedB
s.Usuń
1
s w grupach po trzy wszędzie.Usuń wszystkie linie, które nadal mają
1
.źródło
11No¶
jak obliczyć(i+2)%3==0
(więc wszystkie trzy są sprawdzane, jeśli==0
), wygląda to tak oczywisto, ale sam bym o tym nie pomyślał, więc jest to naprawdę genialne. +1 ode mnie, fajna odpowiedź!Java 10,
10099 bajtów-1 bajt dzięki @ OlivierGrégoire .
Wypróbuj online.
Wyjaśnienie:
źródło
++i%3>1
prawdopodobnie uratuje ci bajtPowerShell,
7574726766 bajtów-1 bajt dzięki TessellatingHeckler
Skrypt testowy i objaśnienie:
Wynik:
Prosty skrypt, 72 bajty:
źródło
======
. GenerujeYeah,But,No
tylko ciągi znaków. Skrypt testowy pokazuje separator dla łatwiejszego odczytu tylko wyników.(" Yeah\nBut No But Yeah But\nNo "*($j="$args")|% s*t 32)[1..$j]-ne''
Haskell , 71 bajtów
Wypróbuj online!
Wyjaśnienie
Całkiem proste, zaoszczędzono dwa bajty, używając
[1..n]
zamiast[0..n-1]
i dostosowano pozostałe: Operator(?)
Testy przyjmują cztery argumenty, zwracając pustą listę lub podany ciąg znaków jako singleton, jeśli wynik jest poprawny.Curryując czwarty argument
(?)
, możemy skorzystać z(<>)
konkatenacji wyników każdej funkcji, tj .:źródło
C # (interaktywny kompilator Visual C #) ,
10599949689bajtówWypróbuj online!
źródło
x++%3==1?
może być++x%3>1?
. Ktoś inny dał mi napiwek dla mojej odpowiedzi Java, ale to samo dotyczy twojej odpowiedzi w języku C #. :)Pip ,
373533 bajtów(Zwróć uwagę na spację po
But
.) Pobiera dane wejściowe jako argument wiersza polecenia. Wypróbuj online!Wyjaśnienie
To objaśnienie dotyczy poprzedniej wersji - dziennik zmian znajduje się poniżej
Zainspirowany odpowiedzią Jo Kinga na Perla 6 . Konstruujemy tę listę:
i wyślij pierwsze jego
a
elementy za pomocą cyklicznego indeksowania.Aktualizacja: Zdałem sobie sprawę, że nie muszę używać zamieniać, aby zmienić 0/1/2 na ciągi - mogę użyć tych liczb, aby bezpośrednio zaindeksować listę. Aby to zrobić, musimy upewnić się, że liczby wielocyfrowe są podzielone na listy ich cyfr (w przeciwnym razie wybieramy indeks 10 zamiast indeksów 1 i 0). Na szczęście użycie arbitralnie zagnieżdżonej listy jako indeksu w Pipie działa zgodnie z oczekiwaniami, dając (zagnieżdżoną) listę wyników. Dla danych wejściowych 3 otrzymujemy postęp danych (gdzie
_
reprezentuje nowy wiersz):Tak jak poprzednio, wynik końcowy jest łączony i drukowany automatycznie.
źródło
Attache , 48 bajtów
Wypróbuj online!
Wyjaśnienie
źródło
C (gcc) ,
7771747269 bajtówJest już lepszy C odpowiedź , ale ta jest rekurencyjna i zajęło mi trochę czasu, aby wyprostować, więc publikuję.
Do 69 bajtów dzięki @ceilingcat i @JathanathanFrech
(Nigdy nie sądzę, aby używać n- ~ -i zamiast n-i + 1)
Wypróbuj online!
źródło
j
zapisało ci dwa bajty.n-~-i
jest równoważnen-i+1
- niei<n+1
- i tak naprawdę nie oszczędza żadnych bajtów ...Ruby, 69 lat
7274BajtyBardzo prosta odpowiedź, sprawdzająca teraz krótszą, rekurencyjną metodę.
Zaoszczędź dwa bajty dzięki @BWO :)
Zapisano kolejne trzy bajty, używając symboli zamiast ciągów
źródło
Python 3, 93 bajty
To nie jest najlepsze rozwiązanie, ale to moje zdanie.
Wypróbuj online!
źródło
R, 65 bajtów
Ze względu na fakt, że są replikowane nieco wadliwości programu (to zdobywa się co czwarty „ale” - należy przez to wykorzystali
%4 == 1
i%4 == 3
zamiast%3
warunkach), musimy użyć do niezręczną rozmowęc
i pracę w bazie siedmiu. Mimo to jest krótszy niż LOLCODE ...(Miałem nadzieję, że (3,1,2,3,2,1,2) lub podobna permutacja może pojawić się
lh
gdzieś w zestawie danych, ale tak nie wygląda)źródło
sed -E ,
179150 bajtówNajtrudniejsza część nie polegała na zbudowaniu listy, ale na analizie liczby dziesiętnej.
2 bajty mogą zostać zapisane, jeśli nowa linia na końcu nie jest wymagana:
c\
→d
.Nadal wymaga optymalizacji.
Wypróbuj online .
Wyjaśnienie
źródło
Czysty , 116 bajtów
Wypróbuj online!
źródło
F #,
108106 bajtówWypróbuj online!
-2 bajtów zmienia się od
i=0 to p-1
celui=1 to p
i dostosowanie modulos. Poza tym całkiem proste.źródło
v
funkcja wydrukuje wszystko.i=1 to p
(i oczywiście dostosuj moduły). Zakresy wsteczne są puste. :)PHP,
6568 bajtówUruchom jako potok z
-nR
lub spróbuj online .źródło
VBA (Excel),
105, 101,99 bajtówEdycja: -4 bajty z Keety! Dzięki!
Edytuj 2: -2 bajty z Chronocidal! Woot! (Zdałem sobie sprawę, że przypadki testowe działały tylko dla 10. Naprawiono teraz)
Tak, tym razem Excel pokonał VBA. Cokolwiek. (Idziemy po ciebie)
^ Jest to wklejane do okna Natychmiastowe i generowane do okna debugowania
Bez golfa
źródło
&
między nimiIIf(..)
o dodatkowe 2 bajtyGalaretka , 22 bajty
Monadyczny link dający listę linii (co wydaje się być dozwolone w komentarzach)
Wypróbuj online! (stopka wywołuje łącze za pomocą
Ç
i łączy się z użyciem nowego wiersza,Y
ponieważ niejawne drukowanie w galaretce rozbija wszystko, jeśli to możliwe)W jaki sposób?
Teraz zauważ, że pierwsze sześć wartości to:
Tak więc wynikową listą wierszy powinny być te wartości powtórzone (lub obcięte) do długości
n
połączone razem.Zauważ teraz, że zestawem mocy
"Yeah", "But", "No"
jest:Więc każdy okres to te 1-indeksowane wartości zestawu mocy
"Yeah", "But", "No"
:Kod tworzy tę listę, formuje ją na długość
n
, indeksuje do zestawu mocy, a następnie usuwa wewnętrzne listy (co również usuwa puste ciągi, ponieważ ciągi są listami w Galaretce) ...źródło
Python 2 ,
939283 bajtyWypróbuj online!
Oszczędność 9 bajtów dzięki @Jonathan Frech
źródło
('','Yeah\n')[x%3<1]
jest to równoważne z"Yeah\n"*(x%3<1)
.