Semua karakter ASCII dengan jumlah bit tertentu


30

(Judul dengan terima kasih kepada @ChasBrown)

Bak pasir

Latar belakang

Tantangan ini terinspirasi oleh pertanyaan yang baru-baru ini saya posting di Puzzling Stack Exchange . Silakan ikuti tautannya jika Anda tertarik dengan pertanyaan awal. Jika tidak maka saya tidak akan membuat Anda bosan dengan detailnya di sini.

Fakta

Setiap karakter ASCII standar yang dapat dicetak memiliki nilai desimal antara 32 dan 126 inklusif. Ini dapat dikonversi ke angka biner yang sesuai dalam kisaran 100000 hingga 1111110 inklusif. Saat Anda menjumlahkan bit angka biner ini, Anda akan selalu berakhir dengan integer antara 1 dan 6 inklusif.

Tantangan

Diberikan bilangan bulat antara 1 dan 6 inklusif sebagai input, tulis sebuah program atau fungsi yang akan menampilkan semua format ASCII yang dapat dicetak, semua karakter ASCII yang dapat dicetak dengan jumlah bit nilai binernya sama dengan integer input.

Contoh / Kasus Uji

1 -> ' @'
2 -> '!"$(0ABDHP`'
3 -> '#%&)*,1248CEFIJLQRTXabdhp'
4 -> ''+-.3569:<GKMNSUVYZ\cefijlqrtx'
5 -> '/7;=>OW[]^gkmnsuvyz|'
6 -> '?_ow{}~'

Implementasi referensi Python ungolfed tersedia di sini (TIO) .

Aturan

  1. Asumsikan input akan selalu berupa integer (atau representasi string integer) antara 1 dan 6 inklusif.
  2. Anda dapat menulis program untuk menampilkan hasil atau fungsi untuk mengembalikannya.
  3. Output mungkin dalam format yang masuk akal tetapi harus konsisten untuk semua input . Jika Anda memilih untuk mengeluarkan string yang dikutip maka jenis kutipan yang sama harus digunakan untuk semua input.
  4. Celah standar dilarang seperti biasa.
  5. Ini adalah kode golf sehingga kode terpendek di setiap bahasa menang.

Apakah kita boleh mengembalikan / mencetak daftar nilai ascii desimal atau kita perlu memilikinya dalam bentuk karakter (mis. 63Vs ?)?
Benjamin Urquhart

1
Harus karakter yang sebenarnya.
ElPedro

7
"jenis kutipan yang sama harus digunakan untuk semua input" Python, misalnya, menggunakan tanda kutip tunggal ( ') untuk representasi string dari suatu string secara default, tetapi menggunakan tanda kutip ganda ( ") jika string berisi tanda kutip tunggal dan tidak ada tanda kutip ganda . Bukan berarti kasus spesifik ini akan sangat berarti, karena Anda mungkin lebih baik mengembalikan string yang sebenarnya daripada perwakilannya, dan Anda masih dapat menggunakan tanda kutip tunggal dalam string tersebut untuk input, tapi saya merasa layak untuk disebutkan di sini.
Erik the Outgolfer

@EriktheOutgolfer Setuju. Itu sebabnya saya pikir mungkin menarik untuk memasukkannya sebagai aturan tambahan :-)
ElPedro

1
@ ElPedro Saya tidak yakin apa yang harus dilakukan karena mungkin ide yang baik untuk memiliki beberapa tanda kutip, karena ada spasi pada contoh pertama, tetapi tanda kutip biasa keduanya muncul di output :) Edit: mungkin menggunakan guillemets Perancis ( « »)? : D
flawr

Jawaban:


29

Perakitan 8088, IBM PC DOS, 35 30 29 byte

Kode mesin:

be81 00ad 8afc b330 b108 d0c8 12dd e2fa 3afb 7504 b40e cd10 fec0 79ea c3

Daftar:

