Sekwencje żeńskie i męskie


20

To pytanie jest prawdopodobnie trudniejsze niż wszystkie zadania „generowania sekwencji liczb”, ponieważ wymaga to DWÓCH sekwencji działających zgodnie.

Naprawdę nie mogę się doczekać odpowiedzi!

W swojej książce „ Gödel, Escher, Bach: An Eternal Golden Braid ” Douglas Hofstadter ma w środku sporo sekwencji liczb, wszystkie w pewien sposób polegają na poprzednim wyrażeniu. Informacje na temat wszystkich sekwencji można znaleźć na tej stronie Wikipedii .

Jedną z naprawdę interesujących sekwencji są sekwencje żeńskie i męskie, które są zdefiniowane w następujący sposób:

dla n > 0.

Oto sekwencja żeńska i męska .

Twoim zadaniem jest npodanie liczby całkowitej jako wejściowej, zwrócenie listy sekwencji żeńskiej i sekwencji męskiej, z liczbą wyrażeń równą n, w dwóch liniach wyjściowych, z sekwencją żeńską w pierwszym wierszu i sekwencją męską drugi.

Przykładowe dane wejściowe i wyjściowe: Dane wejściowe: Dane 5 wyjściowe:[1, 1, 2, 2, 3] [0, 0, 1, 2, 2]

Wejście: 10 Wyjście:[1, 1, 2, 2, 3, 3, 4, 5, 5, 6] [0, 0, 1, 2, 2, 3, 4, 4, 5, 6]

UWAGA: Oddzielenie list oznacza podział linii.

To jest golf golfowy, więc wygrywa najkrótszy kod w bajtach. Wprowadź również wyjaśnienie do swojego kodu.

Tabela liderów


5
Czy możemy zwrócić parę list z funkcji, zamiast drukować listy?
Zgarb

Inne wyzwania polegające sekwencje Hofstadtera za: sekwencja Q , sekwencja cyfra-cyfra
Martin Ender

@Zgarb Możesz, o ile dwie listy są w różnych wierszach.
clismique

2
@DerpfacePython Nie ma linii w parze list; jeśli funkcja zwraca parę list, możesz wydrukować je w dowolny sposób. To powiedziawszy, nie jestem wielkim fanem wymagań linii, nawet podczas drukowania wyników. Uciążliwe formaty We / Wy są jedną z rzeczy, których należy unikać podczas pisania wyzwań.
Dennis

4
Dla niektórych podejść / języków nie jest to żadna wielka sprawa, ale dla innych może mieć duże znaczenie. W C można by zaoszczędzić wiele bajtów, drukując sekwencje w kolumnach, a nie w wierszach. W Pythonie najkrótsze podejście, jakie potrafię wymyślić, to rekursywna lambda podobna do mojej rekurencyjnej odpowiedzi Julii, która zwraca parę list, ale konieczność przekonwertowania tego na ciąg znaków przy użyciu wiersza powoduje, że jest on znacznie dłuższy, nawet dłuższy niż pełny program opublikowane przez Sp3000. Inne podejścia, takie jak rozwiązanie rekurencyjne, które odlicza w dół zamiast w górę, są całkowicie wykluczone, ponieważ nie można dodać nowego wiersza.
Dennis

Odpowiedzi:


3

Galaretka , 22 20 bajtów

ṙṪḢạL}ṭ
çƓḤ¤Ð¡1ṫ-Ṗ€G

Wypróbuj online!

Jak to działa

çƓḤ¤Ð¡1ṫ-Ṗ€G  Main link. No user arguments. Left argument defaults to 0.
   ¤          Combine the two links to the left into a niladic chain.
 Ɠ              Read an integer from STDIN.
  Ḥ             Unhalve/double it.
ç   С1       Call the helper link that many times. Return all results.
              In the first call, the left and right argument are 0 and 1 resp.
              After each iteration, the left argument is set to the return value
              and the right argument to the prior value of the left one.
       ṫ-     Tail -1; keep the last two items of the list of results.
         Ṗ€   Discard the last item of each list.
           G  Grid; format the pair of lists.


