Jangan pernah memberi tahu saya peluangnya


38

Memasukkan

Bilangan bulat n (≥ 1) dan digit d (bilangan bulat sehingga 0 ≤  d  ≤ 9).

Dalam urutan apa pun; dari stdin atau parameter atau apa pun; ke suatu program atau fungsi; dll.

Keluaran

Bilangan bulat dari 1 sampai n inklusif (agar) yang representasi desimal mengandung bahkan jumlah d s. (Artinya, bilangan bulat dalam daftar adalah bilangan bulat yang memiliki, masing-masing, jumlah yang lebih dari d s.)

Dalam format standar apa pun, dll. Secara khusus, output tidak perlu direpresentasikan dalam desimal.

Jika output sebagai string tunggal, bilangan bulat harus dipisahkan entah bagaimana (spasi, koma, baris baru, byte nol, apa pun).

Contohnya

in(d,n) ↦ out
1,12    ↦ 2 3 4 5 6 7 8 9 11
0,111   ↦ 1,2,3,4,5,6,7,8,9,11,12,13,14,15,16,17,18,19,21,22,23,24,25,26,27,28,29,31,32,33,34,35,36,37,38,39,41,42,43,44,45,46,47,48,49,51,52,53,54,55,56,57,58,59,61,62,63,64,65,66,67,68,69,71,72,73,74,75,76,77,78,79,81,82,83,84,85,86,87,88,89,91,92,93,94,95,96,97,98,99,100,111

Terima kasih

Untuk kuintopia untuk judul.


Apakah 0 dihitung sebagai angka genap?
MilkyWay90

@ MilkyWay90, tentu saja.
msh210

Jawaban:


3

Jelly, 7 byte

RDċ€Ḃ¬T

Cobalah online!

Bagaimana itu bekerja

RDċ€Ḃ¬T  Main link. Arguments: n, d

R        Range; yield [1, ..., n].
 D       Convert each integer in the range to base 10.
  ċ€     Count the occurrences of d in each array of decimal digits.
    Ḃ    Compute the parities.
     ¬   Negate, so even amounts evaluate to 1, odds to 0.
      T  Find all indices of truthy elements.

13

05AB1E , 11 10 byte

Kode:

\>GN¹¢ÈiN,

Penjelasan:

\           # Pop input, which saves the first input into ¹
 >          # Increment on second input
  G         # For N in range(1, input + 1)
   N        # Push N
    ¹       # Push the first input from the input register
     ¢      # Count the number of occurences of the digit in N
      È     # Is even?
       iN,  # If true, print N with a newline

Cobalah online

Menggunakan pengodean CP-1252 .


¢ menafsirkan kedua argumen sebagai string?
Sparr

@Parr Itu tergantung, itu juga bisa dilakukan pada daftar yang berisi string. Tapi di sini, itu mengartikan kedua argumen sebagai string.
Adnan

13

Haskell, 69 63 52 50 byte

d#n=[i|i<-[1..n],even$sum[1|x<-show i,read[x]==d]]

Solusi straightforwared untuk posting pertama saya di sini. Ini digunakan showuntuk menghitung jumlah d's. Saya secara eksplisit tidak menggunakan Charsebagai masukan untuk d, yang akan menyelamatkan 12 6 (setelah mengedit Damien) byte.

EDIT: 11 byte lebih sedikit berkat Damien! EDIT 2: 2 byte lagi lebih sedikit berkat nimi!


2
Anda dapat mengganti filter dengan daftar pemahaman: fdn = [i | i <- [1..n], bahkan $ jumlah [1 | x <-tampilkan saya, baca [x] == d]]
Damien

12

Befunge, 1080 945 byte

vd>"000">" "v
&0      ^              p21-1+*68<
62            >        v
8           >-|        >12g68*-:|
*             >11g1+11p^        $
+                      v  <
5                         |%2g11<
5                      v.:<          
+         v            <        
0         >268*+12p68*11p"000"40p50p60pv
p
           v                             -1<
             v-g01p06+1g06<
