Jak można znaleźć w tablicy pierwszą niekolejną liczbę.

0

Tak jak w tytule. Robię sobie takie zadanie https://www.codewars.com/kata/58f8a3a27a5c28d92e000144/train/javascript. Tutaj jest mój kod

function firstNonConsecutive(arr){
 let num = 0;
 for(let i = 0; i < arr.length; i++){
         num = arr.indexOf(arr[i]);
    }
    return num;
}

dla jednego przypadku mi przechodzi testy ale tylko dla jednego. Co powinienem zmienić w tym kodzie?

2

W jaki sposób zrobiłbyś to zadanie na kartce? (ew. w jaki sposób wytłumaczyłbyś to komuś na kartce?)

Siadasz, widzisz liczby: [5, 6, 7, 9, 10] i co robisz?

3

Tak dla zabawy (bo nie jest to optymalne rozwiązanie)

let getFirstNonSequenceNumber(array) => array.reduce((acc, cv, i, a) => { return acc !== null ? acc : cv + 1 == a[i + 1] ? null : a[i + 1]; }, null);

Ciało funkcji rozpisane nieco czytelniej:

someArray.reduce((accumulator, currentValue, index, array) => { 
    if (accumulator !== null)
        return accumulator;
    if (currentValue + 1 != array[index + 1])
        return array[index + 1];
    return null;
}, null);
0

Każda kolejna liczba powinna być większa o 1 od po przedniej więc aby sprawdzić czy liczba jest kolejna

currentNumber = arr[i];
lastNumber = arr[i-1];


ln == (cn-1)

Więc jeżeli warunek jest false to liczba kolejna nie jest

Tu przyda się negacja NOT

EDIT: W tym przypadku należy iterować od 1 a nie od zero w pętli
EDIT2: W teście w kodzie po pętli zwróć null inaczej kod nie przejdzie testów

0

Mam pytanie. Bo mam napisać warunek że jeśli wszystkie elementy w tablicy są kolejne to mam zwrócić null. No to sobie napisałem taki kod

function firstNonConsecutive (arr) {
  let result = 0;
  for(let i = 1; i < arr.length; i++){
    if(arr[i+1] == arr[i+1]){
      return null;
    }
  }
}

no i co prawda działa ale chciałem zapytać czy wszystko jest ok dla tego przypdaku

0

Ale… opisana teraz treść zadania przeczy kodowi. Kod wyraża algorytm: "zwróć null, jeśli co najmniej jeden element tablicy jest taki sam jak poprzedni". A opisana teraz treść zadania wyraża algorytm: "zwróć null, jeśli każdy element tablicy (tj. liczba) jest kolejny w stosunku do poprzedniego".


UPDATE: Wróć, pomyliłem się. Kod wyraża algorytm: "zwróć null, jeśli co najmniej jeden element tablicy jest taki sam jak on sam".

0

@Silv: Czyli podążając twoim tokiem rozumowania ten kod powinien się reprezentować w następujący sposób

function firstNonConsecutive (arr) {
  let result = 0;
  for(let i = 1; i < arr.length; i++){
    if(arr[i-1] !== arr[i+1]){
      return null;
    }
  }
}
0

Nie, nie zrozumieliśmy się. Opisana przez Ciebie teraz dwa posty wcześniej treść zadania jest poprawna. To kod jest niepoprawny.

Ten drugi kod wyraża algorytm: "zwróć null, jeśli co najmniej jeden element tablicy jest taki sam jak element dwa miejsca naprzód". Także jest niepoprawny.

Nie chcę Ci podawać rozwiązania na tacy; powiem tak: poprawny kod nie może zwracać null w pętli, zwracanie null musi być poza pętlą.

0

@Silv: powiedz czy sam warunek jest napisany chodzi mi o to co jest w nawiasach

3

Nie, Twój warunek nie jest prawidłowy.

Zacznijmy powoli - napisz funkcję, która przyjmuje jako parametry dwie liczby i zwraca true / false w zależności czy te dwie liczby są "po sobie", bądź nie:

function areConsecutive(a, b) {
  /* ... */
}

console.log(areConsecutive(1, 1)); // false
console.log(areConsecutive(1, 2)); // true
console.log(areConsecutive(2, 3)); // true
console.log(areConsecutive(2, 4)); // false
0
function areConsecutive(a,b){
	if(a + 1 == b){
		return true;
	}else{
		return false;
	}
}
console.log(areConsecutive(1, 1)); // false
console.log(areConsecutive(1, 2)); // true
console.log(areConsecutive(2, 3)); // true
console.log(areConsecutive(2, 4)); // false
3

Ok, mając to w pamięci, możemy wrócić do oryginalnej funkcji:

function firstNonConsecutive(arr) {
  /* ... */
}

Z całą pewnością musimy mieć jakąś pętlę, która będzie iterowała po całej tablicy:

function firstNonConsecutive(arr) {
  for (let i = 0; i < arr.length; i++) {
    /* ... */
  }
}