ṙṪḢạL}ṭ       Helper link. Arguments: x, y (lists)

ṙ             Rotate x k units to the left, for each k in y.
 Ṫ            Tail; extract the last rotation.
  Ḣ           Head; extract the last element.
              This essentially computes x[y[-1]] (Python notation), avoiding
              Jelly's 1-based indexing.
    L}        Yield the length of y.
   ạ          Take the absolute difference of the results to both sides.
      ṭ       Tack; append the difference to y and return the result.

5
I w tej części czuję się dumny z siebie, że podjąłem wyzwanie, które sprawia, że ​​Jelly używa więcej niż 10 bajtów.
clismique

13

Julia, 52 48 bajtów

x->[n÷φ|(5n^2|4∈(2:3n).^2)for| =(+,-),n=1:x]

Wypróbuj online!

tło

W funkcji ślub Hofstadtera jest , że pokazy autorem

F/M formula

gdzie φ oznacza złoty podział ,

delta/epsilon formula

a F n oznacza n- liczbę Fibonacciego .

Co więcej, w Zaawansowanych problemach i rozwiązaniach H-187: Fibonacci jest kwadratem , o czym mówi wnioskodawca

Fibonacci/Lucas identity

gdzie L n oznacza n- liczbę Lucasa i odwrotnie - jeśli

converse Fibonacci/Lucas identity

następnie n jest liczbą Fibonacciego, a m jest liczbą Lucasa.

Z tego wywnioskujemy

delta/epsilon theorem

ilekroć n> 0 .

Jak to działa

Biorąc pod uwagę wejście x , konstruujemy macierz 2 na x , gdzie | to dodawanie w pierwszej kolumnie i odejmowanie w drugiej, a n przechodzi przez liczby całkowite od 1 do x w wierszach.

Pierwszy składnik zarówno F (n - 1), jak i M (n - 1) jest po prostu n÷φ.

Obliczamy δ (n) i ε (n) , obliczając 5n² | 4 i testowanie, czy wynik należy do układu kwadratów liczb całkowitych od 2 do 3n . Sprawdza to zarówno kwadratowość, jak i ponieważ 1 nie jest w zakresie, dla n> 1, jeśli | jest odejmowanie.

Na koniec dodajemy lub odejmujemy wartość logiczną wynikającą z 5n^2|4∈(2:3n).^2do lub z poprzednio obliczonej liczby całkowitej.


czy można to wyrazić w sposób nierekurencyjny / iteracyjny? Jaka jest dla niego forma zamknięta?
Abr001am

Dodałem wyjaśnienie.
Dennis

11

Python 2, 79 70 bajtów

a=0,;b=1,
exec"a,b=b,a+(len(a)-b[a[-1]],);"*~-input()*2
print b,'\n',a

Iteracyjny, a nie rekurencyjny, bo dlaczego nie. Pierwszy wiersz ma spację końcową - jeśli nie jest to w porządku, można go ustawić na dodatkowy bajt. -9 bajtów dzięki @Dennis.

Oto kilka połączonych lambdas, które tak naprawdę nie pomogły:

f=lambda n,k:n and n-f(f(n-1,k),k^1)or k
f=lambda n,k:[k][n:]or f(n-1,k)+[n-f(f(n-1,k)[-1],k^1)[-1]]

Zarówno przyjmują, jak ni parametr k0 lub 1, określając mężczyznę / kobietę. Pierwsza lambda zwraca n-ty element, a druga lambda zwraca pierwsze n elementów (z wykładniczym środowiskiem uruchomieniowym).


9

MATL , 23 bajty

1Oiq:"@XJth"yy0)Q)_J+hw

Wypróbuj online!

Wyjaśnienie

To działa iteracyjnie. Każda sekwencja jest przechowywana w tablicy. Dla każdego indeksu n obliczany jest nowy termin każdej sekwencji i dołączany do odpowiedniej tablicy. forPętli z N -1 terminów jest używany, w której N jest liczbą wejściowych.

