주어진 비트 수를 가진 모든 ASCII 문자


30

(@ChasBrown 덕분에 제목)

모래 상자

배경

이 도전은 최근 Puzzling Stack Exchange 에 게시 한 질문에서 영감을 얻었습니다 . 원래 질문에 관심이 있으시면 링크를 따라 주시기 바랍니다. 그렇지 않다면 여기에 세부 사항이 없습니다.

사실

인쇄 가능한 모든 표준 ASCII 문자는 32에서 126 사이의 10 진수 값을 갖습니다. 이들은 100000에서 1111110 사이의 해당 이진수로 변환 될 수 있습니다. 이 이진수의 비트를 합하면 항상 1에서 6 사이의 정수로 끝납니다.

도전

입력 값으로 1에서 6까지의 정수가 주어지면, 이진 값의 비트의 합이 입력 정수와 동일한 인쇄 가능한 모든 표준 ASCII 문자를 허용 가능한 형식으로 출력하는 프로그램 또는 함수를 작성하십시오.

예제 / 테스트 사례

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

ungolfed Python 참조 구현은 여기 (TIO)에서 사용할 수 있습니다 .

규칙

  1. 입력이 항상 1과 6 사이의 정수 (또는 정수의 문자열 표현)라고 가정하십시오.
  2. 결과를 표시하는 프로그램이나 결과를 반환하는 함수를 작성할 수 있습니다.
  3. 출력은 합리적인 형식 일 수 있지만 모든 입력에 대해 일관성이 있어야합니다 . 인용 문자열을 출력하기로 선택한 경우 모든 입력에 동일한 유형의 인용 부호를 사용해야합니다.
  4. 평상시와 같이 표준 허점은 금지되어 있습니다.
  5. 이것은 코드 골프이므로 각 언어에서 가장 짧은 코드가 승리합니다.

십진수 ASCII 값의 목록을 반환 / 인쇄 할 수 있습니까, 아니면 문자 형식 (예 : 63vs ?) 이어야 합니까?
Benjamin Urquhart

1
실제 문자 여야합니다.
ElPedro

7
예를 들어, 파이썬 '은 기본적으로 문자열의 문자열 표현에 작은 따옴표 ( )를 사용하지만 "문자열에 작은 따옴표가 있고 큰 따옴표가없는 경우 큰 따옴표 ( )를 사용 합니다. . 실제 문자열을 표현하는 대신 반환하는 것이 더 좋을 것이므로이 특정 사례는별로 중요하지 않으며 어쨌든 입력을 위해 이러한 문자열에 작은 따옴표를 사용할 수는 있지만 여기서 언급 할 가치가 있다고 생각합니다.
Outgolfer Erik

@EriktheOutgolfer에 동의합니다. 나는이 글은 :-) 별도의 규칙으로 그것을 던져 단지 재미있을 거라고 생각하는 이유입니다
ElPedro

1
@ElPedro 첫 번째 예제에는 공백이 있기 때문에 따옴표를 사용하는 것이 좋을 것이므로 어떻게 해야할지 잘 모르겠지만 일반적인 따옴표는 모두 출력에 나타납니다.) 편집 : 아마도 프랑스어 guillemets ( « »)? : D
flawr

답변:


29

8088 어셈블리, IBM PC DOS, 35 30 29 바이트

기계 코드 :

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

리스팅 :

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

독립형 PC DOS 실행 프로그램, 명령 행에서 입력 번호. 콘솔 창에 출력이 표시됩니다.

여기에 이미지 설명을 입력하십시오

ABCT.COM (AsciiBitCounT)을 다운로드하여 테스트 하십시오 .


8
잠시 동안이 답변에 도메인을 등록한 것처럼 " AT ABCT.COM 다운로드 및 테스트"라고 생각했습니다 .
Sparr

14

CP-1610 어셈블리 ( Intellivision ), 20 DECLE 1 = 25 바이트

N을 취함R0 와의 출력 버퍼에 대한 포인터 R4 . 버퍼에 일치하는 모든 문자를 쓰고 결과의 끝을 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

N = 2에 대한 출력

NB : 여는 괄호는 Intellivision 글꼴의 여는 대괄호와 매우 비슷합니다. 그러나 두 문자는 구별됩니다.

산출

jzIntv의 스크린 샷


1. CP-1610 opcode는 'DECLE'로 알려진 10 비트 값으로 인코딩됩니다. 이 루틴의 길이는 $ 4819에서 $ 482C (포함)로 끝나는 20 DECLE입니다.


5
+1 (a) Intellivision 용 솔루션 및 (b) 내가 본 최초의 Intellivision 코드 인 경우 +1.
8