Teraz, aby móc wywołać areConsecutive(), potrzebujemy znać a oraz b - w jaki sposób uzupełniłbyś ten kod?

function firstNonConsecutive(arr) {
  for (let i = 0; i < arr.length; i++) {
    let a = /* ... */;
    let b = /* ... */;
  }
}

(tip: po uzupełnieniu komentarzy, przyjrzyj się warunkowi i < arr.length - czy w takiej postaci jest wystarczający?)

0

Tak jeszcze zanim się zastanowię nad tym warunkiem z pętli uzupełniłem te komentarze

function firstNonConsecutive(arr){
	for(let i = 0; i < arr.length; i++){
		let a = areConsecutive(a);
		let b = areConsecutive(b);
	}
	function areConsecutive(a,b){
	if(a + 1 == b){
		return true;
	}else{
		return false;
	}
}
}
console.log(areConsecutive([1,2,3,4,6,7,8]);

czy o to chodzi?

0

Co ta instrukcja robi, tak według Ciebie? :-)

let a = areConsecutive(a);
1

No do zmiennej a przypisuje wywołanie funckji areConsecutive(a,b)

Ale przecież funkcja areConsecutive() wymaga dwóch parametrów, a Ty podajesz tylko jeden.

0
function firstNonConsecutive(arr){
    for(let i = 0; i < arr.length; i++){
        let a = areConsecutive(a,b);
        let b = areConsecutive(a,b);
    }
    function areConsecutive(a,b){
        if(a + 1 == b){
            return false;
        }else{
            return true;
        }
    }
}
console.log(firstNonConsecutive([1,2,3,4,6,7,8]));
0

Że tak zapytam. W tej funkcji firstNonConsecutive muszę wywołać tą funkcje areConsecutive czy po prostu warunek napisać na podstawie funkcji areConsecutive

3

Mam wrażenie, że zupełnie nie rozumiesz kodu, który wrzucasz (patrz: https://en.wikipedia.org/wiki/Programming_by_permutation); pobawmy się zatem w komputer.

Załóżmy, że jesteś interpretatorem JavaScriptu i otrzymałeś do wykonania tę funkcję, z arr równym [1, 2, 3, 5]:

function firstNonConsecutive(arr){
    for(let i = 0; i < arr.length; i++){
        let a = areConsecutive(a,b);
        /* ... */
    }
}

Zaczynamy od pętli:

for(let i = 0; i < arr.length; i++){

... arr.length wynosi 4, zatem mamy:

for(let i = 0; i < 4; i++){

Wchodzimy do środka pętli, z i = 0 i uruchamiamy:

let a = areConsecutive(a,b);

Otrzymujemy do wykonania funkcję areConsecutive(a,b) - możesz mi powiedzieć jaką wartość ma zmienna a oraz czym (w tej konkretnej linijce) jest b?

1
function firstNonConsecutive(arr) {
  for (let i = 0; i < arr.length - 1; i++) {
    let a = arr[i];
    let b = arr[i + 1];

    if (!areConsecutive(a, b)) {
      return b;
    }
  }

  return null;
}
2

Tak dla lepszego zrozumienia kod @Patryk27 w pseudokodzie (usunąłem tę osobną funkcję do sprawdzania "niekolejności"):

FIRST_NON_CONSECUTIVE (arr) {
    for i from 0 to length(arr) - 2 {
        if not equal(arr[i] + 1, arr[i + 1])
        then return arr[i + 1]
    }
    return NULL
}

UPDATE: Poprawiłem błąd (wcześniej było if not equal(arr[i], arr[i + 1] + 1), co oczywiście niepoprawne).


UPDATE2: Poprawiłem błąd (wcześniej było then return b, co oczywiście niepoprawne).


UPDATE3: Poprawiłem błąd (wcześniej było then return arr[i], co oczywiście niepoprawne).


UPDATE4: Dzięki @Patryk27 poprawiłem błąd (wcześniej było then return arr[i] + 1, co oczywiście niepoprawne).

0
function firstNonConsecutive (arr) {

  for(var i=1;i<arr.length;i++) {
    
    if((arr[i-1]+1)!=arr[i]) return arr[i];

  }
  return null;
}
function firstNonConsecutive (arr) {
var temp = arr[0]+1;
  for(var i=0;i<arr.length-1;i++) {

    if((temp)!=arr[i+1]) return arr[i+1];
temp++;
  }
  return null; 
}
function firstNonConsecutive (arr) {

  for(var i=0;i<arr.length-1;i++) {

    if((arr[i]+1)!=arr[i+1]) return arr[i+1];

  }
  return null; 
}
function firstNonConsecutive (arr) {

  for(var i=0;i<arr.length-1;++i) {

    if((++arr[i])!=arr[i+1]) return arr[i+1];

  }
  return null; 
}

1 użytkowników online, w tym zalogowanych: 0, gości: 1