Forth (gforth), 81 bytes
: f begin 1+ >r i i 3 mod 1 r> begin 10 /mod >r 3 <> * r> ?dup 0= until * until ;
###Explanation
Explanation
- Add 1
- check if multiple of 3
- check if contains a 3
- if the result of step 3 or step 4 is true, repeat from step 1
###Code Explanation
Code Explanation
: f \ start a new word definition
begin \ start an indefinite loop
1+ \ add 1 to current number
>r i i \ put current number on return stack, then place on normal stack twice
3 mod \ check if number is multiple of 3
1 r> \ place a 1 on the stack, then move the current number to the normal stack
begin \ start another indefinite loop
10 /mod \ get quotient and remainder of dividing by 10
>r \ put quotient on return stack
3 <> \ check if remainder does not equal 3
* \ multiply by accumulator (cheaper version of "and")
r> \ remove quotient from return stack
?dup 0= \ if quotient does not equal 0, duplicate, else put -1 on stack
until \ end loop if top of stack does not equal 0
* \ multiply result of both checks (cheaper "and")
until \ end outer loop
; \ end word definition