>&         >:>:10g1-`     |            >:0`|
             v            <                @
             v-+55p05+1g05<      
             >:54+`       |
   v               p04+g04<
  ^          <                <      <
   >60g68*-0`|      >50g68*-0`|
             >" "60p^         >" "50p^

Skor diberikan bahwa kami menghitung seluruh kotak, termasuk baris baru, yang masuk akal. Anda dapat menyalin tempel kode ke interpeter . Berikan dua input, pertama d dan kemudian n . Solusi ini tidak berfungsi untuk nilai yang lebih besar dari n > 999.

Ini jelas tidak akan menjadi pesaing untuk hadiah utama, tapi saya sudah lama ingin menerapkan codegolf di Befunge untuk saat ini, jadi saya memutuskan untuk melakukannya saja. Saya pikir ini tidak akan mendekati solusi Befunge yang optimal, karena ini adalah hal aktual pertama yang saya lakukan di Befunge. Jadi, saran dipersilahkan, jika Anda memerlukan klarifikasi atau informasi lebih lanjut, silakan beri tahu saya di komentar.

Mencoba penjelasan:

Di kolom pertama ke bawah kita membaca bilangan bulat dari input, tambahkan 48 (6 * 8, Anda akan melihat ini lebih sering) untuk mengubahnya menjadi nilai ASCII yang sesuai dan memasukkannya ke (10, 0).

& - baca input

68*+ - tambahkan 48

55+0p - beri nilai pada (10, 0)

Perhatikan bahwa dat (1, 0)hanya cara mudah untuk mendapatkan angka 100 di tumpukan.

Setelah itu, kita pergi ke timur dan membaca integer lain dan masuk ke apa yang saya sebut ASCIIfier. Ini mengubah angka saat ini menjadi serangkaian karakter ASCII. ASCIIfier adalah potongan segi empat dari (13, 12)hingga (26, 17). Ini terdiri dari dua loop, pertama menghitung hunder dan dari puluhan dan menempatkan mereka ke dalam tiga digit di (6, 0)dan (5, 0). Setelah itu digit terakhir dimasukkan ke dalam (4, 0). Jadi angkanya sebenarnya terbalik.

v-g01p06+1g06< - increment the "hunderds counter" located at (0, 6) and decrease current value by 100
>:10g1-`     | - ASCIIfier entry; check if the current value is > 99, if so, go up, else go down
v            < - go to start of "tens counter"
v-+55p05+1g05< - increment the "tens counter" located at (0, 5) and decrease current value by 10
>:54+`       | - check if current value is > 9, if so, go up, else go down
      p04+g04< - put the final value into the "singles counter" located at (0, 4)

Setelah meletakkan integer saat ini ke dalam serangkaian karakter ASCII, kami bergerak sedikit lebih ke selatan untuk menghapus nol yang berurutan. Dengan demikian, setelah itu, apa yang awalnya tiga nol di atas, akan menjadi angka saat ini, tanpa nol yang diawali.

Lalu kami naik kembali, jauh ke utara, di mana kami meletakkan tiga digit di tumpukan. Kami mengulangi tiga digit di loop atas, setiap kali menambah penghitung terletak di (1, 1)jika digit saat ini sesuai dengan input d

Ketika itu selesai, kita pergi dan memeriksa untuk melihat apakah penghitung yang terletak di (1, 1)ganjil atau genap. Jika itu genap, kami menampilkan angka saat ini dan beralih ke loop luar yang besar untuk mengurangi nilai saat ini dan mulai dari awal lagi.


Silakan kirim penjelasan jika Anda punya waktu!
A Simmons

Saya telah menambahkan upaya deskripsi.
Mengetahui

Ngomong-ngomong, saya baru tahu saya harus menampilkan hasilnya dalam urutan menaik, yang membuat ini semakin tidak sesuai dengan persyaratan ....
rael_kid

Selalu beri +1 untuk jawaban Befunge yang berfungsi! BTW, apakah ini benar-benar 945 byte? Ini mengatakan 679
Luis Mendo

Hehe terima kasih. Saya menghitung 945 karena saya mengambil seluruh kuadrat dari 21 baris x 45 kolom (termasuk baris baru)
rael_kid

7

Python 2, 50 byte

f=lambda d,n:n*[0]and f(d,n-1)+~`n`.count(d)%2*[n]

Fungsi rekursif yang mengambil digit dsebagai string dan batas atas nsebagai angka.

Hitungan angka ddi 's ndiuji untuk menjadi lebih dengan mengambil itu sedikit pelengkap modulo 2, yang memberikan 1bahkan dan 0untuk ganjil. Banyak nini menambahkan ke daftar, dan fungsi berulang ke n-1, berhenti melalui hubung singkat logis pada daftar kosong ketika n==0.

Jika output dapat diberikan dalam urutan menurun, satu byte dapat disimpan, untuk 49 byte:

f=lambda d,n:n*[0]and~`n`.count(d)%2*[n]+f(d,n-1)

Solusi 51 byte lama:

lambda d,n:[x+1for x in range(n)if~`~x`.count(d)&1]

Fungsi anonim yang mengambil digit dsebagai string dan batas atas nsebagai angka.

Dua trik digunakan:

  • Python rangeadalah indeks-nol 0...n-1, jadi kami menambahkan satu untuk setiap nilai potensial x. Kemudian, untuk menghitung d's di x+1, menghemat karakter untuk menggunakan negasi ~xsebagai gantinya.
  • Untuk memfilter nilai-nilai genap, kita lakukan ~_%2, bit-flip yang pertama untuk mengganti paritas, kemudian mengambil bit terakhir dengan &1(sama seperti di %2sini), menghasilkan nilai yang benar hanya jika yang asli genap.


4

Lua, 86 Bytes

Jika menggunakan pemisah yang tidak konsisten diizinkan, saya bisa menggantinya io.writedengan print, artinya angka akan dipisahkan oleh satu atau beberapa baris baru.

Ini adalah program penuh, yang harus disebut seperti ini: lua file.lua d n.

Ini menghapus semua non- dkarakter dari angka saat ini dan menggunakan ukuran string yang dihasilkan untuk memutuskan apakah kita harus mengeluarkannya atau tidak.

for i=1,0+arg[2]do io.write(#(i..''):gsub("[^"..arg[1].."]","")%2<1 and i.." "or"")end

4

JavaScript (ES6) 64

Fungsi anonim dengan output ke konsol. Implementasi langsung menggunakan splituntuk menghitung angka.

(d,n)=>{for(i=0;i++<n;)(i+'').split(d).length&1&&console.log(i)}

Output menggunakan alertakan menjadi 6 byte lebih sedikit, tapi saya benar-benar tidak menyukainya (dan saya toh tidak akan mengalahkan bahasa mainan)


4

MATL , 12 10 byte

:!V!=s2\~f

Input pertama adalah n , kedua adalah d sebagai string. Sebagai contoh:

12
'1'

Cobalah online!

:       % implicitly take input n (number). Generate row vector [1,2,...,n]
!       % transpose into column vector
V       % convert each number to string. Gives 2D char array padded with spaces
!       % transpose
=       % implicitly take input d (string). Compare with each element of the array
s       % sum of each column: number of coincidences with d
2\~     % true for even values
f       % find indices of true values. Implicitly display

4

Ruby, 47 42 byte

?1.upto $*[1]{|s|s.count($*[0])%2<1&&p(s)}

Jalankan dengan d dan n sebagai parameter baris perintah, mis

ruby golf.rb 1 12

2
Jawaban pertama yang bagus! Selamat datang di PPCG! : D
mbomb007

Sudah selesai dilakukan dengan baik! Di Ruby 1.9+, Anda dapat menggunakan ?1untuk "1". Dan itu kurang cantik, tapi byte lebih pendek, untuk melakukan %2>0alih-alih.odd?
histocrat

4

PowerShell, 62 55

param($1,$2);1..$2|?{!(([char[]]"$_"-match$1).Count%2)}

sunting: menggunakan blok param dalam hal ini lebih pendek. menghapus beberapa ruang yang berlebihan


Bukan bahasa golf tapi itu satu-satunya yang saya benar-benar tahu. Ini akan berhasil disimpan sebagai skrip dan disebut seperti ini M:\Scripts\cgNeverTellMeTheOdds.ps1 1 12. Argumen pertama adalah digit d dan yang kedua adalah integer n .

Buat array angka 1 ke n . Untuk masing-masing konversi itu menjadi array karakter. 10 akan menjadi 1,0. Menggunakan -matchsebagai operator array mengembalikan semua elemen yang cocok dengan digit d . Hitung jumlah elemen yang dikembalikan dan mod 2 hasilnya. Hasilnya akan 0 untuk genap dan 1 untuk ganjil. 0 sebagai boolean adalah false sehingga kami menggunakan !untuk loop untuk mengevaluasi hasil ganjil ke false dan bahkan hasil menjadi benar.

Output adalah baris baru yang dibatasi pada konsol.


Selamat datang di PPCG, jawaban pertama yang bagus! :)
FryAmTheEggman

@FryAmTheEggman Sweet. Terima kasih untuk anggukannya. Saya pikir ini akan dikubur di bawah semua jawaban lain.
Matt

3

Retina , 99 105 byte

Perhatikan spasi tambahan. <empty>mewakili garis kosong.

\d+$
$*
+`^(. )(1*)1\b
$1$2 1$2
1+
$.0
+`^(.)(.*) ((?!\1)\d)*\1((?!\1)\d|(\1)((?!\1)\d)*\1)*\b
$1$2
^.  
<empty>

Mengambil input seperti 1 12. Output adalah ruang yang dipisahkan dalam urutan menurun.

Saya dimodifikasi 0*1(0|10*1)* untuk mencocokkan angka ganjil \1dalam angka. Aku berubah 0ke (?!\1)\d, dan 1untuk \1menciptakan garis regex lama Anda lihat di atas. Memahami cara kerja regex tertaut sangat penting.

Cobalah online

Penjelasan komentar tentang versi lama

Jika pesanan menurun baik-baik saja

\d+$            Convert last number N to unary
$*
+`1(1*)$        Create list N N-1 ... 1 in unary
$0 $1
 (1)+           Convert back to decimal
 $#1