BE 0081     MOV  SI, 081H   ; SI = memory address of command line string
AD          LODSW           ; AL = start ASCII value (init to 20H from space on cmd line)
8A FC       MOV  BH, AH     ; BH = target number of bits (in ASCII)
        CHR_LOOP:
B3 30       MOV  BL, '0'    ; BL = counter of bits, reset to ASCII zero
B1 08       MOV  CL, 8      ; loop through 8 bits of AL
        BIT_LOOP:
D0 C8       ROL  AL, 1      ; rotate LSB of AL into CF
12 DD       ADC  BL, CH     ; add CF to BL (CH is always 0) 
E2 FA       LOOP BIT_LOOP   ; loop to next bit
3A FB       CMP  BH, BL     ; is current char the target number of bits?
75 04       JNE  NO_DISP    ; if not, do not display
B4 0E       MOV  AH, 0EH    ; BIOS write char to screen function
CD 10       INT  10H        ; display ASCII char in AL (current char in loop)
        NO_DISP: 
FE C0       INC  AL         ; increment char to next ASCII value
79 EA       JNS  CHR_LOOP   ; if char <= 127, keep looping
C3          RET             ; return to DOS

Standableone PC DOS program yang dapat dieksekusi, memasukkan angka dari baris perintah. Output ditampilkan ke jendela konsol.

masukkan deskripsi gambar di sini

Unduh dan uji ABCT.COM (AsciiBitCounT).


8
Sejenak saya pikir katanya "Unduh dan uji AT ABCT.COM", seolah-olah Anda telah mendaftarkan domain hanya untuk jawaban ini.
Sparr

14

Perakitan CP-1610 ( Intellivision ), 20 DECLEs 1 = 25 byte

Membawa N di R0 dan pointer ke buffer output di R4 . Menulis semua karakter yang cocok di buffer dan menandai hasil akhir dengan NUL .

                ROMW    10              ; use 10-bit ROM width
                ORG     $4800           ; map this program at $4800

                ;; ------------------------------------------------------------- ;;
                ;;  test code                                                    ;;
                ;; ------------------------------------------------------------- ;;
4800            EIS                     ; enable interrupts

4801            MVII    #$103,    R4    ; set the output buffer at $103 (8-bit RAM)
4803            MVII    #2,       R0    ; test with N = 2
4805            CALL    getChars        ; invoke our routine

4808            MVII    #$103,    R4    ; R4 = pointer into the output buffer
480A            MVII    #$215,    R5    ; R5 = backtab pointer

480C  draw      MVI@    R4,       R0    ; read R0 from the buffer
480D            SLL     R0,       2     ; R0 *= 8
480E            SLL     R0
480F            BEQ     done            ; stop if it's zero

4811            ADDI    #7-256,   R0    ; draw it in white
4815            MVO@    R0,       R5

4816            B       draw            ; go on with the next entry

4818  done      DECR    R7              ; loop forever

                ;; ------------------------------------------------------------- ;;
                ;;  routine                                                      ;;
                ;; ------------------------------------------------------------- ;;
      getChars  PROC

4819            MVII    #32,      R1    ; start with R1 = 32

481B  @loop     MOVR    R1,       R3    ; copy R1 to R3
481C            CLRR    R2              ; clear R2
481D            SETC                    ; start with the carry set

481E  @count    ADCR    R2              ; add the carry to R2
481F            SARC    R3              ; shift R3 to the right (the least
                                        ; significant bit is put in the carry)
4820            BNEQ    @count          ; loop if R3 is not zero

4822            CMPR    R2,       R0    ; if R2 is equal to R0 ...
4823            BNEQ    @next

4825            MVO@    R1,       R4    ; ... write R1 to the output buffer

4826  @next     INCR    R1              ; advance to the next character
4827            CMPI    #127,     R1    ; and loop until 127 is reached
4829            BLT     @loop

482B            MVO@    R3,       R4    ; write NUL to mark the end of the output

