Longueur d'une séquence Sumac [fermé]


11

Une séquence Sumac commence par deux entiers: t 1 et t 2 .

Le terme suivant, t 3 , = t 1 - t 2

Plus généralement, t n = t n-2 - t n-1

La séquence se termine lorsque t n <0.

Votre défi: écrire un programme ou une fonction qui imprime la longueur d'une séquence Sumac, en commençant par t 1 et t 2 .

  • t 1 et t 2 sont des entiers dans la plage de votre langue.
  • Des échappatoires standard s'appliquent.

Cas de test

t1  t2       sumac_len(t1,t2)

120  71      5
101  42      3
500  499     4
387  1       3

Bonus de rue bonus:

3    -128    1
-314 73      2

C'est le code-golf, donc la réponse la plus courte en octets l'emporte.


Étroitement liés , sinon un doublon
M. Xcoder

2
Cela semble être un bon défi, mais n'est pas clair. Sommes-nous censés prendre t1et t2en entrée? Et qu'est-ce que idans les cas de test?
caird coinheringaahing

2
Est-il garanti que t1 et t2 sont> = 0?
user202729

6
@Blacksilver Huh? Quel est ce bonus exactement? Les bonus sont généralement découragés de toute façon
Luis Mendo

6
Faut-il gérer t_1 = t_2 = 0? Est-ce que le «crédit de rue bonus» signifie que nous n'avons pas à gérer t_1 < 0ou t_2 < 0?
xnor

Réponses:


8

Husk , 8 octets

→V<¡oG-↔

Prend l'entrée comme une liste à 2 éléments. Essayez-le en ligne!

Explication

→V<¡oG-↔  Implicit input, say p=[101,42]
   ¡      Iterate on p:
       ↔    Reverse: [42,101]
    oG-     Cumulative reduce by subtraction: [42,59]
          Result is infinite list [[101,42],[42,59],[59,-17],[-17,76],[76,-93]...
 V<       Find the first index where adjacent pairs are lexicographically increasing.
          In our example [42,59] < [59,-17], so this gives 2.
→         Increment: 3

8

Haskell , 22 octets

a#b|b<0=1|c<-a-b=1+b#c

Essayez-le en ligne!

Je souhaite vraiment qu'il y ait un moyen de faire correspondre un motif à un nombre négatif ...

Explication

a#b|b<0=1|c<-a-b=1+b#c

a#b                     -- define a function (#) that takes two arguments a and b
   |b<0                 -- if b is negative...
       =1               -- return 1
         |              -- otherwise...
          c<-a-b        -- assign a-b to c...
                =  b#c  -- and return the result of (#) applied to b and c...
                 1+     -- incremented by 1

Je pense que l'explication est moins claire que le code lui-même pour une fois. : P
Ad Hoc Garf Hunter

@WheatWizard C'est très probablement parce que je crains les explications. : P
totalement humain

3

Husk , 12 11 octets

V<0t¡ȯF-↑2↔

Essayez-le en ligne!

Prend le crédit de rue bonus pour tout ce qui vaut.

Explication

    ¡ȯ       Repeatedly apply the function to the right to the list of all
             previous values and collect the results in an infinite list.
          ↔  Reverse the list of previous results.
        ↑2   Take the first two values (last two results).
      F-     Compute their difference (using a fold).
   t         Discard the first element.
V<0          Find the first index of a negative value.


2

MATL , 13 octets

`yy-y0<~]N2-&

Cela gère les entrées négatives (deux derniers cas de test).

Essayez-le en ligne! Ou vérifiez tous les cas de test .

Explication

`        % Do...while
  yy     %   Duplicate top two elements. Implicit inputs first time
  -      %   Subtract
  y      %   Duplicate from below: push previous term
  0<~    %   Is it 0 or greater? This is the loop condition
]        % End. Proceed with next iteration if top of the stack is true
N        % Push number of elements in stack
2-       % Subtract 2
&        % Specify that the next function, namely implicit display, should
         % only display the top of the stack

2

Brain-Flak , 142 90 octets

((()){{}<(({}({}))[({}[{}])({})])([(({})<(())>)](<>)){({}())<>}{}{((<{}>))<>{}}{}<>{}>}<>)

Essayez-le en ligne!

Pas très court. Prend l'entrée en arrière.

Explication

(
 (())   #Push 1
 {      #Until 0
  {}    #Pop (+1 to counter)
  <(({}({}))[({}[{}])({})])  #tn = tn-1 - tn-2
  ([(({})<(())>)](<>)){({}())<>}{}{((<{}>))<>{}}{}<>{}>  #Greater than 0?
 }      #End loop
 <>     #Get rid of everything
)       #Push result

2

05AB1E , 11 octets