+`^(.)(.*) ((?!\1)\d)*\1((?!\1)\d|(\1)((?!\1)\d)*\1)*   Remove numbers w/ odd num of D's
$1$2 
^.              Remove first parameter
<empty>

1
Anda dapat menggunakan 1+dan $.0melakukan konversi dari unary back ke desimal.
FryAmTheEggman

3

Utilitas Bash + GNU, 37

  • 1 byte disimpan berkat @Ruud.
seq $1|egrep "^[^$2]*($2[^$2]*){2}*$"

The *berikut pembukaan kurung tampaknya berlebihan. Menghapusnya menghemat 1 byte.
Ruud Helderman

@Ruud ya - terima kasih - perbaiki sekarang.
Digital Trauma

3

Python 3.4, 92 85 79 85 byte

Menyimpan 7 byte berkat Mego
Menyimpan 6 byte lainnya berkat mbomb007
kembali 6 byte itu karena Python 3.x

Ini adalah pukulan pertama saya di kode golf, jadi tidak ada yang terjadi!

lambda n,d:[i for i in range(n+1)if len([j for j in list(str(i))if j==str(d)])%2is 0]

1
Ada beberapa ruang yang dapat Anda hapus dalam hal ini. Juga, jika Anda membuatnya lambda tanpa nama, itu akan jauh lebih pendek.
Mego

Anda dapat menggunakan `d`sebagai ganti str(d), dan jika Anda menganggap n adalah bilangan bulat (<2 ** 32), Anda dapat menggunakan `i`sebagai gantinya str(i).
mbomb007

Apakah backticks singkatan untuk str ()?
Nakaan

1
Backticks adalah singkatan untuk __repr__di python 2, mereka dihapus di python 3. Anda mungkin harus mengubah header Anda untuk mencerminkan pembatasan itu.
FryAmTheEggman

Ya, saya baru saja menemukan itu sambil menggali dan melemparkan test case ke penerjemah. Muka sedih.
Nakaan


2

Brachylog , 32 byte

:1reIlL,"":Ic:.xl-L=%2=0,Iw,@Sw\

Mengharapkan N sebagai input dan digit sebagai output, mis brachylog_main(12,1).

Penjelasan

:1reI                            § I is a number between 1 and Input
     lL,                         § L is the length of I
        "":Ic                    § Convert I to a string
             :.x                 § Remove all occurences of Output in that string
                l-L=%2=0,        § Check that the length of that new string - L mod 2 is 0
                         Iw,@Sw  § Write I, then write a space
                               \ § Backtrack (i.e. try a new value of I)

2

Mathematica, 54 byte

Position[Count[#2]/@IntegerDigits/@Range@#,x_/;2∣x]&

2

Perl, 28 29 31 byte

Termasuk +2 untuk -an

Jalankan dengan digit spesifikasi dan hitung pada garis berurutan pada STDIN:

echo -e "0\n111" | perl -anE'map s/@F/$&/g%2||say,1..<>'

2

Oracle SQL 11.2, 111 82 byte

SELECT LEVEL FROM DUAL WHERE MOD(REGEXP_COUNT(LEVEL,:d),2)=0 CONNECT BY LEVEL<=:n;

2

Kotlin, 136 byte

fun main(a:Array<String>)=print({n:String,d:String->IntRange(1,n.toInt()).filter{"$it".count{"$it"==d}%2==0}.joinToString()}(a[0],a[1]))

Program yang berfungsi penuh, mengambil argumen sebagai: nd

Cobalah online!


2

Java 8, 84 byte

Ini adalah ungkapan lambda untuk BiConsumer< Integer, Integer>:

(d,n)->for(int x=0;x++<n;)if((""+x).split(""+d,-1).length%2>0)System.out.println(x);

Penjelasan:

untuk setiap angka antara 1 dan n, konversi angka menjadi string dan pisahkan dengan menggunakan d sebagai pembatas. Jika itu dibagi menjadi beberapa bagian ganjil, lalu cetak nomor diikuti oleh baris baru.


2

Retina, 72 71 55

\d+$
$*
\B
¶$`
1+
$.0
G`(.),((?>.*?\1){2})*(?!.*\1)
.,
<empty>

Terima kasih banyak untuk Martin, yang secara tidak sengaja mengingatkan saya pada kelompok pencocokan atom!

Cobalah online!

Penjelasan:

\d+$
$*

Ganti nomor, tetapi bukan digit, dengan padanan unary.

\B
¶$`