Najpierw należy wykonać aktualizację sekwencji M. Wynika to z faktu, że sekwencja F jest zawsze większa lub równa sekwencji M dla tego samego indeksu, więc jeśli spróbujemy najpierw zaktualizować F, potrzebujemy terminu M jeszcze nie obliczonego.

Dwa równania aktualizacji są takie same, zamieniając F i M. Tak więc kod aktualizacji jest ponownie wykorzystywany przez zastosowanie forpętli z dwiema iteracjami i zamianę sekwencji na stosie.

1        % Push 1: seed for F sequence
O        % Push 0: seed for M sequence
iq:      % Input N. Generate range [1 2 ... N-1]
"        % For each (i.e. iterate N-1 times)
  @      %   Push current index, n (starting at 1 and ending at N-1)
  XJ     %   Copy to clipboard J
  th     %   Duplicate and concatenate. This generates a length-2 array
  "      %   For each (i.e. iterate twice)
    yy   %   Duplicate top two elements, i.e. F and M sequences
    0)   %     In the *first* iteration: get last entry of M, i.e M(n-1)
    Q)   %     Add 1 and index into F. This is F(M(n-1))
    _J+  %     Negate and add n. This is n-F(M(n-1)), that is, M(n)
    h    %     Concatenate to update M
    w    %     Swap top two elements, to bring F to top.
         %     In the *second* iteration the procedure is repeated to update F,
         %     and then the top two elements are swapped to bring M to top again,
         %     ready for the next iteration of the outer loop
         %   End for implicitly
         % End for implicitly
         % Display implicitly from bottom to top: first line is F, second is M

6

J, 47 bajtów

f=:1:`(-m@f@<:)@.*
m=:0:`(-f@m@<:)@.*
(f,:m)@i.

Używa definicji rekurencyjnej. Pierwsze dwie linie zawierające czasowniki fi mktóre reprezentują funkcje płci męskiej i żeńskiej, odpowiednio. Ostatni wiersz jest czasownikiem, który przyjmuje pojedynczy argument ni wypisuje pierwsze nwyrażenia sekwencji żeńskiej i męskiej.

Stosowanie

   (f,:m)@i. 5
1 1 2 2 3
0 0 1 2 2
   (f,:m)@i. 10
1 1 2 2 3 3 4 5 5 6
0 0 1 2 2 3 4 4 5 6

6

JavaScript (ES6), 75 bajtów