3
Intellivision의 @ Eight-BitGuru 코딩은 매우 재미 있습니다. 그리고 오늘날의 홈브류 게임은 16 비트 ROM으로 작성되어 CPU의 모든 기능을 이용할 수 있습니다. :)
Arnauld

인상적! Intellivision에 프레임 버퍼와 내장 문자 세트가 있는지 전혀 몰랐습니다. 확실히 Atari 2600보다 훨씬 발전했습니다. 아주 잘 했어요!
640KB

2
@gwaugh GROM (Graphics ROM 용)에는 인쇄 가능한 모든 ASCII 문자와 몇 가지 일반적인 그래픽 모양이 포함되어 있습니다. 재미있는 사실 : 메인 ROM에 맞지 않는 실행 코드도 포함되어 있습니다.
Arnauld

확실히 2600보다 더 진보했지만, 메모리가 제공된다면 Mattel은 ROM에 숨어있는 고급 내용을 공개하지 않았기 때문에 타사 개발자는 직선 기계 코드로 제한되었거나 자체적으로 멋진 것을 포기해야했습니다. . 외경일지도 모른다.
brhfl



8

펄 6 , 41 34 바이트

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

온라인으로 사용해보십시오!

숫자를 사용하고 유효한 문자 문자열을 반환하는 익명 코드 블록입니다.

설명:

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

이 입증 될 수있는 번호 베이스에 , 손가락()(모드1) (단서 : b를 기억하십시오(모드1)=1 ).

이것을 사용하여 이진수의 자리수를 10 진수로 구문 분석하고 9로 모듈화하여 이진수의 자리수를 얻을 수 있습니다. 이는 우리가 사용하는 숫자의 범위가 9 비트 미만임을 보장하기 때문에 유효합니다. 이는 숫자 컨텍스트에서 사용될 때 Perl 6의 2 진 문자열을 10 진수로 자동 캐스트하는 데 도움이됩니다.



7

자바 스크립트 (Node.js) , 60 바이트

사용 조 왕의 모듈로 트릭을

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

온라인으로 사용해보십시오!


자바 스크립트 (Node.js) ,  70  69 바이트

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

온라인으로 사용해보십시오!

댓글

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

Jo의 모듈로 트릭을 사용하는 60 바이트 .
Shaggy

@Shaggy Oh. 좋은 일입니다.
Arnauld

6

Brachylog , 7 바이트

∈Ṭ&ạhḃ+

온라인으로 사용해보십시오!

generator로 기능 하고 출력 변수를 통해 입력을 받고 입력 변수를 통해 각 문자를 생성 하는 술어 . 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 이상), 76 바이트

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

A1에서 입력을 받아이 수식을 넣은 셀에 출력합니다. 이것은 배열 수식이므로 Ctrl+ Shift+ Enter를 눌러 입력해야합니다. "2016 이상"은 CONCAT함수가 필요하기 때문에 사용되지 않습니다 (더 이상 사용되지 않는 CONCATENATE배열은 인수로 배열을 사용 하지 않습니다).


나는 이것을 좋아한다. 나는 로터스 노트와 123 녀석입니다 그래서 이것은 나를 위해 작동 :-)
ElPedro

5

C (표준 라이브러리), 74 67 바이트

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

표준 라이브러리 기능 만 사용합니다. 74에서 67 바이트로 개선하기 위해 @gastropner로 이동하십시오.

온라인으로 사용해보십시오!



놀라운 개선 인 @gastropner! 고맙습니다!
크리스타

1
f(1)경우 공간을 가져 오기 위해 인덱스 31에서 시작해야한다고 생각합니다 ( ++i건너 뛰기 때문).
LambdaBeta

@LambdaBeta 당신은 절대적으로 맞습니다, 감사합니다!
Krista

5

R , 77 68 바이트

for 루프를 사용하여 접근

주세페 덕분에 -9 바이트

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

온라인으로 사용해보십시오!

이전 :

R , 78 69 66 바이트

주세페 덕분에 -12 바이트

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

32에서 126까지의 숫자를 비트 행렬로 변환 한 다음 행을 합하여 입력 숫자와 일치하는 것을 찾습니다.

온라인으로 사용해보십시오!


1
intToBits(x)>0대신 사용as.single
Giuseppe

니스, 시도 |0하고 오류가 발생하여 논리 연산자가 작동하지 않는다고 가정했습니다.
Aaron Hayman

1
66 바이트를 사용하여 "이전"접근 방식 sapply보다는matrix
주세페

4