\Bcocok dengan setiap posisi (lebar nol) yang bukan batas kata. Perhatikan bahwa ini tidak akan cocok dengan yang berikut ini: awal string, akhir string, atau posisi apa pun di sekitar karakter koma. Masing-masing dari non-batas ini kemudian diganti dengan baris baru dan kemudian string yang muncul sebelum pertandingan ( $`). Ini memberikan daftar seperti:

d,1
d,11
d,111

Di mana dada angka desimal tunggal.

1+
$.0

Ini mengubah semua daftar 1s menjadi representasi desimal panjangnya. Ini dengan mudah tidak akan mempengaruhi 1yang bisa sebelum koma, karena itu panjangnya selalu 1juga.

G`(.),((?>.*?\1){2})*(?!.*\1)

Di sini, itu G nyalakan mode grep, yang berarti bahwa garis yang cocok dengan regex disimpan, dan garis lainnya dibuang. Regex ini rumit, tetapi pada dasarnya cocok dengan grup 2 digit terdepan (disimpan dalam grup capture 1, jadi kita bisa merujuknya dengan \1).

Kuncinya di sini, adalah bahwa jika gagal ketika menggunakan kecocokan non-serakah hingga dua penampilan awal dari digit, maka kemudian akan kembali dan coba lagi, dengan .pencocokan atas digit. Ini akan membuat angka seperti 111 cocok ketika digit kami adalah 1. Oleh karena itu, kami menggunakan ?>untuk membuat atom pertandingan, pada dasarnya mencegah regex dari mundur ke sebelum cocok dengan nilai ini. Pencocokan atom bekerja seperti pencocokan possesif seperti dalam rasa tertentu. Karena *meta-karakter diikuti oleh karakter ?yang .akan cocok hingga itu mampu mencocokkan apa yang kami simpan di cocok dengan karakter tambahan, digit kami , yang akan menciptakan kecocokan yang tidak valid.\1 . Kemudian setelah kita melakukan ini dua kali, "memori" ekspresi reguler dihancurkan, mencegah perilaku yang biasanya terjadi, di mana ia kembali dan memiliki.\1

Kemudian, kami memeriksa bahwa dari posisi akhir, setelah mencocokkan kelompok berulang dari dua digit input, bahwa kami tidak dapat mencocokkan digit input lainnya.

.,
<empty>

Di sini kita hanya menghapus digit dan koma dari masing-masing string, jadi kita hanya mendapatkan jawaban yang bagus.


Silakan tambahkan penjelasan.
mbomb007

@ mbomb007 Oke, tambah :)
FryAmTheEggman