g=n=>--n?([f,m]=g(n),m=[...m,n-f[m[n-1]]],[[...f,n-m[f[n-1]]],m]):[[1],[[0]]

Mógłbym zapisać 2 bajty, jeśli pozwolono mi najpierw zwrócić sekwencję Male:

g=n=>--n?([f,m]=g(n),[m=[...m,n-f[m[n-1]]],[...f,n-m[f[n-1]]]]):[[1],[[0]]

6

Haskell, 57 bajtów

l#s=scanl(\a b->b-l!!a)s[1..]
v=w#1
w=v#0
(<$>[v,w]).take

Przykład użycia: (<$>[v,w]).take $ 5->[[1,1,2,2,3],[0,0,1,2,2]]

Funkcja pomocnika #tworzy nieskończoną listę z wartością początkową si listą ldo wyszukiwania wszystkich dalszych elementów (na indeksie poprzedniej wartości). v = w#1jest w = v#0sekwencją żeńską i męską. W głównej funkcji bierzemy pierwsze nelementy zarówno vi w.


4

Python 2, 107 bajtów

F=lambda n:n and n-M(F(n-1))or 1
M=lambda n:n and n-F(M(n-1))
n=range(input())
print map(F,n),'\n',map(M,n)

Wypróbuj online

Większe wartości wejściowe powodują błąd RuntimeError (zbyt duża rekurencja). Jeśli jest to problem, mogę napisać wersję, w której błąd nie występuje.



3

Pyth, 24 bajty

Prawdopodobnie nie można użyć tej funkcji reducedo zmniejszenia liczby bajtów.

Prosta implementacja.

L&b-b'ytbL?b-by'tb1'MQyM

Wypróbuj online!

Jak to działa

L&b-b'ytb  defines a function y, which is actually the male sequence.

L          def male(b):
 &b            if not b: return b
   -b          else: return b-
     'ytb            female(male(b-1))


L?b-by'tb1 defines a function ', which is actually the female sequence.

L          def female(b):
 ?b            if b:
   -by'tb          return b-male(female(b-1))
         1     else: return 1


'MQ        print(female(i) for i from 0 to input)
yMQ        print(male(i) for i from 0 to input)

Czy w tabeli liderów umieszczam anagrammowane imię lub nazwisko użytkownika? Ponadto ten kod jest strasznie długi dla programu Pyth.
clismique

Jak długo tu jesteś ... Skąd wiesz, że zmieniłem imię? Wpisz tam moje nowe imię.
Leaky Nun

1
Byłem tu wystarczająco długo, aby wiedzieć, że zmieniłeś swoje imię.
clismique

@DerpfacePython Widząc, że inne odpowiedzi są prawie 4 razy dłuższe ... Powiedziałbym, że moje rozwiązanie nie jest bardzo długie.
Leaky Nun

To bardzo prawda, ale wciąż jest długa w porównaniu do innych programów Pyth dla innych pytań.
clismique

3

Brachylog , 65 bajtów

:{:1-:0re.}fL:2aw,@Nw,L:3aw
0,1.|:1-:2&:3&:?--.
0.|:1-:3&:2&:?--.

Moja próba połączenia obu predykatów dla mężczyzn i kobiet w jeden faktycznie wydłużyła kod.

Możesz użyć następującego linera, który ma taką samą liczbę bajtów:

:{:1-:0re.}fL:{0,1.|:1-:2&:3&:?--.}aw,@Nw,L:{0.|:1-:3&:2&:?--.}aw

Uwaga : Działa to z transpilatorem Prolog, a nie ze starym Java.

Wyjaśnienie

Główny predykat:

:{:1-:0re.}fL                Build a list L of integers from 0 to Input - 1
             :2aw            Apply predicate 2 to each element of L, write the resulting list
                 ,@Nw        Write a line break
                     ,L:3aw  Apply predicate 3 to each element of L, write the resulting list

Predicate 2 (kobieta):

0,1.                         If Input = 0, unify Output with 1
    |                        Else
     :1-                     Subtract 1 from Input
        :2&                  Call predicate 2 with Input - 1 as argument
           :3&               Call predicate 3 with the Output of the previous predicate 2
              :?-            Subtract Input from the Output of the previous predicate 3
                 -.          Unify the Output with the opposite of the subtraction

Predicate 3 (mężczyzna):

0.                           If Input = 0, unify Output with 0
  |                          Else
   :1-                       Subtract 1 from Input
      :3&                    Call predicate 3 with Input - 1 as argument
         :2&                 Call predicate 2 with the Output of the previous predicate 3
            :?-              Subtract Input from the Output of the previous predicate 3
               -.            Unify the Output with the opposite of the subtraction

Czekaj ... który jest predykatem 3?
clismique

@DerpfacePython whoops, naprawiono. Zauważ też, że predykat jest {:1-:0re.}używany do tworzenia listy zakresów.
Fatalize

3

Clojure, 132 131 bajtów

(fn [n](loop[N 1 M[0]F[1]](if(< N n)(let[M(conj M(- N(F(peek M))))F(conj F(- N(M(peek F))))](recur(inc N)M F))(do(prn F)(prn M)))))

Po prostu buduje sekwencje iteracyjnie od zera do n.

Wersja bez golfa

(fn [n]
  (loop [N 1 M [0] F [1]]
    (if (< N n)
      (let [M (conj M (- N (F (peek M))))
            F (conj F (- N (M (peek F))))]
        (recur (inc N) M F))
      (do
        (prn F)
        (prn M)))))

Ładna odpowiedź, witamy na stronie! Czy konieczne jest wstawianie spacji lub znaku nowej linii? Liczę 131 + spację końcową.
DJMcMayhem

Nie, nie ma potrzeby wstawiania białych znaków. Sneaky vim dodał na końcu nowy wiersz, aby wc mógł liczyć.
zaznacz

3

Pyth, 23 bajty

jCuaG-LHtPs@LGeGr1Q],1Z

Wypróbuj online: demonstracja

Wyjaśnienie:

jCuaG-LHtPs@LGeGr1Q],1Z

  u                ],1Z    start with G = [[1, 0]]
                           (this will be the list of F-M pairs)
  u             r1Q        for each H in [1, 2, ..., Q-1]:
              eG              take the last pair of G [F(H-1), M(H-1)]
           @LG                lookup the pairs of these values:
                              [[F(F(H-1)), M(F(H-1))], [F(M(H-1)), M(M(H-1))]]
          s                   join them:
                              [F(F(H-1)), M(F(H-1)), F(M(H-1)), M(M(H-1))]
        tP                    get rid of the first and last element:
                              [M(F(H-1)), F(M(H-1))]
     -LH                      subtract these values from H
                              [H - M(F(H-1)), H - F(M(H-1))]
   aG                         and append this new pair to G
