Positive decimal integers with the digit 1 occurring exactly twice

From Rosetta Code
Revision as of 15:41, 8 July 2021 by Petelomax (talk | contribs) (→‎{{header|Phix}}: single sprint)
Positive decimal integers with the digit 1 occurring exactly twice is a draft programming task. It is not yet considered ready to be promoted as a complete task, for reasons that should be found in its talk page.
Task
Find numbers n in which number 1 occur 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

Go

Translation of: Wren
Library: Go-rcu

<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

Library: Wren-math
Library: Wren-seq
Library: Wren-fmt

<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.