482C            JR      R5              ; return

                ENDP

Output untuk N = 2

NB: Tanda kurung pembuka sangat mirip dengan tanda kurung siku pada font Intellivision. Namun kedua karakter itu berbeda.

keluaran

tangkapan layar dari jzIntv


1. Sebuah opcode CP-1610 dikodekan dengan nilai 10-bit, yang dikenal sebagai 'DECLE'. Rutin ini sepanjang 20 DECLEs, mulai dari $ 4819 dan berakhir pada $ 482C (termasuk).


5
+1 hanya karena (a) solusi untuk Intellivision, dan (b) kode Intellivision pertama yang pernah saya lihat.
Eight-Bit Guru

3
@ Delapan-BitGuru Pengodean di Intellivision cukup menyenangkan. Dan game rumahan hari ini ditulis dalam ROM 16-bit, yang membuka kekuatan penuh (ahem ...) dari CPU. :)
Arnauld

Impresif! Tidak tahu Intellivision memiliki penyangga bingkai dan set karakter bawaan. Jauh lebih maju daripada Atari 2600. Dilakukan dengan sangat baik!
640KB

2
@ gwaugh GROM (untuk Graphics ROM) berisi semua karakter ASCII yang dapat dicetak dan beberapa bentuk grafis umum. Fakta menyenangkan: itu juga berisi beberapa kode yang dapat dieksekusi yang tidak sesuai dengan ROM utama.
Arnauld

Jelas lebih maju daripada 2600, tetapi jika ingatanku, Mattel tidak mengungkapkan hal-hal canggih yang bersembunyi di ROM, sehingga pengembang pihak ketiga terbatas pada kode mesin langsung atau harus mengeluarkan barang-barang mewah sendiri. . Mungkin apokrif.
brhfl


9

05AB1E , 8 byte

žQʒÇbSOQ

Cobalah online!

Penjelasan

žQ        # push the printable ascii characters
  ʒ       # filter, keep elements whose
   Ç      # character code
    b     # converted to binary
     SO   # has a digit sum
       Q  # equal to the input

8

Perl 6 , 41 34 byte

{chrs grep *.base(2)%9==$_,^95+32}

Cobalah online!

Blok kode anonim yang mengambil nomor dan mengembalikan serangkaian karakter yang valid.

Penjelasan:

{                                }  # Anonymous code block taking a number
      grep                ,^95+32   # Filter from the range 32 to 126
           *.base(2)                # Where the binary of the digit
                    %9                # When parsed as a decimal modulo 9
                      ==$_            # Is equal to the input
 chrs                               # And convert the list of numbers to a string

nbndigitsum(n)(modb-1)b(modb-1)=1

Kita dapat menggunakan ini untuk mendapatkan digit angka biner kita dengan menguraikannya sebagai angka desimal dan moduloing dengan angka 9, yang valid karena rentang angka yang kita gunakan dijamin memiliki kurang dari 9 bit. Ini dibantu oleh casting otomatis Perl 6 dari string biner ke angka desimal ketika digunakan dalam konteks numerik.


7

Jelly , 8 byte

ØṖOB§=ʋƇ

Cobalah online!

ØṖ       printable ascii character list
  OB     to binary
    §    popcount
     =   equal to input?
      ʋƇ filter (implicitly output)

7

JavaScript (Node.js) , 60 byte

Menggunakan trik modulo Jo King

n=>(g=x=>x>>7?'':Buffer(x.toString(2)%9-n?0:[x])+g(x+1))(32)

Cobalah online!


JavaScript (Node.js) ,  70  69 byte

n=>(g=x=>x>>7?'':Buffer((h=x=>x&&x%2+h(x>>1))(x)-n?0:[x])+g(x+1))(32)

Cobalah online!

Berkomentar