jC                         at the end: zip G and print each list on a line

Alternatywne rozwiązanie, które wykorzystuje funkcję zamiast zmniejszania (także 23 bajty):

L?>b1-LbtPsyMytb,1ZjCyM

Ładny. Naprawdę bardzo ładnie.
Leaky Nun

3

Rubin, 104 92 97 82 bajtów

f=->n,i{n>0?n-f[f[n-1,i],-i]:i>0?1:0}
->n{[1,-1].map{|k|p (0...n).map{|i|f[i,k]}}}

Edycja: f i msą teraz jedną funkcją dzięki HopefullyHelpful . fNastępnie zmieniłem drugą funkcję, aby wydrukować m. Biała spacja po pjest znacząca, ponieważ w przeciwnym razie funkcja wypisuje (0...n)zamiast wynikumap .

Trzecia funkcja wypisuje najpierw tablicę pierwszych n terminów f, a następnie tablicę pierwszych n terminówm

Funkcje te nazywane są następująco:

> f=->n,i{n>0?n-f[f[n-1,i],-i]:i>0?1:0}
> s=->n{[1,-1].map{|k|p (0...n).map{|i|f[i,k]}}}
> s[10]
[1, 1, 2, 2, 3, 3, 4, 5, 5, 6]
[0, 0, 1, 2, 2, 3, 4, 4, 5, 6]

możesz upuścić p i parens. Wydruk nie jest wymagany. Możesz także dorastać w całym zasięgu.
Nie, że Charles

możesz zamienić funkcję 2 na 1, która ma 2 argumenty nii n>0?n-f(f(n-1,i),-i):i>0?1:0
miejmy nadzieję, że jest

@HopefullyHelpful Thanks a bunch: D
Sherlock9

@NotthatCharles Czy wydruk nie jest wymagany? W Ruby, jeśli chcę, aby linia między wierszami fi m, muszę go wydrukować. W przeciwnym razie otrzymam tablicę typu[[1, 1, 2, 2, 3, 3, 4, 5, 5, 6], [0, 0, 1, 2, 2, 3, 4, 4, 5, 6]]
Sherlock9

och, mówi „łamanie linii”. Szkoda
Nie, że Charles

3

APL (Dyalog Unicode) , 45 25 bajtów

Anonimowa ukryta funkcja. Wymaga ⎕IO←0, co jest standardem w wielu systemach APL.

1 0∘.{×⍵:⍵-(~⍺)∇⍺∇⍵-1⋄⍺}⍳

Wypróbuj online!

Działa to poprzez połączenie F i M w pojedynczą funkcję dyadyczną z logicznym lewym argumentem, który wybiera funkcję do zastosowania. Używamy 1 dla F i 0 dla M , abyśmy mogli użyć tego selektora jako wartości zwracanej dla F  (0) i M  (0). Następnie obserwujemy, że obie funkcje muszą najpierw wywołać się same (w argumencie minus jeden), a następnie druga funkcja w wyniku tego, więc najpierw ponawiamy z danym selektorem, a następnie z logicznie negowanym selektorem.

