Positive decimal integers with the digit 1 occurring exactly twice
- Task
Find positive decimal integers n in which the digit 1 occurs exactly twice, where n < 1,000.
ALGOL 68
Generates the numbers. In order to print them in order, a table of double 1 numbers yes/no is generated. <lang algol68>BEGIN # find numbers where the digit 1 occurs twice, up to 999 #
[ 1 : 999 ]BOOL double 1; FOR i TO UPB double 1 DO double 1[ i ] := FALSE OD; # generte the numbers # FOR i FROM 0 TO 9 DO IF i /= 1 THEN double 1[ 110 + i ] := TRUE; double 1[ 101 + ( i * 10 ) ] := TRUE; double 1[ ( i * 100 ) + 11 ] := TRUE FI OD; # print the numbers in order # INT double 1 count := 0; FOR i TO UPB double 1 DO IF double 1[ i ] THEN print( ( " ", whole( i, -3 ) ) ); IF ( double 1 count +:= 1 ) MOD 10 = 0 THEN print( ( newline ) ) FI FI OD
END</lang>
- Output:
11 101 110 112 113 114 115 116 117 118 119 121 131 141 151 161 171 181 191 211 311 411 511 611 711 811 911
ALGOL W
Generates the numbers and sorts them into order using Sorting algorithms/Quicksort#ALGOL W. <lang algolw>begin % find numbers where the digit 1 occurs twice, up to 999 %
integer double1Count; integer array double1 ( 1 :: 100 ); % assume there will be at most 100 numbers % % Quicksorts in-place the array of integers v, from lb to ub - external % procedure quicksort ( integer array v( * ) ; integer value lb, ub ) ; algol "sortingAlgorithms_Quicksort" ; % increments n by 1 and returns its new value % integer procedure inc ( integer value result n ) ; begin n := n + 1; n end inc ; % generate the numbers % double1Count := 0; for i := 0 until 9 do begin if i not = 1 then begin double1( inc( double1Count ) ) := 110 + i; double1( inc( double1Count ) ) := 101 + ( i * 10 ); double1( inc( double1Count ) ) := ( i * 100 ) + 11 end if_i_ne_1 end for_i ; % sort the numbers % quickSort( double1, 1, double1Count ); % print the numbers % for i := 1 until double1Count do writeon( i_w := 1, s_w := 1, double1( i ) ); write(); write( i_w := 1, s_w := 0, "Found ", double1Count, " numbers" )
end.</lang>
- Output:
11 101 110 112 113 114 115 116 117 118 119 121 131 141 151 161 171 181 191 211 311 411 511 611 711 811 911 Found 27 numbers
Go
<lang go>package main
import (
"fmt" "rcu"
)
func main() {
fmt.Println("Decimal numbers under 1,000 whose digits include two 1's:") var results []int for i := 11; i <= 911; i++ { digits := rcu.Digits(i, 10) count := 0 for _, d := range digits { if d == 1 { count++ } } if count == 2 { results = append(results, i) } } for i, n := range results { fmt.Printf("%5d", n) if (i+1)%7 == 0 { fmt.Println() } } fmt.Println("\n\nFound", len(results), "such numbers.")
}</lang>
- Output:
Decimal numbers under 1,000 whose digits include two 1's: 11 101 110 112 113 114 115 116 117 118 119 121 131 141 151 161 171 181 191 211 311 411 511 611 711 811 911 Found 27 such numbers.
Phix
function two_ones(string s) return length(find_all('1',s))=2 end function sequence res = filter(apply(tagset(999),sprint),two_ones) printf(1,"%d found:\n %s\n",{length(res),join_by(res,1,9," ","\n ")})
- Output:
27 found: 11 101 110 112 113 114 115 116 117 118 119 121 131 141 151 161 171 181 191 211 311 411 511 611 711 811 911
Raku
<lang perl6>say display 10, '%3d', ^1000 .grep: { .comb.Bag{'1'} == 2 };
sub display {
cache $^c; "{+$c} matching:\n" ~ $c.batch($^a)».fmt($^b).join: "\n"
}</lang>
- Yields:
27 matching: 11 101 110 112 113 114 115 116 117 118 119 121 131 141 151 161 171 181 191 211 311 411 511 611 711 811 911
Ring
<lang ring> load "stdlib.ring" see "working..." + nl see "Numbers n in which number 1 occur twice:" + nl
row = 0 sum = 0 limit = 1000
for n = 1 to limit
strn = string(n) ind = count(strn,"1") if ind = 2 see "" + n + " " row = row + 1 if row%5 = 0 see nl ok ok
next
see nl + "Found " + row + " numbers" + nl see "done..." + nl
func count(cstring,dstring)
sum = 0 while substr(cstring,dstring) > 0 sum = sum + 1 cstring = substr(cstring,substr(cstring,dstring)+len(string(sum))) end return sum
</lang>
- Output:
working... Numbers n in which number 1 occur twice: 11 101 110 112 113 114 115 116 117 118 119 121 131 141 151 161 171 181 191 211 311 411 511 611 711 811 911 Found 27 numbers done...
Wren
<lang ecmascript>import "/math" for Int import "/seq" for Lst import "/fmt" for Fmt
System.print("Decimal numbers under 1,000 whose digits include two 1's:") var results = (11..911).where { |i| Int.digits(i).count { |d| d == 1 } == 2 }.toList for (chunk in Lst.chunks(results, 7)) Fmt.print("$5d", chunk) System.print("\nFound %(results.count) such numbers.")</lang>
- Output:
Decimal numbers under 1,000 whose digits include two 1's: 11 101 110 112 113 114 115 116 117 118 119 121 131 141 151 161 171 181 191 211 311 411 511 611 711 811 911 Found 27 such numbers.
XPL0
<lang XPL0>func Ones(N); \Return count of 1's in N int N, Count; [Count:= 0; repeat N:= N/10;
if rem(0) = 1 then Count:= Count+1;
until N = 0; return Count; ];
int N, Count; [for N:= 1 to 1000-1 do
if Ones(N) = 2 then [IntOut(0, N); Count:= Count+1; if rem(Count/10) = 0 then CrLf(0) else ChOut(0, 9\tab\); ];
CrLf(0); IntOut(0, Count); Text(0, " such numbers found below 1000. "); ]</lang>
- Output:
11 101 110 112 113 114 115 116 117 118 119 121 131 141 151 161 171 181 191 211 311 411 511 611 711 811 911 27 such numbers found below 1000.