Vinnaren i pepparkakshustävlingen!
  • 4
  • 5
2014-05-01, 13:16
  #49
Medlem
Littons avatar
Citat:
Ursprungligen postat av Povel
Håller inte med. Kanske har det blandats ihop några versioner när du redigerat scripten i google docs, eller så är anropet inte rätt.
Här är en testkörning jag gör på min kod, får samma resultat i google docs-miljö:

Edit, testar lite till ...
__________________
Senast redigerad av Litton 2014-05-01 kl. 13:26.
Citera
2014-05-01, 13:41
  #50
Medlem
Littons avatar
Citat:
Ursprungligen postat av Povel
Håller inte med. Kanske har det blandats ihop några versioner när du redigerat scripten i google docs, eller så är anropet inte rätt.
Här är en testkörning jag gör på min kod, får samma resultat i google docs-miljö:
Kod:
Running 13 tests:
idx 10: => 47 ~78 -
             
47 OK
Ran 13 tests
0 errors

formatet är: siffra ~limit %excludes
, raden under är resultatet och om det var OK.

Nu är det j*vligt nära. Upptäckte ett fel och det är index 10 bland dina exempel. Speciafallet vi pratat om det senaste gäller enbart när det finns excludes, annars rullar det på som vanligt. Indata 47, till red default med limit 78, d.v.s. red(NN), ska bli 4 + 7 dvs = 11. Reds huvuduppgift är ju att summera alla siffror i ett tal.
Citera
2014-05-01, 15:43
  #51
Medlem
Povels avatar
Citat:
Ursprungligen postat av Litton
Nu är det j*vligt nära. Upptäckte ett fel och det är index 10 bland dina exempel. Speciafallet vi pratat om det senaste gäller enbart när det finns excludes, annars rullar det på som vanligt. Indata 47, till red default med limit 78, d.v.s. red(NN), ska bli 4 + 7 dvs = 11. Reds huvuduppgift är ju att summera alla siffror i ett tal.

Nej, in med 47 och linit 78 kan bara bli 47. Annars är det något mer du inte berättat.

/p
Citera
2014-10-16, 13:53
  #52
Medlem
Littons avatar
Hej igen Povel!

Nu när hösten fallit över oss så blev jag inspirerad att fortsätta med dina script och mina projekt med Google Sheets.

Först kan jag säga att du hade helt rätt igen! Funktionaliteten ska inte ändras. Bra att du stod på dig. Jag hade fått någon idé om att skapa en universell lösning, men tyvärr krockade den med nuvarande funktions uppbyggnad. Nuvarande lösning är praktisk, specialfallen löstes med in IF-sats i Google Sheets. Så här:
Kod:
IF(RED(A2)<10;RED(A2);RED(A2)&"/"&RED(A2;9;{11}))
Med enda skillnaden att i mitt dokument använder jag hjälpkolumner.

Enda kruxet jag upptäckt är att Google Docs skriptredigerare klagar när man debuggar RED() och Flatten().
RED > Exceeded maximum stack depth.
FLATTEN > TypeError: Det går inte att läsa egenskapen "length" från undefined.

Mycket stor hjälp med allt detta. Det går att skriva en formula för detta med befintliga funktioner i Google Sheets (jag hade en rudimentär innan), men de blir extremt långa och svårskötta. Med din hjälp blev det hanterbart.
Citera
2014-10-16, 15:51
  #53
Medlem
Povels avatar
Citat:
Ursprungligen postat av Litton
Hej igen Povel!
Enda kruxet jag upptäckt är att Google Docs skriptredigerare klagar när man debuggar RED() och Flatten().
RED > Exceeded maximum stack depth.
FLATTEN > TypeError: Det går inte att läsa egenskapen "length" från undefined.


Jaha... det kanske beror på indata som inte förutsetts ännu.

Nedan är den senaste koden jag postade och kallade för "aktuell" då (vet inte om jag har kvar något på datorn hemma, eller om du modifierat den senare) - FAST flatten är nu lite skyddad mot input som inte går att loopa över. Kanske löser det stack-depth-saken i red också på kuppen som en följd, ingen aning.

Kod:
function red(nlimitexceptionsrec) {
  var 
defaultLimit 78minLimit 9;
  
"number" == typeof limit ||*(limit defaultLimit);
  if (
limit<minLimit) {throw new Error("Invalid limit (under "+minLimit+"): "+limit);}
  if (
"number"== typeof exceptions) {exceptions = [exceptions];}
  else if (
"[object Array]" != ({}).toString.call(exceptions)) {exceptions = [];}
  else if (
"[object Array]" == ({}).toString.call(exceptions[0])) {exceptions flatten(exceptions);}
  if (
n<=limit || exceptions.indexOf(n)>-&& (!rec && limit>minLimit)) {return n;}
  var 
String(n), result 0;
  for (var 
idx=0len=s.lengthidx<len; ++idx) {
    
result += parseInt(s.charAt(idx), 10);
  }
  return (
result <= limit || exceptions.indexOf(result)>-1) ? result red(resultlimitexceptionstrue);
}

