Tutti i caratteri ASCII con un determinato numero di bit


30

(Titolo con grazie a @ChasBrown)

sandbox

Lo sfondo

Questa sfida è ispirata a una domanda che ho pubblicato di recente su Puzzling Stack Exchange . Non esitate a seguire il link se siete interessati alla domanda originale. In caso contrario, non ti annoierò con i dettagli qui.

I fatti

Ogni carattere ASCII standard stampabile ha un valore decimale compreso tra 32 e 126 inclusi. Questi possono essere convertiti nei corrispondenti numeri binari nell'intervallo compreso tra 100000 e 1111110 inclusi. Quando sommi i bit di questi numeri binari, finirai sempre con un numero intero compreso tra 1 e 6 inclusi.

La sfida

Dato un numero intero compreso tra 1 e 6 compreso come input, scrivere un programma o una funzione che genererà in qualsiasi formato accettabile tutti i caratteri ASCII standard stampabili in cui la somma dei bit del loro valore binario è uguale al numero intero di input.

Gli esempi / casi di test

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

Un'implementazione di riferimento Python non golfata è disponibile qui (TIO) .

Le regole

  1. Supponiamo che l'input sia sempre un numero intero (o rappresentazione in stringa di un numero intero) compreso tra 1 e 6 inclusi.
  2. È possibile scrivere un programma per visualizzare i risultati o una funzione per restituirli.
  3. L'output può essere in qualsiasi formato ragionevole ma deve essere coerente per tutti gli input . Se si sceglie di generare una stringa tra virgolette, è necessario utilizzare lo stesso tipo di virgolette per tutti gli input.
  4. Scappatoie standard vietate come al solito.
  5. Questo è il codice golf, quindi vince il codice più breve in ogni lingua.

È consentito restituire / stampare un elenco dei valori ASCII decimali o è necessario averli sotto forma di caratteri (ad es. 63Vs ?)?
Benjamin Urquhart,

1
Devono essere i personaggi reali.
ElPedro,

7
"lo stesso tipo di virgolette deve essere utilizzato per tutti gli input" Python, ad esempio, utilizza virgolette singole ( ') per la rappresentazione di stringa di una stringa per impostazione predefinita, ma utilizza virgolette doppie ( ") se la stringa contiene una virgoletta singola e nessuna virgoletta doppia . Non che questo caso specifico sia molto importante, poiché probabilmente stai meglio restituendo la stringa effettiva invece della sua rappresentazione, e puoi comunque usare virgolette singole in tale stringa per l'input comunque, ma penso che valga la pena menzionare qui.
Erik the Outgolfer,

@EriktheOutgolfer Concordato. Questo è il motivo per cui ho pensato che potesse essere interessante solo aggiungerlo come regola aggiuntiva :-)
ElPedro

1
@ElPedro Non ero sicuro di cosa fare perché probabilmente è una buona idea avere delle virgolette, dato che c'è uno spazio nel primo esempio, ma le solite virgolette appaiono entrambe nell'output :) Modifica: forse usa i guillemets francesi ( « »)? : D
flawr

Risposte:


29

8088 assembly, IBM PC DOS, 35 30 29 byte

Codice macchina:

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

annuncio:

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

Programma eseguibile DOS per PC autonomo, immettere il numero dalla riga di comando. L'output viene visualizzato nella finestra della console.

inserisci qui la descrizione dell'immagine

Scarica e prova ABCT.COM (AsciiBitCounT).


8
Per un momento ho pensato che dicesse "Scarica e prova AT ABCT.COM", come se avessi registrato un dominio solo per questa risposta.
Sparr

14

Assemblaggio CP-1610 ( Intellivision ), 20 DECLE 1 = 25 byte

Prende N in R0 e un puntatore al buffer di output in R4 . Scrive tutti i caratteri corrispondenti nel buffer e segna la fine dei risultati con 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

Uscita per N = 2

NB: la parentesi di apertura assomiglia molto a una parentesi quadra di apertura nel carattere Intellivision. Entrambi i personaggi sono tuttavia distinti.

produzione

screenshot da jzIntv


