21, 21, 23, 20, 5, 25, 31, 24,?
Zainspirowany tą łamigłówką , biorąc pod uwagę liczbę całkowitą , wydrukuj następującą sekwencję, aż dojdziesz do liczby niecałkowitej (zepsute, na wypadek gdybyś chciał rozwiązać zagadkę samodzielnie)
lub bardziej intuicyjnie: * 1, +2, -3, / 4, * 5, +6, -7, / 8, ...
Przypadki testowe:
1: 1, 1, 3, 0, 0, 0, 6, -1
2: 2, 2, 4, 1
3: 3, 3, 5, 2
4: 4, 4, 6, 3
5: 5, 5 , 7, 4, 1, 5, 11, 4
6: 6, 6, 8, 5
9: 9, 9, 11, 8, 2, 10, 16, 9
21: 21, 21, 23, 20, 5, 25, 31, 24, 3, 27, 37, 26
Dane wejściowe i wyjściowe można przyjmować w dowolnym rozsądnym formacie, standardowe luki są jak zwykle zabronione.
W duchu golfa kodowego wygrywa najkrótsza odpowiedź w bajtach!
Piaskownica: https://codegolf.meta.stackexchange.com/a/18142/59642
Odpowiedzi:
05AB1E (starsza wersja) ,
1817 bajtówWypróbuj online lub sprawdź wszystkie przypadki testowe .
Wyjaśnienie:
Używam tutaj starszej wersji 05AB1E, a także najpierw obliczyć następną liczbę przed wydrukowaniem, ponieważ pętla jest oparta na 0 i wykona to
/0
w pierwszej iteracji. To zaoszczędziło bajt w porównaniu z poprzednimN>
i"*+-/"
. Działa to tylko, ponieważ w starszej wersji liczba dzielona przez 0 pozostaje taka sama; mając na uwadze, że w nowej wersji stałoby się 0; i w rzeczywistej matematyce dałoby podział przez błąd zero.źródło
Scratch 3.0 39 bloków / 323 bajtów
Wypróbuj
online!Alternatywnie, jako składnia SB:
Spójrzcie na was, bawcie się swoimi fantazyjnymi
eval
wypowiedziami! Cóż, nie ja! Nie ... Scratch nie ma ewaluacji, więc musiałem robić rzeczy ciężko ... jeśli stwierdzenia.Przynajmniej to nie
goto
jest ...źródło
goto
i pętlę odejmowania, aby sprawdzić, czy możemy podzielić, w języku opartym na stosie . ; p (Z całą powagą, ładna odpowiedź, +1 ode mnie! Po prostu nie mogłem się oprzeć zacytowaniu cię w mojej właśnie ukończonej odpowiedzi na Whitespace .)Biała spacja ,
251227202 bajtówLitery
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).
-24 bajty po komentarzu sugerującym @JoKing
n%i > 0
. Chociaż tylkoif(x < 0)
iif(x == 0)
są dostępne w białej spacji, zwykłe sprawdzanieif(x*-1 < 0)
jest w zasadzie takie samo jakif(x > 0)
.Dodatkowe -25 bajtów dzięki @JoKing .
Wyjaśnienie:
Cytat z odpowiedzi Scratch :
Czy ktoś powiedział
goto
? Biała spacja nie ma nic pozagoto
tworzeniem zarówno pętli, jak i instrukcji if. xD Dodatkowo jest to język oparty na stosie, więc muszę często zamieniać / odrzucać / kopiować. I na koniec: białe znaki nie mają nawet liczb zmiennoprzecinkowych, a jedynie dzielenie liczb całkowitych, więc korzystałemn % i * -1 < 0
z programu, jeśli liczba całkowita nie może podzielić bieżącej liczby.Pseudo kod:
źródło
if(n == 0)
lub jestif(n < 0)
dostępne. Niestety nieif(n > 0)
lubif(n != 0)
. Ale jestem pewien, że niektóre aspekty można uprościć. To obecne rozwiązanie było próbą i błędem debugowania, ale może powinienem cofnąć się o krok i przemyśleć krótsze podejście. Kiedy znów będę miał czas. I naprawiłem pseudo-kod, naprawdę miałeś rację,i
n
m = n%i; n = n/i; if (m == 0) jump to LOOP; exit program
?swap top two, copy second item
ogólną pętlę zamiast kopiować ją do każdej sekcji?Haskell ,
75 7473 bajtów-1 bajt dzięki Will Ness -1 bajt dzięki nimi
Wypróbuj online!
Unika używania ułamkowych liczb całkowitych, aby zaoszczędzić na bajtach
źródło
JavaScript (V8) , 52 bajty
Drukuje grupy 4 terminów. Zainspirowany odpowiedzią GB Ruby .
Wypróbuj online!
JavaScript (V8) , 54 bajty
Drukuje warunki sekwencji.
Wypróbuj online!
JavaScript (ES6),
5958 bajtówZwraca tablicę.
Wypróbuj online!
źródło
Perl 6 , 44 bajtów
Wypróbuj online!
Anonimowy blok kodu, który pobiera liczbę i zwraca sekwencję. Gdybyśmy mogli pominąć pierwszy element (który zawsze jest taki sam jak drugi element), moglibyśmy zaoszczędzić 3 bajty, usuwając
$_,
źródło
Python 3 , 60 bajtów
Wypróbuj online!
źródło
Piet ,
297190144 kodów (432 bajty)Wypróbowałem nowe podejście, używając
pointer
polecenia jako przełącznika (k mod 4) w celu ujednolicenia kodu wyjściowego, co skutkuje gęstszym obrazem kodu 10x19. Potem grałem w golfa o 1 rząd i 2 kolumny do 8x18.Oto ślad, aby zobaczyć, jak to działa:
Pierwszy wiersz wypycha 0 na stosie jako indeks początkowy (ponieważ możemy tylko
push
liczby naturalne, wypychamy 2, a następnie odejmujemy), a następnie odczytuje dane wejściowe jako liczbę.Kolumna znajdująca się najbardziej po lewej stronie ma wspólny kod duplikowania liczby i wstawiania jednego do wyniku, a następnie przesuwania indeksu na szczycie stosu, zwiększania go, a następnie trzykrotnie. Następnie wprowadzamy pastelowy czerwony blok w kształcie litery R przez ciemnobłękitny kod, aby uzyskać
pointer
polecenie, które daje nam różne ścieżki dla reszty naszego indeksu mod 4.Mod 1, wychodzimy przez górę, aby się pomnożyć. Najpierw tasujemy kopię naszego indeksu na później, a następnie wykonujemy mnożenie. Po przejściu przez biel dla noop, wchodzimy do kolumny powyżej, aby naprawić parzystość cc (musi być odwrócona parzystą liczbę razy, aby utrzymać stabilność pętli), a następnie
pointer (1)
od wejścia do magenta paska: Działa jak złap nasze cztery ścieżki i odeślij nas z powrotem do pętli.Mod 2, wychodzimy wstecz do sumy. Kształt pastelowego bloku kodu oznacza, że wychodzimy z wiersza powyżej miejsca, w którym weszliśmy, i używamy 3, które wciskamy na stos, wychodząc przez czerwony kod do
pointer (3)
siebie. Kolumny te mają białą spację przed arytmetyką i nieco inną kolejność pchania i przełączania cc, ponieważ w innym przypadku kolory sąsiadowałyby z koderami o wartościach całkowitych w sąsiedniej kolumnie.Mod 3 wysyła nas w dół do odejmowania. To samo, co mnożenie, z tą różnicą, że po drodze przekraczamy ścieżkę podziału (ponieważ cc ma różną parzystość przy wchodzeniu do pastelowego zielonego paska, dwie egzekucje wychodzą z tego paska na różnych końcach). Robiąc to, wybieramy niechciane
duplicate
polecenie, więcpop
wycofujemy się z ciemnozielonym kodem przed wejściem do paska korekcji i zbierania CC.Mod 4, idziemy od razu do podziału. Tutaj najpierw musimy poważniej przetasować stos, aby uzyskać dwie pary n i a do wykonania operacji, ponieważ musimy sprawdzić, czy jest to liczba całkowita. Robimy to
mod
na pierwszej parze, a następnienot
na wyniku, a następnie używamy tego dopointer
- jeśli nie jest to podzielne, idziemy prosto, co wysyła nam dwiepointer
komendy do przeciwległego rogu do nieuniknionego bloku, a tym samym kończy program. W przeciwnym razie skręcamy w prawo i dostajemydivide
polecenie wejścia do karmazynowego paska.Stara wersja
Bardzo prosty kod: wypycha 1 i dane wejściowe na stosie, a następnie przechodzi przez cztery operacje przez: tasowanie indeksu na stosie, zwiększanie go o 1, duplikowanie, tasowanie jednej kopii z powrotem w dół, wykonywanie operacji arytmetycznej, powielanie liczby i wstawianie jednego do wyniku.
W przypadku podziału, który jako jedyny może zakończyć sekwencję, tworzy bardziej skomplikowany stos, aby najpierw sprawdzić, czy n mod index == 0, w przeciwnym razie wchodzi do nieuniknionego kodera i kończy się. W przeciwnym razie używa drugiej kopii iin do wykonania podziału.
źródło
push (1) pointer
albo dla czarnej komórki na kolorowej.C # (interaktywny kompilator Visual C #) ,
72,70, 69 bajtówWypróbuj online!
źródło
Rubin ,
56 5452 bajtówWypróbuj online!
Po kilku (nieudanych) próbach
eval
zorientowałem się, że najszczęśliwszym rozwiązaniem jest zbudowanie tablicy z 4 elementami jednocześnie, przynajmniej w rubinie.Dzięki Arnauld za -2 bajty.
źródło
R ,
90 bajtów ,73 bajtów87 bajtów85 bajtów80 bajtów74Proste wdrożenie zasad:
Wypróbuj online!
z
T<13
następującymi informacjami z głębszej analizy układanki. Rzeczywiście istnieją tylko trzy rodzaje sekwencji: o długości 4, gdy a⁰ nie jest zgodne z 1 modułem 8; te o długości 12, gdy a⁰ jest zgodne z 21 modulo 32; i te o długości 8 dla pozostałych przypadków.Alternatywny kod unikający pętli kończy się na 87 bajtach:
Wypróbuj online!
źródło
{}
dla -2 bajtów.length
.Haskell ,
1048685 bajtówWypróbuj online!
h=
Można pominąć, ponieważ jest on używany tylko do testów.Ach, golf golfowy, gdzie warto zwiększyć kwadratową złożoność czasu, aby zmniejszyć jedną postać.
104 bajty
Wypróbuj online!
Bardziej podoba mi się ta odpowiedź, ale niestety jest ona dłuższa.
źródło
Japt ,
2524 bajtówKolejna adaptacja rozwiązania Ruby GB .
Spróbuj
Główną sztuczką jest tutaj przeciążenie
c
metody tablic. Przekaż mu inną tablicę jako argument i połączy ją z pierwotną tablicą. Podaj mu liczbę jako argument, jak ma to miejsce przy ostatnim wywołaniu rekurencyjnym, i spłaszczy pierwotną tablicę o tyle poziomów -1
w tym przypadku po zaokrągleniu. Ponieważ jednak tablica ma zawsze tylko jeden poziom głębokości, spłaszczenie nie ma żadnego efektu.źródło
Java 8, 84 bajtów
Wypróbuj online.
Inspiracją jest tworzenie tablicy ze wszystkimi czterema wartościami Rubinową odpowiedzią @GB , chociaż teraz zauważam, że użycie trójskładnikowej instrukcji if jest taką samą ilością bajtów:
Wypróbuj online.
źródło
Perl 5 , 53 bajtów
Wypróbuj online!
źródło
Czerwony , 102 bajty
Wypróbuj online!
źródło
AWK , 57 bajtów
Wypróbuj online!
źródło
Rutger , 310 bajtów
Wypróbuj online!
Najwyższy czas ponownie użyć Rutgera. Niestety, może to nie być najlepszy język dla tego zadania, ponieważ nie ma żadnej formy
eval
, zmuszając mnie do użycia czterech instrukcji ifJak to działa
Jak działa Rutger
Krótkie przedmowa o tym, jak działa język: wszystko jest albo przypisaniem, albo funkcją, a każda funkcja wymaga dokładnie jednego argumentu. W przypadku operacji wymagających więcej niż jednego argumentu (np. Mnożenie) pierwsze wywołanie zwraca funkcję częściową , która po ponownym wywołaniu z drugim argumentem zwraca oczekiwany wynik. Na przykład:
wydrukuje 30: Wypróbuj online!. Chociaż zwykle jest to dłuższa niż zwykła alternatywa, może czasami oszczędzać bajty, jeśli funkcja jest wywoływana wielokrotnie z jednym stałym argumentem i jednym zmieniającym się argumentem, na przykład podczas drukowania tabel czasów.
Ta reguła jednego argumentu ma zastosowanie do wszystkiego, co nie jest stałą ani zmienną, w tym pętli i warunków warunkowych. Jednak pętli i instrukcji warunkowych (
For
,Each
,While
,DoWhile
,If
iIfElse
) są wykonalne , co oznacza, że aby właściwie prowadzonym nich,Do
funkcja musi być wywołana (patrz ostatni wiersz w odpowiedzi). Ponownie może to zaoszczędzić bajty przy wielokrotnym uruchamianiu tej samej pętli lub pozwolić na uruchomienie dowolnego kodu między definicją a uruchomieniem pętli.Wreszcie istnieją trzy sposoby odwoływania się do zmiennych, z których wszystkie są używane w tym programie. Pierwszym z nich jest bezpośrednie odwołanie , w którym nazwa zmiennej poprzedzona jest
$
symbolem. Uzyskuje to bezpośredni dostęp do wartości zmiennej i zwraca ją. Drugim jest odwołanie funkcjonalne , które nie ma znaku prefiksu. Umożliwia to kodowi rozróżnienie między (potencjalnie częściowymi) funkcjami przypisanymi do zmiennych a rzeczywistymi zmiennymi zawierającymi określoną wartość. Wreszcie pośrednie odwołanie , poprzedzone@
symbolem, tworzy zmienną (jeśli jeszcze nie istnieje) i zwraca obiekt zmiennej w danym zakresie. Umożliwia to utworzenie zmiennej pętli (np.i
Wfor i in range(...)
).Jak działa rzeczywiste rozwiązanie
Oto nielepszy kod:
Wypróbuj online!
Jak widać, zaczyna przypisując trzy zmienne
n
,e
ia
, które stanowią wkład, zmieniający się element w sekwencji i numer modyfikacji dla każdego nowego elementu odpowiednio. Następnie tworzymy pętlę while:{
}
m
e % m
Następnie dochodzimy do absolutnej potworności składającej się z ciała pętli while:
x
Pierwsza instrukcja wypisuje każdą iterację sekwencji przed jej modyfikacją. Następnie tworzymy funkcję częściową w celu sprawdzenia równości ze zmienną pętli
x
i napotykamy cztery instrukcje if. Każdy sprawdza komunikat, jeślix
ma wartość 1, 2, 3 lub 4, odpowiednio, a następnie przydziela sięk
do każdej funkcji*
,+
,-
i/
, następnie wprowadza się do funkcji z częściowyme
jako argument. Wreszcie możemy przypisaće
dok
uruchomienia za
jako drugi argument i przyrostua
.źródło
Ruby , 52 bajty
Wypróbuj online!
źródło
i=0
i użyj pływaka jako argumentu funkcji.C (brzęk) , 80 bajtów
Wypróbuj online!
Dzięki wielu ulepszeniom @ceilingcat.
źródło
dzaima / APL,
3433 bajtyWypróbuj online!
-1 dzięki ngn
źródło
TI83 / 84 BASIC, 69 bajtów
Ustawiliśmy licznik w A i wyczyściliśmy L1, abyśmy mogli go użyć do śledzenia sekwencji. Następnie powtarzamy, aż krok podziału spowoduje ułamek. Wewnątrz pętli najpierw przechowujemy N na liście. Przechowywanie jednego elementu poza końcem listy lub pustą listą tworzy ten element, więc ten sklep zapisuje zarówno wynik podziału, gdy nie powoduje ułamka, jak i inicjuje listę podczas pierwszego przejścia. Następnie używamy augmentu, aby dołączyć kolejne 3 terminy sekwencji. Matematyka wylicza kilka bajtów mniejszych, obliczając składnik A4k + 3 w zmiennej O, a następnie bazując A4k + 2 i A4k + 4 poza O. Następnie wykonujemy podział oddzielnie, aby zresetować N w celu powtórzenia kontroli i dodać 4 do A.
Na końcu umieszczam Disp L1, ale nie jestem pewien, jak idealny jest, ponieważ nie ma dobrego sposobu na dopasowanie wszystkich warunków na ekranie. Realistycznie użytkownik wykona L1 po ręcznym uruchomieniu programu, aby przewijać wyniki.
źródło
Węgiel drzewny , 29 bajtów
Wypróbuj online! Link jest do pełnej wersji kodu. Wyjaśnienie:
Wprowadź wartość początkową.
Powtarzaj, aż wartość nie będzie już liczbą całkowitą.
Wydrukuj wartość w swoim własnym wierszu.
Oblicz cztery dostępne operacje arytmetyczne i wybierz poprawną w zależności od bieżącego numeru linii wyjściowej.
źródło
Python 3 ,
7876 bajtówWypróbuj online!
Pobiera dane wejściowe jako listę 1 elementu i rekurencyjnie dołącza następny element sekwencji, dopóki nie będzie liczbą całkowitą.
W przypadku, gdy przyjmowanie danych wejściowych jako listy jest niedozwolone, tutaj jest bardzo łatana wersja, która przyjmuje dane wejściowe jako int.
Wprowadź jako liczbę całkowitą, 102 bajty
Wypróbuj online!
+2 bajty dzięki, że zapomniałem nazwać funkcję rekurencyjną ...
-4 bajty, dzięki Jitse
źródło
f=
do swojego głównego kodu. Możesz jednak zapisać 4 bajtyn[-1]
ilen(n)
nie musisz znajdować się w nawiasach klamrowych. Wypróbuj online!n[:-(n[-1]%1>0)]or f...
zapisałbym bajtGałązka , 164 bajty
Okej, pisanie tego było strasznie okropne.
Ograniczenia:
returns
! Możesz albo wysyłać, albo nie wysyłaćwhile
pętli. Państwo musi użyć rekurencji albo nicset
znacznikabreak
,continue
,goto
lub podobny. To uniemożliwia użycie pętli.for ... in ....
i zapętla wszystkie elementy w tablicy, bez możliwości zatrzymania.Wszystkie te spowodowały, że kod był ogromny!
Hej, zrobiłem to nawet dłużej niż odpowiedź Java!
To tak długo, jak @ Arnauld's odpowiedź JavaScript ! ... Ze wszystkimi 3 alternatywami łącznie.
Oto kod:
Możesz spróbować https://twigfiddle.com/zw5zls
Jak używać:
Wystarczy zaimportować plik i wywołać pierwsze makro.
Aby mieć użyteczną tablicę, możesz to zrobić
a.a(21)|split(',')
.Nie golfowany:
Powinien być łatwy do odczytania.
Ta odpowiedź bez odpowiedzi NIE da poprawnego wyniku, ponieważ będzie generować losowe białe spacje.
Istnieje tylko po to, aby być czytelnym dla ludzi.
źródło