d ndices; od zera do argumentu minus jeden

1 0∘.{} Zewnętrzny (kartezjański) „produkt” (ale z poniższą funkcją zamiast mnożenia) wykorzystujący [1,0]jako lewy argument ( ) i indeksy jako prawy argument ( ):

×⍵ jeśli właściwy argument jest ściśle pozytywny (oznacza znak właściwego argumentu):

  ⍵-1 odejmij jeden z właściwego argumentu

  ⍺∇ nazywaj siebie z prawym argumentem, a lewym argumentem jako lewym argumentem

  (~⍺)∇ nazywaj siebie tym jako prawym arg, a logiczną negacją lewego arg jako lewym arg

  ⍵- odejmij to od właściwego argumentu i zwróć wynik

 jeszcze:

   zwraca lewy argument


Działa to dobrze, ale zakładanie , że dane wejściowe są przechowywane w zmiennej, jest domyślnie niedozwolone.
Dennis

@Dennis Tak naprawdę nie. Jest to ciało TFN. Kiedy byłem tu nowy, ngn powiedział mi, że nie muszę liczyć nagłówka tfn (co byłoby dwoma bajtami, nazwą jednoznakową + znakiem nowej linii, tak jak nazwa pliku źródłowego nie jest liczona, a anonimowe fns są dozwolone Tak więc tutaj, gdzie nagłówek to 1-znakowa nazwa + spacja + 1-znakowa nazwa argumentu ( n) + plus nowa linia
Adám

Czym dokładnie jest TFN?
Dennis

@Dennis Tfns to tradycyjna reprezentacja funkcji APL. Składa się z linii kodu prawie bez ograniczeń dfns . Np. Możesz mieć odpowiednie struktury kontrolne i wyrażenia bez rezultatu. Wiersz „0” to nagłówek wskazujący składnię fn .
Adám

2

ES6, 89 85 83 bajtów

2 bajty zapisane dzięki @ Bálint

x=>{F=[n=1],M=[0];while(n<x){M.push(n-F[M[n-1]]);F.push(n-M[F[n++-1]])}return[F,M]}

Wdrażanie naiwne.

Wyjaśnienie:

x => {
    F = [n = 1], //female and term number
    M = [0]; //male
    while (n < x) {
        M.push(n - F[M[n - 1]]); //naïve
        F.push(n - M[F[n++ - 1]]); //post-decrement means n++ acts as n in the calculation
    }
    return [F, M];
}

Myślę, że możesz zrobić z tego funkcję anonimową i zastąpić && - s &
Bálint

Nie możesz &&zewrzeć, co jest pożądane, ale i tak go usunąłem, ponieważ składnia nawiasów jest tak samo krótka
tylko ASCII

Wtedy możesz zrobić`F = [n = 1]
Bálint

2

Mathematica, 69 62 bajtów

Dziękujemy Sp3000 za zaproponowanie funkcjonalnej formy, która pozwoliła zaoszczędzić 14 bajtów.

k_~f~0=1-k
k_~f~n_:=n-f[1-k,f[k,n-1]]
Print/@Array[f,{2,#},0]&

Definiuje nazwaną funkcję pomocnika, fa następnie przekształca się w funkcję bez nazwy, która rozwiązuje rzeczywiste zadanie drukowania obu sekwencji.


2

Perl 5.10, 85 80 bajtów

Meh, nie wiem, jeśli mam więcej pomysłów na golfa ...

@a=1;@b=0;for(1..<>-1){push@a,$_-$b[$a[$_-1]];push@b,$_-$a[$b[$_-1]]}say"@a\n@b"

Wypróbuj online!

Musiałem dodać use 5.10.0Ideone, aby zaakceptował sayfunkcję, ale nie liczy się ona do liczby bajtów.

Jest to naiwna implementacja algorytmu, @abędąca listą „żeńską” i @b„męską”.

Przekreślone 85 to wciąż 85?


Wyjaśnienie, proszę?
clismique

Prawie tak samo jak moja odpowiedź JS
tylko ASCII,

@DerpfacePython To właściwie naiwna implementacja. :)
Paul Picard,

Nie testowałem, ale nie sądzę, że powinieneś potrzebować nawiasów wokół każdego pushsemestru ani ostatniego średnika przed wąskim nawiasiem klamrowym.
msh210,

@ msh210 Rzeczywiście, zapomniałem o tym. Oszczędza w sumie 5 bajtów, dzięki!
Paul Picard

2

Java, łącznie 169 bajtów

int f(int n,int i){return n>0?n-f(f(n-1,i),-i):i>0?1:0;}void p(int n,int i){if(n>0)p(n-1,i);System.out.print(i==0?"\n":f(n,i)+" ");}void p(int n){p(n,1);p(0,0);p(n,-1);}

F (), M () 56 bajtów

int f(int n,int i){
    return n>0?n-f(f(n-1,i),-i):i>0?1:0;
}

recursive-for-loop i drukowanie 77 bajtów

void p(int n,int i) {
    if(n>0) {
        p(n-1,i);
    }
    System.out.print(i==0?"\n":f(n,i)+" ");
}

wyprowadzanie list w dwóch różnych wierszach 37 bajtów

void p(int n) {
    p(n,1);
    p(0,0);
    p(n,-1);
}

wejście: p ( 10)
wyjście:

1 1 2 2 3 3 4 5 5 6 6 7 8 8 9 9 
0 0 1 2 2 3 4 4 5 6 6 7 7 8 9 9

1

C, 166 bajtów

#define P printf
#define L for(i=0;i<a;i++)
f(x);m(x);i;c(a){L P("%d ",f(i));P("\n");L P("%d ",m(i));}f(x){return x==0?1:x-m(f(x-1));}m(x){return x==0?0:x-f(m(x-1));}

Stosowanie:

main()
{
    c(10);
}

Wynik:

1 1 2 2 3 3 4 5 5 6
0 0 1 2 2 3 4 4 5 6

Ungolfed (331 bajtów)

#include <stdio.h>

int female(int x);
int male(int x);
int i;
int count(a){
    for(i=0;i<a;i++){
        printf("%d ",female(i));
    }
    printf("\n");
    for(i=0;i<a;i++){
        printf("%d ",male(i));
    }
}
int female (int x){
    return x==0?1:x-male(female(x-1));
}
int male(x){
    return x==0?0:x-female(male(x-1));
}
int main()
{
    count(10);
}

0

8 , 195 bajtów

Kod

defer: M
: F dup not if 1 nip else dup n:1- recurse M n:- then ;
( dup not if 0 nip else dup n:1- recurse F n:- then ) is M
: FM n:1- dup ( F . space ) 0 rot loop cr ( M . space ) 0 rot loop cr ;

Stosowanie

ok> 5 FM
1 1 2 2 3 
0 0 1 2 2 

ok> 10 FM
1 1 2 2 3 3 4 5 5 6 
0 0 1 2 2 3 4 4 5 6 

Wyjaśnienie

Ten kod używa słowa rekurencyjnego i odroczonego

defer: M- Słowo Mzostanie zadeklarowane jako zdefiniowane później. To jest odroczone słowo

: F dup not if 1 nip else dup n:1- recurse M n:- then ;- Zdefiniuj F rekurencyjnie, aby wygenerować liczby żeńskie zgodnie z definicją. Pamiętaj, że Mnie został jeszcze zdefiniowany

( dup not if 0 nip else dup n:1- recurse F n:- then ) is M- Zdefiniuj M rekurencyjnie, aby wygenerować liczby męskie według definicji

: FM n:1- dup ( F . space ) 0 rot loop cr ( M . space ) 0 rot loop cr ; - Słowo używane do drukowania sekwencji liczb żeńskich i męskich

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.