n => (              // n = input
  g = x =>          // g = recursive function, taking a byte x
    x >> 7 ?        //   if x = 128:
      ''            //     stop recursion and return an empty string
    :               //   else:
      Buffer(       //     create a Buffer:
        (h = x =>   //       h = recursive function taking a byte x
          x &&      //         stop if x = 0
          x % 2 +   //         otherwise, add the least significant bit
          h(x >> 1) //         and do a recursive call with floor(x / 2)
        )(x)        //       initial call to h
        - n ?       //       if the result is not equal to n:
          0         //         create an empty Buffer (coerced to an empty string)
        :           //       else:
          [x]       //         create a Buffer consisting of the character x
      ) +           //     end of Buffer()
      g(x + 1)      //     append the result of a recursive call to g with x + 1
)(32)               // initial call to g with x = 32

60 byte menggunakan trik modulo Jo.
Shaggy

@ Shaggy Oh. Itu bagus.
Arnauld

6

Brachylog , 7 byte

∈Ṭ&ạhḃ+

Cobalah online!

Predikat yang berfungsi sebagai generator , mengambil input melalui variabel outputnya, dan menghasilkan setiap karakter melalui variabel inputnya. Karena Brachylog.

           The input variable (which is an element of the output)
∈          is an element of
 Ṭ         the string containing every printable ASCII character
  &        and the input
   ạh      converted to a codepoint
     ḃ     converted to a list of binary digits
      +    sums to
           the output variable (which is the input).

5

Japt , 9 byte

;EƶXc¤è1

Cobalah atau uji semua input

;EƶXc¤è1     :Implicit input of integer U
;E            :Printable ASCII
  Æ           :Filter each X
   ¶          :Test U for equality with
    Xc        :  Character code of X
      ¤       :  To binary string
       è1     :  Count the 1s

5

Excel (2016 atau lebih baru), 76 byte

=CONCAT(IF(LEN(SUBSTITUTE(DEC2BIN(ROW(32:126)),0,))=A1,CHAR(ROW(32:126)),""))

Mengambil input dari A1, menghasilkan dalam sel apa pun yang Anda masukkan rumus ini. Ini adalah rumus array, jadi Anda perlu menekan Ctrl+ Shift+ Enteruntuk memasukkannya. "2016 atau yang lebih baru" adalah karena membutuhkan CONCATfungsi (yang usang CONCATENATEtidak akan menggunakan array sebagai argumen).


Saya suka ini. Saya seorang Lotus Notes dan 123 orang jadi ini bekerja untuk saya :-)
ElPedro

5

C (perpustakaan standar), 74 67 byte

i;j;k;f(n){for(i=31;i<126;k||puts(&i))for(k=n,j=++i;j;j/=2)k-=j&1;}

Hanya menggunakan fungsi perpustakaan standar. Terima kasih kepada @gastropner untuk peningkatan dari 74 hingga 67 byte.

Cobalah online!



@gastropner, ini peningkatan luar biasa! Terima kasih!
Krista

1
Saya pikir Anda harus mulai pada indeks 31 untuk mengambil ruang dalam f(1)kasing (karena ++idilewati).
LambdaBeta

@LambdaBeta Anda benar sekali, terima kasih!
Krista

5

R , 77 68 byte

Pendekatan menggunakan for loop

-9 byte terima kasih kepada Giuseppe

n=scan();for(i in 32:126)if(sum(intToBits(i)>0)==n)cat(intToUtf8(i))

Cobalah online!

Sebelumnya:

R , 78 69 66 byte

-12 byte terima kasih kepada Giuseppe

a=32:126;cat(intToUtf8(a[colSums(sapply(a,intToBits)>0)==scan()]))

Mengubah angka 32 hingga 126 menjadi matriks bit kemudian menjumlahkan seluruh baris untuk menemukan yang cocok dengan nomor input.

Cobalah online!


1
Gunakan intToBits(x)>0daripadaas.single
Giuseppe