Pencocokan atom adalah sesuatu yang belum saya mengerti.
mbomb007

@ mbomb007 Saya telah mencoba untuk menjelaskan apa yang sedang terjadi, beri tahu saya jika ada sesuatu yang tidak jelas.
FryAmTheEggman

1

Python 2, 57 54 byte

lambda d,n:[i for i in range(1,n+1)if`i`.count(d)%2<1]

Pemakaian

>>> (lambda d,n:[i for i in range(1,n+1)if`i`.count(d)%2<1])('1', 12)
[2, 3, 4, 5, 6, 7, 8, 9, 11]

1

Julia, 44 byte

f(n,d)=filter(i->sum(d.==digits(i))%2<1,1:n)

Ini adalah fungsi yang menerima dua bilangan bulat dan mengembalikan array.

Kami mulai dengan set bilangan bulat dari 1 hingga ninklusif. Untuk setiap bilangan bulat i, kami menentukan digit desimal mana yang sama dengand , yang menghasilkan array Boolean. Kitasum ini untuk mendapatkan jumlah kemunculan dsebagai digit i, dan filterrentang asli berdasarkan paritas jumlah.

Coba di sini


1

Serius, 17 byte

╩╜R;`$╛@c2@%Y`M@░

Mengambil input sebagai n\n'd' (integer, baris baru, string).

