Wszystkie znaki ASCII o podanej liczbie bitów


30

(Tytuł dzięki dzięki @ChasBrown)

Piaskownica

Tło

To wyzwanie jest inspirowane pytaniem, które niedawno zamieściłem na Puzzling Stack Exchange . Jeśli jesteś zainteresowany pierwotnym pytaniem, skorzystaj z linku. Jeśli nie, to nie zanudzę cię szczegółami tutaj.

Fakty

Każdy standardowy drukowany znak ASCII ma wartość dziesiętną od 32 do 126 włącznie. Można je przekonwertować na odpowiadające im liczby binarne z zakresu od 100000 do 1111110 włącznie. Gdy zsumujesz bity tych liczb binarnych, zawsze uzyskasz liczbę całkowitą od 1 do 6 włącznie.

Wyzwanie

Biorąc pod uwagę liczbę całkowitą od 1 do 6 włącznie jako dane wejściowe, napisz program lub funkcję, która wyświetli w dowolnym akceptowalnym formacie wszystkie standardowe znaki ASCII do wydruku, w których suma bitów ich wartości binarnej jest równa całkowitej liczbie wejściowej.

Przykłady / przypadki testowe

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

Implementacja referencji bez golfisty w Pythonie jest dostępna tutaj (TIO) .

Zasady

  1. Załóżmy, że wejście zawsze będzie liczbą całkowitą (lub ciągiem reprezentującym liczbę całkowitą) od 1 do 6 włącznie.
  2. Możesz napisać program do wyświetlania wyników lub funkcję do ich zwrócenia.
  3. Dane wyjściowe mogą być w dowolnym rozsądnym formacie, ale muszą być spójne dla wszystkich danych wejściowych . Jeśli zdecydujesz się wyprowadzać cytowany ciąg, wówczas dla wszystkich danych wejściowych należy zastosować ten sam typ cudzysłowów.
  4. Standardowe luki zabronione jak zwykle.
  5. To jest kod golfowy, więc wygrywa najkrótszy kod w każdym języku.

Czy wolno nam zwrócić / wydrukować listę dziesiętnych wartości ascii, czy też musimy mieć je w postaci znaków (np. 63Vs ?)?
Benjamin Urquhart

1
Muszą być rzeczywistymi postaciami.
ElPedro

7
„dla wszystkich danych wejściowych należy użyć tego samego rodzaju cudzysłowów” Python na przykład 'domyślnie używa pojedynczych cudzysłowów ( ) do reprezentacji ciągu znaków, ale używa podwójnych cudzysłowów ( "), jeśli ciąg zawiera pojedynczy cudzysłów i nie zawiera podwójnych cudzysłowów . Nie chodzi o to, że ten konkretny przypadek będzie miał duże znaczenie, ponieważ prawdopodobnie lepiej jest zwrócić rzeczywisty ciąg zamiast jego reprezentacji, a mimo to możesz używać pojedynczych cudzysłowów w takim ciągu do wprowadzania danych, ale myślę, że warto o tym wspomnieć.
Erik the Outgolfer

@EriktheOutgolfer Zgoda. Właśnie dlatego pomyślałem, że może być interesujące, aby rzucić to jako dodatkową zasadę :-)
ElPedro

1
@ElPedro Nie byłem pewien, co robić, ponieważ prawdopodobnie dobrym pomysłem jest umieszczenie kilku cytatów, ponieważ w pierwszym przykładzie jest spacja, ale zwykłe cytaty pojawiają się na wyjściu :) Edytuj: może użyj francuskich gilemetów ( « »)? : D
wada

Odpowiedzi:


29

Zestaw 8088, IBM PC DOS, 35 30 29 bajtów

Kod maszynowy:

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

Wymienianie kolejno:

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

Samodzielny program wykonywalny DOS na PC, numer wejściowy z wiersza poleceń. Dane wyjściowe są wyświetlane w oknie konsoli.

wprowadź opis zdjęcia tutaj

Pobierz i przetestuj ABCT.COM (AsciiBitCounT).


8
Przez chwilę myślałem, że jest napisane „Pobierz i przetestuj AT ABCT.COM”, jakbyś zarejestrował domenę tylko dla tej odpowiedzi.
Sparr

14

Zespół CP-1610 ( Intellivision ), 20 DECLE 1 = 25 bajtów

Pobiera N. w R0 i wskaźnik do bufora wyjściowego w R4 . Zapisuje wszystkie pasujące znaki w buforze i oznacza koniec wyników wartością 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

Wyjście dla N = 2

Uwaga: Nawias otwierający przypomina czcionkę otwierającą nawias kwadratowy w czcionce Intellivision. Obie postacie są jednak różne.

wydajność

zrzut ekranu z jzIntv