function 
flatten(arr) {
  var 
result = [];
  if (
arr) {
    for (var 
idx=0len=arr.lengthidx<len; ++idx) {result.push(arr[idx]);}
  }
  return 
result;


/p
Citera
2014-10-23, 14:52
  #54
Medlem
Littons avatar
Tackar. Från klarhet till klarhet.
Nu anmärkte skriptredigerarens debugger enbart på ett ställe, för både red och flatten.
Syntaxfel på raden:
Kod:
  "number" == typeof limit ||*(limit = defaultLimit); 
Citera
2014-10-23, 16:28
  #55
Medlem
Povels avatar
Citat:
Ursprungligen postat av Litton
Tackar. Från klarhet till klarhet.
Nu anmärkte skriptredigerarens debugger enbart på ett ställe, för både red och flatten.
Syntaxfel på raden:
Kod:
  "number" == typeof limit ||*(limit = defaultLimit); 


Ja det är en felaktig "*" där innan startparentesen, måste ha hänt vid nån copy/paste, sorry.

/p
Citera
2014-10-23, 19:48
  #56
Medlem
Littons avatar
Asterisken raderad och Google Sheets svalde allt. Debuggern rapporterar nu inga fel.

Jag har inte ändrat något i ditt script. Så här ser det ut nu efter att asterisken raderats:
Kod:
function red(n, limit, exceptions, rec) { 
  var defaultLimit = 78, minLimit = 9; 
  "number" == typeof limit ||(limit = defaultLimit); 
  if (limit<minLimit) {throw new Error("Invalid limit (under "+minLimit+"): "+limit);} 
  if ("number"== typeof exceptions) {exceptions = [exceptions];} 
  else if ("[object Array]" != ({}).toString.call(exceptions)) {exceptions = [];} 
  else if ("[object Array]" == ({}).toString.call(exceptions[0])) {exceptions = flatten(exceptions);} 
  if (n<=limit || exceptions.indexOf(n)>-1 && (!rec && limit>minLimit)) {return n;} 
  var s = String(n), result = 0; 
  for (var idx=0, len=s.length; idx<len; ++idx) { 
    result += parseInt(s.charAt(idx), 10); 
  } 
  return (result <= limit || exceptions.indexOf(result)>-1) ? result : red(result, limit, exceptions, true); 
} 

function flatten(arr) { 
  var result = []; 
  if (arr) { 
    for (var idx=0, len=arr.length; idx<len; ++idx) {result.push(arr[idx]);} 
  } 
  return result; 
}

Det enda som skiljer mot tidigare är att for i flatten har omslutits av "if (arr) {". Men det vet du redan.

Stort tack!
Citera
2014-10-24, 00:13
  #57
Medlem
Littons avatar
När man väl kunde tro att det inte fanns några problem kvar att räta ut så dök ett nytt snabbt upp. Det uppstod när jag försökte baka in formlerna med ArrayFormula. Med ArrayFormula kan hela kolumner populeras med formler utan att de behöver kopieras från cell till cell. Exempelvis; räcker det att formeln skrivs högst upp i en kolumn så aktiveras den sedan på varje rad. Men när jag gjorde detta med RED så fick jag meddelandet "Fel: Exceeded maximum stack depth (rad 26)."

Rad 26:
Kod:
  return (result <= limit || exceptions.indexOf(result)>-1) ? result : red(result, limit, exceptions, true); 
Citera
2014-10-28, 19:12
  #58
Medlem
Povels avatar
Citat:
Ursprungligen postat av Litton
När man väl kunde tro att det inte fanns några problem kvar att räta ut så dök ett nytt snabbt upp. Det uppstod när jag försökte baka in formlerna med ArrayFormula. Med ArrayFormula kan hela kolumner populeras med formler utan att de behöver kopieras från cell till cell. Exempelvis; räcker det att formeln skrivs högst upp i en kolumn så aktiveras den sedan på varje rad. Men när jag gjorde detta med RED så fick jag meddelandet "Fel: Exceeded maximum stack depth (rad 26)."

Rad 26:
Kod:
  return (result <= limit || exceptions.indexOf(result)>-1) ? result : red(result, limit, exceptions, true); 

Länka eller DM:a ett googledoc där det sker. Skulle vilja se indatat som det sker för.

/p
Citera
  • 4
  • 5

Stöd Flashback

Flashback finansieras genom donationer från våra medlemmar och besökare. Det är med hjälp av dig vi kan fortsätta erbjuda en fri samhällsdebatt. Tack för ditt stöd!

Stöd Flashback