Bagus, saya mencoba |0dan mendapatkan kesalahan dan hanya menganggap operator logika tidak akan berfungsi.
Aaron Hayman

1
66 byte untuk pendekatan "sebelumnya" menggunakan sapplyalih - alihmatrix
Giuseppe

4

Java 10, 98 97 94 70 67 byte

n->{for(var c='';c-->31;)if(n.bitCount(c)==n)System.out.print(c);}

-24 byte terima kasih kepada NahuelFouilleul .

Cobalah online.

Penjelasan:

Berisi karakter yang tidak patut dicetak dengan nilai unicode 127.

n->{                         // Method with Integer parameter and no return-type
  for(var c='';c-->31;)     //  Loop character `c` in the range ['~', ' '] / (127,31):
    if(n.bitCount(c)         //   If the amount of 1-bits in the two's complement binary
                             //   representation of the current characters
                    ==n)     //   equals the input:
      System.out.print(c);}  //    Print the current character

1
-24bytes menggunakan Long.bitCount
Nahuel Fouilleul

@NahuelFouilleul Ah, saya selalu lupa tentang builtin itu di Jawa! Terima kasih banyak. Dan 3 byte lagi dapat disimpan dengan menggunakan n.bitCount. :)
Kevin Cruijssen

Ya, Java mengalahkan JavaScript sekali lagi! Saya suka tantangan karakter itu: P
Olivier Grégoire

4

Java 8, 131 71 byte

-60 byte terima kasih kepada semua orang di komentar.

Mengembalikan a java.util.stream.IntStreamdari codepoint

n->java.util.stream.IntStream.range(32,127).filter(i->n.bitCount(i)==n)

Cobalah online!

Menggunakan HashSet, 135 byte. Menghasilkan Set<Object>:

n->new java.util.HashSet(){{for(int i=31;i++<126;add(Long.toBinaryString(i).chars().map(c->c-48).sum()==n?(char)i+"":""),remove(""));}}

Cobalah online!



1
Akses statis dari penerima konteks non-statis. Terima kasih.
Benjamin Urquhart

Long.toBinaryString(i)bisaLong.toString(i,2);
Kevin Cruijssen

1
@KevinCruijssen itulah komentar pertama saya
Data Kadaluarsa

1
@KevinCruijssen Anda benar. Ini versi yang sudah diperbaiki: (masih) 71 byte . Dan ya, saya melihat versi Anda yang saya undur kurang dari 10 menit yang lalu;)
Olivier Grégoire

4

C # (Visual C # Interactive Compiler) , 86 byte

n=>Enumerable.Range(32,95).Where(x=>"0123456".Sum(g=>x>>g-48&1)==n).Select(x=>(char)x)

Terima kasih kepada @ExpiredData yang telah memberikan saya ide untuk digunakan Sum()! Ketika saya kembali ke PC saya, saya akan mengganti string"0123456" dengan unsintables, menghemat tiga byte.

Cobalah online!



@ExpiredData Terima kasih atas idenya untuk digunakan Sum()!
Perwujudan Ketidaktahuan

4

APL Dyalog Extended, 24 22 byte

ucs a⌿⍨⎕=+⌿2a32126

Cobalah online!

-2 byte terima kasih kepada ngn

Alternatif 22 byte dalam Dyalog APL reguler oleh ngn:

ucs 32+⍸⎕=32↓+/↑,⍳72

Cobalah online!


(expr )∘=-> ⎕=expr
ngn

tanpa diperpanjang: ⎕ucs 32+⍸⎕=32↓+/↑,⍳7⍴2(⎕io ← 0)
ngn


3

Gaia , 10 byte

₵R⟪¤cbΣ=⟫⁇

Cobalah online!

		| implicit input, n
₵R		| push printable ascii
  ⟪	⟫⁇	| filter the list where:
   ¤cbΣ		| the sum of the code point in binary
       =	| is equal to n

3

J , 31 27 byte