자바 10, 98 97 94 70 67 바이트

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

-24 덕분에 바이트 NahuelFouilleul .

온라인으로 사용해보십시오.

설명:

유니 코드 값을 가진 인쇄 할 수없는 문자를 포함합니다 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
Long.bitCount를 사용하는 -24 바이트
Nahuel Fouilleul

@NahuelFouilleul 아, 나는 항상 그 내장 Java를 잊어 버렸습니다! 고마워 를 사용하여 3 바이트를 더 절약 할 수 있습니다 n.bitCount. :)
Kevin Cruijssen

예, Java가 JavaScript를 한 번 더 능가합니다! 나는 그 캐릭터 도전을 좋아합니다 : P
Olivier Grégoire

4

자바 8, 131 71 바이트

-60는 의견에 모두가 감사 바이트

반환 java.util.stream.IntStream코드 포인트의를

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

온라인으로 사용해보십시오!

HashSet 사용, 135 바이트 를 반환합니다 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(""));}}

온라인으로 사용해보십시오!



1
비 정적 컨텍스트 재 응답을 통한 정적 액세스 감사.
Benjamin Urquhart

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

1
@KevinCruijssen 그것이 저의 첫 번째 의견입니다
만료 된 데이터

1
@KevinCruijssen 당신이 맞아요. 다음은 고정 버전입니다 : (여전히 71 바이트) . 그리고 네, 10 분 전에 공표 한 버전을 보았습니다.)
Olivier Grégoire

4

C # (Visual C # 대화식 컴파일러) , 86 바이트

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

사용할 아이디어를 주신 @ExpiredData에 감사드립니다 Sum()! PC로 돌아 오면 문자열 "0123456"을 인쇄 할 수없는 문자열 로 바꾸어 3 바이트를 절약합니다.

온라인으로 사용해보십시오!



@ExpiredData 아이디어를 사용해 주셔서 감사합니다 Sum()!
무지의 실시




3

J , 31 27 바이트

Galen 덕분에 -4 바이트

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

온라인으로 사용해보십시오!

원래 답변

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

온라인으로 사용해보십시오!

  • 2#:@i.@^8:이진수를 0에서 255까지 생성합니다 ( 2 ^ 8256 임).
  • 1#. 각각의 합계
  • ]= 합계가 원래 입력과 같은 위치를 나타내는 이진 마스크를 생성합니다.
  • a.#~ mask 이 이진 마스크를 사용하여 J의 전체 ASCII 알파벳을 필터링합니다. a.
  • &(95{.32}.]) 그러나 그렇게하기 전에 알파벳과 마스크에서 32 ~ 126 요소 만 가져옵니다.


고마워요. 당신이 할 수있는 TILi.@95
Jonah


3

K (ngn / k) , 20 바이트

해결책:

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

온라인으로 사용해보십시오!

설명:

오른쪽에서 왼쪽으로 평가 :

`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 어셈블리 (NES), 22 바이트

기계 코드 :

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

어셈블리:

    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

전체 프로그램 . FCEUX 2.2.3으로 테스트되었으며 모든 표준 NES 에뮬레이터에서 작동합니다.

Ryan Russell의 답변에서 영감을 얻었습니다. CPU 주소 $ 60에 입력. 콘솔의 Picture Processing Unit 메모리로 출력합니다.


2
PPCG에 오신 것을 환영합니다. 카트리지 (예 : (온라인) 에뮬레이터 또는 사양)를 작성하는 것 외에 솔루션을 확인할 수있는 방법이 있습니까?
Jonathan Frech

@JonathanFrech 나는 로컬에서 조립하고 실행할 수있는 전체 프로그램을 추가했습니다. 내가 이해하는 것처럼 NES 환경은 실제로 codegolf에 대해 표준화되지 않았습니다.
음수


2

PowerShell , 83 바이트

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

온라인으로 사용해보십시오!

입력을 받아 $n,의 범위를 구성 32하는 126이들 숫자 꺼내서 |?{}, 수 :convert 에드 ToString기초하여 2; 변환 된 toCharArra y; group에드 0S 및 1S; [1]그 그룹화 의 색인을 취하는 것; .count그것을 가져 와서 -eq입력 입력 과 일치하는지 확인하십시오 $n. 그런 다음 해당 숫자는 char-array 로 캐스트되고 파이프 라인에 남습니다. 출력은 요소 사이에 개행과 함께 암시 적입니다.



2

, 10 바이트

Φγ⁼Σ↨℅ι²Iθ

온라인으로 사용해보십시오! 링크는 자세한 버전의 코드입니다. 설명:

 γ          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




당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.