1. Un codice operativo CP-1610 è codificato con un valore di 10 bit, noto come "DECLE". Questa routine è lunga 20 DECLE, a partire da $ 4819 e termina a $ 482C (incluso).


5
+1 solo per essere (a) una soluzione per Intellivision e (b) il primo codice Intellivision che abbia mai visto.
Guru a 8 bit

3
@ La codifica Eight-BitGuru su Intellivision è piuttosto divertente. E i giochi homebrew di oggi sono scritti nella ROM a 16 bit, che sblocca tutta la potenza (ahem ...) della CPU. :)
Arnauld

Impressionante! Non avevo idea che Intellivision avesse un frame buffer e un set di caratteri incorporato. Di sicuro molto più avanzato dell'Atari 2600. Molto ben fatto!
640 KB il

2
@gwaugh Il GROM (per ROM grafica) contiene tutti i caratteri ASCII stampabili e alcune forme grafiche comuni. Curiosità: contiene anche del codice eseguibile che non si adattava alla ROM principale.
Arnauld,

Decisamente più avanzato del 2600, ma se la memoria serve, Mattel non ha rivelato nessuna delle cose avanzate che si nascondono nella ROM, quindi gli sviluppatori di terze parti erano limitati al codice della macchina diretta o dovevano estrarre le cose fantasiose da sole . Potrebbe essere apocrifo.
brhfl,


9

05AB1E , 8 byte

žQʒÇbSOQ

Provalo online!

Spiegazione

ž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}

Provalo online!

Blocco di codice anonimo che accetta un numero e restituisce una stringa di caratteri validi.

Spiegazione:

{                                }  # 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

Possiamo usarlo per ottenere il digititsum del nostro numero binario analizzandolo come un numero decimale e modellandolo per 9, il che è valido perché l'intervallo di numeri che stiamo usando è garantito avere meno di 9 bit. Questo è aiutato dal casting automatico di Perl 6 della stringa binaria su un numero decimale quando usato in un contesto numerico.



7

JavaScript (Node.js) , 60 byte

Usando il trucco del modulo di Jo King

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

Provalo 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)

Provalo online!

Commentate

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 usando il trucco del modulo di Jo.
Shaggy

@Shaggy Oh. È bello.
Arnauld,

6

Brachylog , 7 byte

∈Ṭ&ạhḃ+

Provalo online!

Un predicato che funziona come un generatore , accetta l'input attraverso la sua variabile di output e produce ogni carattere attraverso la sua variabile di input. Perché 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

Provalo o prova tutti gli ingressi

;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 o successivo), 76 byte

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

Prende input da A1, output in qualunque cella metti questa formula. Questa è una formula di matrice, quindi è necessario premere Ctrl+ Shift+ Enterper inserirlo. "2016 o successivo" è perché ha bisogno della CONCATfunzione (il deprecato CONCATENATEnon prenderà un array come argomento).


Mi piace questo. Sono un ragazzo di Lotus Notes e 123 quindi questo funziona per me :-)
ElPedro il

5

C (libreria standard), 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;}

Utilizzando solo le funzioni di libreria standard. Grazie a @gastropner per il miglioramento da 74 a 67 byte.

Provalo online!



@gastropner è un miglioramento straordinario! Grazie!
Krista,

1
Penso che sia necessario iniziare dall'indice 31 per raccogliere spazio nel f(1)caso (perché lo ++isalta).
LambdaBeta,

@LambdaBeta Hai perfettamente ragione, grazie!
Krista,

5

R , 77 68 byte

Approccio usando per loop

-9 byte grazie a Giuseppe

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

Provalo online!

In precedenza:

R , 78 69 66 byte

-12 byte grazie a Giuseppe

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

Trasforma i numeri da 32 a 126 in una matrice di bit, quindi somma le righe per trovare la corrispondenza con il numero di input.

Provalo online!


1
Usa intToBits(x)>0piuttosto cheas.single
Giuseppe

Bene, ho provato ad |0avere un errore e ho solo pensato che gli operatori logici non avrebbero funzionato.
Aaron Hayman,

1
66 byte per l'approccio "precedente" utilizzando sapplyanzichématrix
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 grazie a NahuelFouilleul .

Provalo online.

Spiegazione:

Contiene un carattere non stampabile con valore 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
-24 byte usando Long.bitCount
Nahuel Fouilleul

@NahuelFouilleul Ah, mi dimentico sempre di quello integrato in Java! Molte grazie. E è possibile salvare altri 3 byte utilizzando n.bitCount. :)
Kevin Cruijssen,

Sì, Java batte JavaScript ancora una volta! Adoro le sfide con i personaggi: P
Olivier Grégoire,

4

Java 8, 131 71 byte

-60 byte grazie a tutti nei commenti

Restituisce un punto java.util.stream.IntStreamdi codice

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

Provalo online!

Utilizzando HashSet, 135 byte. Restituisce un 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(""));}}

Provalo online!



1
Accesso statico dal destinatario del contesto non statico. Grazie.
Benjamin Urquhart,

Long.toBinaryString(i)può essereLong.toString(i,2);
Kevin Cruijssen il

1
@KevinCruijssen è quello che fa il mio primo commento
Dati scaduti il

1
@KevinCruijssen Hai ragione. Ecco la versione fissa: (ancora) 71 byte . E sì, ho visto la tua versione che ho votato meno di 10 minuti fa;)
Olivier Grégoire


4

Dyalog APL esteso, 24 22 byte

ucs a⌿⍨⎕=+⌿2a32126

Provalo online!

-2 byte grazie a ngn

22 byte alternativi in ​​Dyalog APL normale di ngn:

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

Provalo online!


(expr )∘=-> ⎕=expr
ngn

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

3

Python 2 , 69 byte

lambda n:[chr(i)for i in range(32,127)if sum(map(int,bin(i)[2:]))==n]

Provalo online!


1
Questo è esattamente quello che ho ottenuto giocando a golf la mia implementazione di riferimento. +1
ElPedro

3

Gaia , 10 byte

₵R⟪¤cbΣ=⟫⁇

Provalo 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 grazie a Galeno

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

Provalo online!

Risposta originale

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

Provalo online!

  • 2#:@i.@^8:produce i numeri binari da 0 a 255 ( 2 ^ 8è 256)
  • 1#. somma ciascuno
  • ]= produce una maschera binaria che mostra dove la somma è uguale all'input originale
  • a.#~ mask usa quella maschera binaria per filtrare l'intero alfabeto ASCII di J. a.
  • &(95{.32}.]) ma prima di farlo prendi solo gli elementi 32 ... 126 sia dall'alfabeto che dalla maschera


Grazie Galeno. TIL che potresti farei.@95
Giona


3

K (ngn / k) , 20 byte

Soluzione:

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

Provalo online!

Spiegazione:

Valutato da destra a sinistra:

`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 assembly (NES), 22 byte

Codice macchina:

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

Montaggio:

    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

Programma completo . Testato con FCEUX 2.2.3, dovrebbe funzionare su qualsiasi emulatore NES standard.

Ispirato dalla risposta di Ryan Russell. Input fornito all'indirizzo della CPU $ 60. Emette nella memoria della Picture Processing Unit della console.


2
Ciao e benvenuto in PPCG. Esiste un modo per verificare la soluzione oltre alla creazione di una cartuccia, ad esempio un emulatore o una specifica (online)?
Jonathan Frech,

@JonathanFrech Ho aggiunto un programma completo che può essere assemblato ed eseguito localmente. A quanto ho capito, l'ambiente NES non è realmente standardizzato per codegolf.
negativo sette


2

PowerShell , 83 byte

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

Provalo online!

Prende input $n, costruisce un intervallo da 32a 126ed estrae quei numeri dove |?{}: il numero, converted ToStringin base 2; convertito toCharArra y; groupEd in 0s e 1s; prendendo l' [1]indice di quel raggruppamento; prendendone la .countcausa e verificando che sia -eqnormale per il nostro input $number. Quei numeri vengono quindi lanciati come un chararray e lasciati sulla pipeline. L'output è implicito, con nuove righe tra gli elementi.



2

Carbone , 10 byte

Φγ⁼Σ↨℅ι²Iθ

Provalo online! Il collegamento è alla versione dettagliata del codice. Spiegazione:

 γ          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




Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.