[DŠ-D0‹#]NÌ

Essayez-le en ligne!

Explication

Prend l'entrée comme t2, t1

[             # start a loop
 DŠ           # duplicate top of stack and move it down 2 positions
   -          # subtract the top 2 values
    D0‹#      # if a copy of the top value is negative, break loop
        ]     # end loop
         NÌ   # push iteration index+2


1

J , 22 octets

[:#({:,-/)^:(0<{:)^:a:

Comment ça fonctionne:

                  ^:a: - Repeat until the result stops changing, store the results in a list
          ^:(0<{:)     - repeat if the second term is positive
   ({:,-/)             - makes a tuple (second, first minus second)
[:#                    - number of elements in the list ([: caps the fork)

Essayez-le en ligne!




0

JavaScript (ES6), 24 octets

Renvoie vrai au lieu de 1 .

f=(a,b)=>b<0||1+f(b,a-b)

Cas de test


1
@totallyhuman Alors vous n'auriez pas besoin f(b)(a-b)d'économiser.
M. Xcoder

Et si a<0? (1 de plus à parcourir)
user202729

Mise à jour: vous n'êtes plus obligé de prendre en charge les entrées négatives, mais c'est cool si vous le faites.
SIGSTACKFAULT du

0

Pyth , 11 octets

Il s'agit d'une fonction récursive qui prend deux arguments, Get H. Le lien est légèrement modifié afin d'appeler réellement la fonction sur l'entrée donnée.

M|<H0hgH-GH

Suite de tests.


0

APL (Dyalog) , 23 octets

2∘{0>-/⍵:⍺⋄(⍺+1)∇-⍨\⌽⍵}

Essayez-le en ligne!

Comment?

2∘ - avec un accumulateur initial de 2,

-/⍵ - si le prochain mandat

0> - est inférieur à 0,

- retourner l'accumulateur. autrement,

(⍺+1) - augmenter l'accumulateur

- et recurse avec

-⍨\⌽⍵ - les deux derniers éléments inversés et différenciés.

      {⍵} 8 2
8 2
      {⌽⍵} 8 2
2 8
      {-⍨\⌽⍵} 8 2
2 6


0

dc , 24 octets

?[dsb-1rlbrd0<a]dsaxz1-p

Essayez-le en ligne!

Explication

?                         # read input                | 71 120
 [dsb-1rlbrd0<a]          # push string               | [string] 71 120
                dsa       # copy top to register a    | [string] 71 120
                   x      # execute the string        | -5 27 1 1 1 1
                    z     # push length of stack      | 6 -5 27 1 1 1 1
                     1-   # decrement top by 1        | 5 -5 27 1 1 1 1
                       p  # print top

 # string in register a:

  dsb                     # copy top to register b    | 71 120
     -                    # subtract                  | 49
      1                   # push 1                    | 1 49
       r                  # swap top two elements     | 49 1
        lb                # load register b           | 71 49 1
          r               # swap top two elements     | 49 71 1
           d0<a           # if top < 0 execute register a

0

Assemblage Z80, 10 octets

Cette version tente de faire la version "street cred" de la tâche. Cependant, pour le cas de test suggéré où t1 = -314, t2 = 73, ce programme produit la réponse "0", ce qui, franchement, a un peu plus de sens que "2".

SumacLen:
        xor a           ; HL = t[1], DE = t[2], A is the counter
Loop:   bit 7,h
        ret nz          ; stop if HL is negative
        inc a
        sbc hl,de       ; HL = t[3], DE = t[2]
        ex de,hl        ; HL = t[2], DE = t[3]
        jr Loop

Le programme de test pour ZX Spectrum 48K écrit à l'aide de l'assembleur Sjasmplus peut être téléchargé ici . Un instantané compilé est également disponible .


Vraisemblablement, la version non bonus utilise à la Loop: ret cplace?
Neil

Oui, la vérification du bit de signe H ne serait plus nécessaire. "bit 7, h" peut être supprimé et "ret nz" remplacé par "ret c", avec "inc a" se déplaçant juste devant. 8 octets au total.
introspec

Ouais; le 2résultat est vraiment juste une chose avec mon programme.
SIGSTACKFAULT

Voulez-vous dire que 0c'est une réponse acceptable pour ce cas de test? Ou voulez-vous dire qu'il serait préférable de modifier mon programme en sortie 2?
introspec

0

Java (OpenJDK 8) , 85 75 octets

(b,c)->{int d,k=1;for(;;){if(c<0)break;else{d=c;c=b-c;b=d;k++;}}return k;};

Essayez-le en ligne!

non golfé:

(b,c)->{
    int d,k=1;
    for(;;){
        if(c<0)
            break;
        else{
            d=c;
            c=b-c;
            b=d;
            k++;
        }
    }
    return k;
};

1
Je crois que ce serait plus court en tant que lambda.
Potato44

@ Potato44 en effet, mais je n'ai pas eu le temps hier de le faire, mais je l'ai fait maintenant et j'ai économisé 10 octets.
Luca H



0

Perl 6 ,24 19 octets

-5 octets grâce à Brad Gilbert b2gills.

{+(|@_,*-*...^0>*)}

Essayez-le en ligne!

Explication : le tout entre parenthèses est exactement la séquence en question ( |@_sont les 2 premiers termes (= les deux paramètres), *-*est une fonction qui prend deux arguments et renvoie leur différence, et * <0est la condition d'arrêt (terme inférieur à 0) Nous omettons le dernier terme avec ^après le ...). Nous forçons ensuite le contexte numérique par l' +opérateur, ce qui donne la longueur de la séquence.


{+(|@_,*-*...^0>*)}
Brad Gilbert b2gills

@ BradGilbertb2gills: Merci. J'ai eu une grande pause avec le golf, donc je suis un peu rouillé. Ce que je ne comprends pas, c'est pourquoi vous devez mettre l'espace en * <0*, but why you don't need it in 0> * `...
Ramillies

L'espace est nécessaire pour ne pas être confondu avec%h<a>
Brad Gilbert b2gills
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.