1. Kod operacyjny CP-1610 jest kodowany za pomocą 10-bitowej wartości, zwanej „DECLE”. Ta procedura ma długość 20 DECLE, zaczynając od 4819 USD, a kończąc na 482 USD (w zestawie).


5
+1 tylko za to, że jest (a) rozwiązaniem dla Intellivision i (b) pierwszym kodem Intellivision, jaki kiedykolwiek widziałem.
Ośmiobitowy Guru

3
@ Kodowanie Eight-BitGuru na Intellivision to niezła zabawa. A dzisiejsze gry homebrew są zapisane w 16-bitowej pamięci ROM, która odblokowuje pełną moc (ahem ...) procesora. :)
Arnauld

Imponujący! Nie miałem pojęcia, że ​​Intellivision ma bufor ramek i wbudowany zestaw znaków. Na pewno o wiele bardziej zaawansowany niż Atari 2600. Bardzo ładnie wykonane!
640 KB

2
@gwaugh GROM (dla Graphics ROM) zawiera wszystkie drukowalne znaki ASCII i kilka popularnych kształtów graficznych. Ciekawostka: zawiera także kod wykonywalny, który nie mieścił się w głównej pamięci ROM.
Arnauld

Zdecydowanie bardziej zaawansowany niż 2600, ale jeśli pamięć służy, Mattel nie ujawnił żadnych zaawansowanych rzeczy ukrytych w pamięci ROM, więc deweloperzy innych firm byli albo ograniczeni do prostego kodu maszynowego, albo musieli samodzielnie wymyślać wymyślne rzeczy . Może być apokryficzny.
brhfl


9

05AB1E , 8 bajtów

žQʒÇbSOQ

Wypróbuj online!

Wyjaśnienie

ž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 bajtów

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

Wypróbuj online!

Anonimowy blok kodu, który pobiera liczbę i zwraca ciąg poprawnych znaków.

Wyjaśnienie:

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

Można udowodnić, że dla dowolnej liczby n bazie b , ndigitsum(n)(modb-1) (wskazówka: pamiętaj, żeb(modb-1)=1 ).

Możemy użyć tego, aby uzyskać cyfrę naszej liczby binarnej, parsując ją jako liczbę dziesiętną i modulując przez 9, co jest ważne, ponieważ zakres liczb, których używamy, ma mniej niż 9 bitów. Pomaga to automatyczne rzutowanie ciągu binarnego przez Perl 6 na liczbę dziesiętną, gdy jest używane w kontekście numerycznym.



7

JavaScript (Node.js) , 60 bajtów

Używanie sztuczki modulo Jo Kinga

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

Wypróbuj online!


JavaScript (Node.js) ,  70  69 bajtów

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

Wypróbuj online!

Skomentował

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 bajtów przy użyciu sztuczki modulo Jo.
Kudłaty

@Shaggy Oh. To miło.
Arnauld

6

Brachylog , 7 bajtów

∈Ṭ&ạhḃ+

Wypróbuj online!

Predykat, który działa jak generator , pobiera dane wejściowe przez zmienną wyjściową i generuje każdy znak poprzez zmienną wejściową. Ponieważ 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

Excel (2016 lub nowszy), 76 bajtów

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

Pobiera dane wejściowe z A1, wyniki w dowolnej komórce, w której umieścisz tę formułę. Jest to formuła tablicowa, więc musisz nacisnąć Ctrl+ Shift+, Enteraby ją wprowadzić. „2016 lub nowszy” to dlatego, że potrzebuje CONCATfunkcji (przestarzałe CONCATENATEnie przyjmuje tablicy jako argumentu).


Lubię to. Jestem facetem Lotus Notes i 123, więc to działa dla mnie :-)
ElPedro

5

C (biblioteka standardowa), 74 67 bajtów

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

Używanie tylko standardowych funkcji bibliotecznych. Podziękowania dla @gastropner za poprawę z 74 do 67 bajtów.

Wypróbuj online!



@gastropner to niesamowita poprawa! Dziękuję Ci!
Krista

1
Myślę, że musisz zacząć od indeksu 31, aby odebrać miejsce w f(1)skrzynce (ponieważ ++ipomija je).
LambdaBeta

@LambdaBeta Masz absolutną rację, dziękuję!
Krista

5

R , 77 68 bajtów

Podejdź używając pętli for

-9 bajtów dzięki Giuseppe

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

Wypróbuj online!

Poprzednio:

R , 78 69 66 bajtów

-12 bajtów dzięki Giuseppe

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

Przekształca liczby od 32 do 126 w macierz bitów, a następnie sumuje w wierszach, aby znaleźć, które pasują do liczby wejściowej.

Wypróbuj online!


1
Użyj intToBits(x)>0zamiastas.single
Giuseppe

Fajnie, próbowałem |0i dostałem błąd i po prostu założyłem, że operatory logiczne nie będą działać.
Aaron Hayman