Cobalah online!

Penjelasan:

╩╜R;`$╛@c2@%Y`M@░
╩                  push all inputs to registers
 ╜R;               push two copies of range(1, n+1)
    `        `M    map:
     $╛@c            count the number of d's
         2@%Y        modulo 2, logical not (1 if even, 0 if odd)
               @░  filter: take only the values of range(1, n+1) where the count is even

1

Mathematica, 45 byte

Select[a=#2;Range@#,2∣DigitCount[#,10,a]&]&

Menggunakan built-in DigitCount.


1

Japt, 13 12 byte

Uò1 f_s èV v

Input n , lalu d dibungkus dengan tanda kutip.Uji secara online!

Bagaimana itu bekerja

       // Implicit: U = input integer, V = input string
Uò1    // Create the inclusive range [1..U].
f_     // Filter to only the items Z that return truthily to this function:
s èV   //  Take Z.toString(), then count the number of matches of V.
v      //  Return 1 (truthy) if even, 0 (falsy) otherwise.
       // Implicit output, array separated by commas

1

CJam, 38 byte

r:P;r~1+,0-_{s{s}%Pe=2%!}%]z{~{}{;}?}%

Penjelasan

r:P;                                    e# set input d to variable P
    r~1+,0-                             e# create a range(1, n+1)
           _{s{s}%Pe=2%!}%              e# determine which numbers are needed
                          ]z{~{}{;}?}%  e# remove extra numbers

1

Scala, 66 byte

(d:Int,n:Int)=>(1 to n).map(""+).filter(_.count((""+d)(0)==)%2==0)

1

R, 145 byte (Saya yakin ada cara untuk mempersingkat ini lebih lanjut) :)

g<-sapply(sprintf("%s",seq(1:111)),function(z){if(sapply(regmatches(z,gregexpr("0",z)),length)%%2==0){z}else{NULL}})
names(g[!sapply(g,is.null)])
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.