-4 byte terima kasih kepada Galen

[:u:32+[:I.]=1#.32#:@+i.@95

Cobalah online!

Jawaban Asli

a.#~&(95{.32}.])]=1#.2#:@i.@^8:

Cobalah online!

  • 2#:@i.@^8:menghasilkan angka biner 0 hingga 255 ( 2 ^ 8256)
  • 1#. jumlah masing-masing
  • ]= menghasilkan topeng biner yang menunjukkan di mana jumlah sama dengan input asli
  • a.#~ mask menggunakan topeng biner itu untuk memfilter alfabet ascii penuh J a.
  • &(95{.32}.]) tetapi sebelum melakukannya, ambil hanya elemen 32 ... 126 dari alfabet dan topeng


Terima kasih Galen. Anda bisa melakukannyai.@95
Jonah


3

K (ngn / k) , 20 byte

Larutan:

`c$32+&(+/2\32+!95)=

Cobalah online!

Penjelasan:

Dievaluasi dari kanan ke kiri:

`c$32+&(+/2\32+!95)= / the solution
                   = / equals?
       (          )  / do this together
               !95   / range 0..94
            32+      / add 32, so range 32..126
          2\         / break into base-2
        +/           / sum up
      &              / indices where true
   32+               / add 32
`c$                  / cast to character

3

6502 rakitan (NES), 22 byte

Kode mesin:

a0 1f a6 60 c8 98 30 fb ca 0a b0 fc d0 fb e8 d0 f1 8c 07 20 f0 ec

Majelis:

    ldy #$1f ; Y holds the current character code
NextCharacter:
    ldx $60 ; load parameter into X
    iny
    tya
    bmi (NextCharacter + 1) ; exit at char 128, #$60 is the return opcode

CountBits:
    dex
Continue:
    asl
    bcs CountBits
    bne Continue

CompareBitCount:
    inx ; fixes off-by-one error and sets Z flag if bit count matches
    bne NextCharacter
    sty $2007
    beq NextCharacter ; always branches

Program lengkap . Diuji dengan FCEUX 2.2.3, harus bekerja pada emulator NES standar apa pun.

Terinspirasi oleh jawaban Ryan Russell. Input diberikan pada alamat CPU $ 60. Output ke memori Picture Processing Unit konsol.


2
Halo dan selamat datang di PPCG. Apakah ada cara untuk memverifikasi solusi Anda selain dari membangun cartridge, yaitu emulator atau spesifikasi (online)?
Jonathan Frech

@ JonathanFrech Saya telah menambahkan program lengkap yang dapat dirakit dan dijalankan secara lokal. Seperti yang saya mengerti, lingkungan NES tidak benar-benar standar untuk codegolf.
Negatif tujuh


2

PowerShell , 83 byte

param($n)[char[]](32..126|?{([convert]::ToString($_,2)|% t*y|group)[1].count-eq$n})

Cobalah online!

Mengambil input $n, menyusun rentang dari 32ke 126dan mengeluarkan angka-angka itu di mana |?{}: angka, converted ToStringdi pangkalan 2; toCharArra yang dikonversi y; grouped menjadi 0s dan 1s; mengambil [1]indeks pengelompokan itu; mengambilnya .count, dan memeriksa apakah sudah masuk -eqke $njumlah input kami . Angka-angka itu kemudian dilemparkan sebagai char-array dan dibiarkan di atas pipa. Output tersirat, dengan baris baru antar elemen.



2

Arang , 10 byte

Φγ⁼Σ↨℅ι²Iθ

Cobalah online! Tautan adalah untuk mengucapkan versi kode. Penjelasan:

 γ          Predefined ASCII characters
Φ           Filtered by
      ι     Current character's
     ℅      ASCII code
    ↨       Converted to base
       ²    Literal 2
   Σ        Summed
  ⁼         Equals
         θ  First input
        I   Cast to integer
            Implicitly printed




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.