1
66 bajtów dla „poprzedniego” podejścia przy użyciu sapplyzamiastmatrix
Giuseppe,

4

Java 10, 98 97 94 70 67 bajtów

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

-24 bajty dzięki NahuelFouilleul .

Wypróbuj online.

Wyjaśnienie:

Zawiera niedrukowalny znak o wartości 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 bajty przy użyciu Long.bitCount
Nahuel Fouilleul

@NahuelFouilleul Ah, zawsze zapominam o wbudowanym Javie! Wielkie dzięki. Za pomocą można zapisać jeszcze 3 bajty n.bitCount. :)
Kevin Cruijssen

Tak, Java ponownie pokonuje JavaScript! Uwielbiam te wyzwania postaci: P
Olivier Grégoire

4

Java 8, 131 71 bajtów

-60 bajtów dzięki wszystkim w komentarzach

Zwraca punkt java.util.stream.IntStreamkodowy

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

Wypróbuj online!

Korzystanie z HashSet, 135 bajtów. Zwraca a 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(""));}}

Wypróbuj online!



1
Dostęp statyczny z reeeeeee w kontekście niestatycznym. Dzięki.
Benjamin Urquhart

Long.toBinaryString(i)może byćLong.toString(i,2);
Kevin Cruijssen

1
@KevinCruijssen to właśnie robi mój pierwszy komentarz
Data wygasła

1
@KevinCruijssen Masz rację. Oto poprawiona wersja: (wciąż) 71 bajtów . I tak, widziałem twoją wersję, którą głosowałem niecałe 10 minut temu;)
Olivier Grégoire


4

Dyalog APL Extended, 24 22 bajtów

ucs a⌿⍨⎕=+⌿2a32126

Wypróbuj online!

-2 bajty dzięki ngn

Alternatywne 22 bajty w zwykłym APL Dyalog przez ngn:

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

Wypróbuj online!


(expr )∘=-> ⎕=expr
ngn

bez przedłużenia: ⎕ucs 32+⍸⎕=32↓+/↑,⍳7⍴2(←io ← 0)
ngn


3

Gaia , 10 bajtów

₵R⟪¤cbΣ=⟫⁇

Wypróbuj 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 bajtów

-4 bajty dzięki Galenowi

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

Wypróbuj online!

Oryginalna odpowiedź

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

Wypróbuj online!

  • 2#:@i.@^8:tworzy liczby binarne od 0 do 255 ( 2 ^ 8jest 256)
  • 1#. sumuje każdy
  • ]= tworzy maskę binarną pokazującą, gdzie suma jest równa oryginalnej wartości wejściowej
  • a.#~ mask używa tej maski binarnej do filtrowania pełnego alfabetu ascii J. a.
  • &(95{.32}.]) ale zanim to zrobisz, weź tylko elementy 32 ... 126 z alfabetu i maski


Dzięki Galen. TIL możesz zrobići.@95
Jonasz


3

K (ngn / k) , 20 bajtów

Rozwiązanie:

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

Wypróbuj online!

Wyjaśnienie:

Ocena od prawej do lewej:

`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

Zestaw 6502 (NES), 22 bajty

Kod maszynowy:

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

Montaż:

    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

Pełny program . Testowany z FCEUX 2.2.3, powinien działać na dowolnym standardowym emulatorze NES.

Zainspirowany odpowiedzią Ryana Russella. Dane wejściowe podane pod adresem procesora 60 USD. Wysyła do pamięci jednostki przetwarzania obrazu konsoli.


2
Witam i witam w PPCG. Czy istnieje jakiś sposób na zweryfikowanie rozwiązania oprócz zbudowania wkładu, tj. Emulatora (online) lub specyfikacji?
Jonathan Frech

@JathanathanFrech Dodałem pełny program, który można złożyć i uruchomić lokalnie. Jak rozumiem, środowisko NES nie jest tak naprawdę ujednolicone dla codegolf.
minus siedem,


2

PowerShell , 83 bajty

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

Wypróbuj online!

Pobiera dane wejściowe $n, konstruuje zakres od 32do 126i wyciąga te liczby, w których |?{}: liczba, converted ToStringw bazie 2; konwersja toCharArra y; grouped do 0s i 1s; biorąc [1]indeks tej grupy; biorąc to .counti sprawdzając, czy jest to -eqzgodne z naszym $numberem wejściowym . Liczby te są następnie rzutowane jako chartablice i pozostawiane w kolejce. Wynik jest niejawny, z nowymi liniami między elementami.



2

Węgiel drzewny , 10 bajtów

Φγ⁼Σ↨℅ι²Iθ

Wypróbuj online! Link jest do pełnej wersji kodu. Wyjaśnienie:

 γ          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




Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.