약간의 스트레칭입니다 .․․․


18

입력:

우리는 두 가지 입력을받습니다 :

  • b두 개의 고유 한 값을 가진 입력 : LeftRight.
  • 그리고 양의 정수 n.

산출:

왼쪽 / 오른쪽 입력을 기반으로 범위 내에서 다음 두 시퀀스 중 하나를 출력합니다 1-n(처음 125 개 항목 아래의 시퀀스가 ​​표시됨).

Left:
1, 6, 7, 56, 57, 62, 63, 960, 961, 966, 967, 1016, 1017, 1022, 1023, 31744, 31745, 31750, 31751, 31800, 31801, 31806, 31807, 32704, 32705, 32710, 32711, 32760, 32761, 32766, 32767, 2064384, 2064385, 2064390, 2064391, 2064440, 2064441, 2064446, 2064447, 2065344, 2065345, 2065350, 2065351, 2065400, 2065401, 2065406, 2065407, 2096128, 2096129, 2096134, 2096135, 2096184, 2096185, 2096190, 2096191, 2097088, 2097089, 2097094, 2097095, 2097144, 2097145, 2097150, 2097151, 266338304, 266338305, 266338310, 266338311, 266338360, 266338361, 266338366, 266338367, 266339264, 266339265, 266339270, 266339271, 266339320, 266339321, 266339326, 266339327, 266370048, 266370049, 266370054, 266370055, 266370104, 266370105, 266370110, 266370111, 266371008, 266371009, 266371014, 266371015, 266371064, 266371065, 266371070, 266371071, 268402688, 268402689, 268402694, 268402695, 268402744, 268402745, 268402750, 268402751, 268403648, 268403649, 268403654, 268403655, 268403704, 268403705, 268403710, 268403711, 268434432, 268434433, 268434438, 268434439, 268434488, 268434489, 268434494, 268434495, 268435392, 268435393, 268435398, 268435399, 268435448, 268435449

Right:
1, 4, 7, 32, 39, 56, 63, 512, 527, 624, 639, 896, 911, 1008, 1023, 16384, 16415, 16864, 16895, 19968, 19999, 20448, 20479, 28672, 28703, 29152, 29183, 32256, 32287, 32736, 32767, 1048576, 1048639, 1050560, 1050623, 1079296, 1079359, 1081280, 1081343, 1277952, 1278015, 1279936, 1279999, 1308672, 1308735, 1310656, 1310719, 1835008, 1835071, 1836992, 1837055, 1865728, 1865791, 1867712, 1867775, 2064384, 2064447, 2066368, 2066431, 2095104, 2095167, 2097088, 2097151, 134217728, 134217855, 134225792, 134225919, 134471680, 134471807, 134479744, 134479871, 138149888, 138150015, 138157952, 138158079, 138403840, 138403967, 138411904, 138412031, 163577856, 163577983, 163585920, 163586047, 163831808, 163831935, 163839872, 163839999, 167510016, 167510143, 167518080, 167518207, 167763968, 167764095, 167772032, 167772159, 234881024, 234881151, 234889088, 234889215, 235134976, 235135103, 235143040, 235143167, 238813184, 238813311, 238821248, 238821375, 239067136, 239067263, 239075200, 239075327, 264241152, 264241279, 264249216, 264249343, 264495104, 264495231, 264503168, 264503295, 268173312, 268173439, 268181376, 268181503, 268427264, 268427391

이 시퀀스는 어떻게 생성됩니까?

1에서 기본 시퀀스 n=10는 다음과 같습니다.

As integer:
1, 2, 3, 4, 5, 6, 7, 8, 9, 10

As binary:
1 10 11 100 101 110 111 1000 1001 1010

왼쪽으로 늘리면 바이너리가 다음과 같이됩니다.

1, 110, 111, 111000, 111001, 111110, 111111, 1111000000, 1111000001, 1111000110

왜? 마지막 비트는 한 번 사용됩니다. 단일 마지막은 두 번 사용됩니다. 두 번째는 세 번 사용됩니다. 기타

So `1010` will become (spaces added as clarification): `1111 000 11 0`

그리고이 새로운 왼쪽 스트레치 이진 문자열은 다시 정수로 변환됩니다.

1, 6, 7, 56, 57, 62, 63, 960, 961, 966

오른쪽으로 확장 된 경우 첫 번째 비트가 한 번 사용됩니다. 두 번째; 셋째 세 번; 이와 같이 :

As binary:
1, 100, 111, 100000, 100111, 111000, 111111, 1000000000, 1000001111, 1001110000

As integer:
1, 4, 7, 32, 39, 56, 63, 512, 527, 624

도전 규칙 :

  • 두 가지 고유 한 값을 사용할 수 있지만 사용하는 값을 명시하십시오. 이 될 수 있도록 1/0, true/false, null/undefined, "left"/"right", 등
  • n 항상 0보다 큽니다.
  • 최소한 언어의 기본 정수 (대부분의 언어에서 32 비트)의 최대 출력을 지원해야합니다.
  • 출력 형식이 유연합니다. 배열 / 목록으로 인쇄하거나 반환 할 수 있습니다. 공백, 쉼표, 파이프 등을 구분 기호로 사용할 수 있습니다. 당신의 전화. (다시 사용한 것을 적어주십시오.)

일반 규칙:

  • 이것은 이므로 바이트 단위의 최단 답변이 이깁니다.
    코드 골프 언어가 코드 골프 언어 이외의 언어로 답변을 게시하지 못하게하십시오. '모든'프로그래밍 언어에 대한 가능한 한 짧은 대답을 생각해보십시오.
  • 표준 규칙이 답변에 적용 되므로 STDIN / STDOUT, 적절한 매개 변수 및 리턴 유형의 전체 프로그램과 함께 함수 / 방법을 사용할 수 있습니다. 당신의 전화.
  • 기본 허점 은 금지되어 있습니다.
  • 가능하면 코드 테스트 링크를 추가하십시오.
  • 또한 필요한 경우 설명을 추가하십시오.

1
n < 128결과 만 32 비트 정수에 맞도록 지원할 수있는 비트 단위 응답을 허용 하시겠습니까 ?
Arnauld

@Arnauld 그것에 대해 의문을 품었지만, 물어 본 이후 왜 안 되 겠어요. 언어의 정수에 맞는 최대 1000 개의 규칙을 변경합니다.
Kevin Cruijssen

@KevinCruijssen 여전히 16 비트 이상으로 제한하는 것이 좋습니다. 데이터 유형으로 단일 비트 만 지원하는 언어가 하나 이상 있습니다.

답변:




5

05AB1E , 14 13 바이트

Outgolfer Erik 덕분에 1 바이트 절약

LbεIiRƶRëƶ}JC

1왼쪽으로.
0(또는 다른 것) 옳습니다.

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

설명

L                # push range [1 ... first_input]
 b               # convert to binary
  ε              # apply to each
   Ii            # if second_input is true
     RƶR         # reverse, multiply each element with its 1-based index and reverse again
        ëƶ       # else, multiply each element with its 1-based index
          }      # end if
           J     # join
            C    # convert to base-10

2
ε-1에 사용할 수 있습니다 :LbεIiRƶRëƶ}JC
Erik the Outgolfer

@EriktheOutgolfer :를 사용하여 좋은 아이디어 ë. if이 경우에 적용 되는 문제를 해결합니다. :)
Emigna

3

껍질 , 13 바이트

mȯḋṠṘo?ḣṫ⁰Lḋḣ

그것은 많은 점선 문자입니다 ...

첫째 소요 b( 0왼쪽 위해 1다음에 오른쪽) n. 온라인으로 사용해보십시오!

설명

mȯḋṠṘo?ḣṫ⁰Lḋḣ  Inputs b=1 and n=5 (implicit).
            ḣ  Range to n: [1,2,3,4,5]
mȯ             Map function over the range:
                 Argument: number k=5
           ḋ     Binary digits: [1,0,1]
   ṠṘ            Repeat each digit with respect to the list
     o    L      obtained by applying to the length (3) the function
      ?  ⁰       if b is truthy
       ḣ         then increasing range: [1,2,3]
        ṫ        else decreasing range: [3,2,1].
                 We get [1,0,0,1,1,1].
  ḋ              Convert back to integer: 39
               Final result [1,4,7,32,39], implicitly print.

아마 b직접 directly 또는 ṫ 로 선택하여 3 바이트를 절약 할 수 있습니다. :
Leo

@ 레오 흠, 미끄러운 경사입니다. 또한 전체 프로그램의 두 가지 버전 중 하나를 b사용할 수 있으며 솔루션 은 다음 과 같습니다 I.
Zgarb

3

Japt , 19 18 17 바이트

0"왼쪽", 1"오른쪽". (실제로는 그 2 대신 거짓 또는 진실 값을 취할 수 있습니다.)

õȤËpV©EĪEnFlÃn2

그것을 테스트


설명

정수 U& 의 암시 적 입력 V.

õ

1에서 사이의 정수 배열을 만듭니다 U.

È

함수를 통해 각각을 전달하십시오.

¤

현재 정수를 이진 문자열로 변환

Ë           Ã

문자열을 통해 맵핑하고 각 문자를 함수를 통해 전달하십시오. 여기서 E현재 색인 F은 전체 문자열입니다.

p

현재 문자를 반복

V©  ª

©논리 AND ( &&) ª논리 OR ||이므로 여기서는 V진실인지 (0이 아님) 여부를 확인합니다 .

경우 V다음 truthy입니다 X반복 도착 Y+1시간을.

YnZl

Vfalse 인 경우 ( )의 길이 ( ) 에서 빼기 X반복 됩니다.YnlZ

n2

기본 10 정수로 다시 변환하십시오.

결과 배열을 내재적으로 출력합니다.


P :이 그 나쁘지 않다, 그래서 나는 오히려 "n 번째 항목"이 아닌 "처음 n 항목"을 실현하기 전에 16까지 도착
ETHproductions

@ETHproductions : 당신은 그 실수를하는 유일한 사람이 아니었다;)
Shaggy

2

가이아 , 15 바이트

⟪¤bw¦¤;ċ%׆_b⟫¦

용도 -1왼쪽과 1권리를.

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

설명

⟪¤bw¦¤;ċ%׆_b⟫¦  Map this block over the range 1..n, with direction as an extra parameter:
 ¤                Swap, bring current number to the top
  b               List of binary digits
   w¦             Wrap each in a list
     ¤            Bring direction to the top
      ;ċ          Push the range 1..len(binary digts)
        %         Select every direction-th element of it (-1 reverses, 1 does nothing)
         ׆       Element-wise repetition
           _      Flatten
            b     Convert from binary to decimal

2

양성자 , 79 바이트

n=>d=>[int(''.join(b[x]*[l-x,x-1][d]for x:2..(l=len(b=bin(i)))),2)for i:1..n+1]

0왼쪽, 1오른쪽입니다.

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

언 골프

f=n=>d=>                        # Curried function
[                               # Collect the results in a list
 int(                           # Convert from a binary string to an int:
  ''.join(                       # Join together
   b[x]                           # Each character of the binary string of n
   *[l-x,x-1][d]                  # Repeated by its index or its index from the end, depending on d
   for x:2..(l=len(b=bin(i))))    
 ,2)
 for i:1..n+1                   # Do this for everything from 1 to n inclusive
]

2

C # (. NET 코어) , 192 (187) + 23 바이트

TheLethalCoder 덕분에 -5 바이트

b=>n=>new int[n].Select((_,a)=>{var g=Convert.ToString(a+1,2);return(long)g.Reverse().SelectMany((x,i)=>Enumerable.Repeat(x,b?i+1:g.Length-i)).Select((x,i)=>x>48?Math.Pow(2,i):0).Sum();})

바이트 수에는 다음이 포함됩니다.

namespace System.Linq{}

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

입력 : left입니다true , rightisfalse

설명:

b => n =>                                   // Take two inputs (bool and int)
    new int[n].Select((_, a) => {           // Create new collection the size of n
        var g = Convert.ToString(a + 1, 2); // Take every number in sequence 1..n and convert to base 2 (in a string)
        return (long)g.Reverse()            // Reverse the bits
               .SelectMany((x, i) =>        // Replace every bit with a collection of its repeats, then flatten the result
                   Enumerable.Repeat(x, b ? i + 1 : g.Length - i))
               .Select((x, i) => x > 48 ? Math.Pow(2, i) : 0)
               .Sum();                      // Replace every bit with a corresponding power of 2, then sum
    })


185 + 23 ^ (한 댓글에 너무 오래
갔다

@TheLethalCoder 감사합니다! 불행히도 인덱스는 0부터 시작하기 때문에 인덱스에 1을 더해야하고 시퀀스는 1부터 시작하기 때문에 187입니다.
Grzegorz Puławski

using System.Linq;보다 짧지 않습니까 namespace System.Linq{}, 아니면 여기에 뭔가 빠졌습니까? 나는 전에 긴 시간이 .NET TBH .. 프로그래밍
케빈 Cruijssen에게

1
@KevinCruijssen은 이것이 사용 Math하고 네임 스페이스 Convert에있는 두 가지를 모두 사용 System하므로 namespace System.Linq가장 짧습니다- 클래스 SystemSystem.Linq클래스 를 모두 사용할 수 있습니다.
Grzegorz Puławski

2

Dyalog APL, 23 바이트

{2⊥b/⍨⌽⍣⍺⍳≢b←2⊥⍣¯1⊢⍵}¨⍳

왼쪽은 1오른쪽입니다0 (함수의 왼쪽 인수로 전달됨)

인덱스 생성기

{... 오른쪽의 각 항목에 중괄호로 함수 적용

b←2⊥⍣¯1⊢⍵ b는 binary 이진수로 인코딩됩니다 (반복되는 해독을 사용하여 나타내는 데 필요한 최소 비트 수 얻기 베이스 2에서 하는 )

⍳≢b 벡터 b에 대한 인덱스 생성≢b b의 길이 임)

⌽⍣⍺ 시간 (여기에서 왼쪽 또는 오른쪽 스트레치에 조건부로 사용)

b/⍨ b에 의해 복제 됨 ((역) 인덱스에 따라 비트를 복제 함)

2⊥ 베이스 2에서 디코딩

TryAPL 온라인


2

자바 스크립트 (ES6), 131 바이트

이것은 Shaggy의 답변 보다 상당히 길다 순수한 비트 방식을 시도하고 싶었습니다.

JS 비트 단위 연산의 32 비트 한계로 인해 n <128 에만 작동합니다 .

커리 구문에서 입력을 취합니다 (n)(r). 여기서 r 은 왼쪽에 대해서는 거짓이고 오른쪽에는 틀립니다.

n=>r=>[...Array(n)].map((_,n)=>(z=n=>31-Math.clz32(n),g=n=>n&&(x=z(b=n&-n),r?2<<z(n)-x:b*2)-1<<x*(r?2*z(n)+3-x:x+1)/2|g(n^b))(n+1))

형식화 및 의견

n => r => [...Array(n)]       // given n and r
  .map((_, n) => (            // for each n in [0 .. n - 1]
    z = n =>                  //   z = helper function returning the
      31 - Math.clz32(n),     //       0-based position of the highest bit set
    g = n =>                  //   g = recursive function:
      n && (                  //     if n is not equal to 0:
        x = z(b = n & -n),    //       b = bitmask of lowest bit set / x = position of b
        r ?                   //       if direction = right:
          2 << z(n) - x       //         use 2 << z(n) - x
        :                     //       else:
          b * 2               //         use b * 2
      ) - 1                   //       get bitmask by subtracting 1
      << x * (                //       left-shift it by x multiplied by:
        r ?                   //         if direction = right:
          2 * z(n) + 3 - x    //           2 * z(n) + 3 - x
        :                     //         else:
          x + 1               //           x + 1
      ) / 2                   //       and divided by 2
      | g(n ^ b)              //     recursive call with n XOR b
    )(n + 1)                  //   initial call to g() with n + 1
  )                           // end of map()

데모


좋아, 나는 지금 내 길이에 대해 조금 나아 졌는데, 당신이 더 짧은 해결책이 아닌 더 긴 해결책을 찾았다는 것을 알았습니다.
Shaggy

1
" (OP의 승인에 따라). "승인 :) +1.
케빈 크루이 센

2

자바 스크립트 (ES6), 113 바이트

아, 너무 길어요! 이것은 당신이 하루에 "진짜"JavaScript, kiddies를 쓸 때 일어나는 일입니다. 당신은 제대로 골프하는 방법을 잊어 버렸습니다!

용도에 대한 truthy 또는 falsey 값 b으로, false"왼쪽"인과 true"오른쪽"인.

n=>b=>[...Array(n)].map(_=>eval("0b"+[...s=(++e).toString(2)].map((x,y)=>x.repeat(b?++y:s.length-y)).join``),e=0)

시도 해봐

o.innerText=(f=
n=>b=>[...Array(n)].map(_=>eval("0b"+[...s=(++e).toString(2)].map((x,y)=>x.repeat(b?++y:s.length-y)).join``),e=0)
)(i.value=10)(j.value=1);oninput=_=>o.innerText=f(+i.value)(+j.value)
label,input{font-family:sans-serif;font-size:14px;height:20px;line-height:20px;vertical-align:middle}input{margin:0 5px 0 0;width:100px;}
<label for=i>Size: </label><input id=i type=number><label for=j>Direction: </label><input id=j min=0 max=1 type=number><pre id=o>



1

망막 , 111 바이트

\d+
$*
1
$`1¶
+`(1+)\1
${1}0
01
1
.
$.%`$*R$&$.%'$*L
+s`(R?)(\d)(L?)(.*¶\1\3)$
$2$2$4
¶*[RL]

1
01
+`10
011
%`1

온라인으로 사용해보십시오! 수를 취하고 하나 L또는 R접미사로서 (또는 별도의 라인에서). 설명:

\d+
$*
1
$`1¶

10 진수를 단항으로 변환하고 1부터로 계산합니다 n.

+`(1+)\1
${1}0
01
1

단항에서 이진수로 변환합니다.

.
$.%`$*R$&$.%'$*L

줄의 위치에 따라 각 비트 RL문자를 줄 바꿈하십시오.

+s`(R?)(\d)(L?)(.*¶\1\3)$
$2$2$4

관련 R또는 L문자를 적절한 인접 숫자로 바꾸십시오.

¶*[RL]

1
01
+`10
011
%`1

남은 문자를 제거하고 2 진수에서 10 진수로 변환하십시오.


1
안녕하세요, 모든 숫자를에서 1로 출력해야합니다 n. n'숫자' 만이 아닙니다 .
Kevin Cruijssen '

@KevinCruijssen Bah, 100 바이트 이하의 카운트가 있습니다 ...
Neil

1

자바 스크립트 (ES6), 130 127 바이트

3 바이트, 케빈 감사

이 사이트에 충분한 ES6을 모르지만 시도했습니다! 각 숫자를 반복하고 해당 숫자에 대한 각 이진 표현을 반복하여 필요한만큼 각 문자를 반복합니다.

d=>n=>{i=0;while(i++<n){b=i.toString(2),s="",k=-1,l=b.length;while(++k<l)s+=b[k].repeat(d?k+1:l-k);console.log(parseInt(s,2))}}

f=d=>n=>{i=0;while(i++<n){b=i.toString(2),s="",k=-1,l=b.length;while(++k<l)s+=b[k].repeat(d?k+1:l-k);console.log(parseInt(s,2))}}
f(1)(10)
f(0)(10)


1
나에게서 +1 :) d=>n=>다른 두 JS ES6 답변과 같이 카레 입력 ( ) 을 사용하여 바이트를 절약 할 수 있다고 생각합니다 . 또한로 변경 k=-1,l=b.length;while(++k<l)s+=b[k].repeat(d?k+1:l-k);하여 다른 2 바이트를 절약 할 수 있다고 생각합니다 k=0,l=b.length;while(k<l)s+=b[k++].repeat(d?k:l+~k);( k=0대신 대신 시작 -1하고 l-k-1필요한 바이트 수 는 단축 됨 l+~k). 또한 괄호는 (i).toString(2)필수입니까?
Kevin Cruijssen

1
+~k화를 받고 유지, 그것을 작동합니다 것 같아,하지만 난 그것을 알아낼 수 없습니다. 다른 팁에 감사드립니다!
Sven Writes Code

1
아 죄송합니다. l+~k 이 아니기 때문에, 잘못 l-k-1하지만 l-k+1.. 내 나쁜. k그래도 0 부터 시작 하여 1 바이트를 계속 골프 수 있습니다 k=0,l=b.length;while(k<l)s+=b[k++].repeat(d?k:l-k+1);.
Kevin Cruijssen

1

루비, 98 바이트

->n,r{t=->a{r ?a:a.reverse};(1..n).map{|k|i=0;t[t[k.to_s(2).chars].map{|d|d*(i+=1)}].join.to_i 2}}

삼항 공간이 a{r ?a:a.reverse}필요합니까?
케빈 크루이 센

2
예. 로 종료 할 수 있습니다 루비 방법은 ?, r?메소드 이름으로 해석되었을 것입니다.
m-chrzan

아 알겠습니다. 설명해 주셔서 감사합니다. 루비로 프로그래밍 한 적이 없지만 Java (또는 C #)에서 사용하는 경우 일반적인 3 진처럼 보이므로 내 의견입니다.
Kevin Cruijssen '

1

자바 8, 136 바이트

Boolean의 소비자에게 람다 (커리) Integer. 부울 매개 변수는 왼쪽으로 늘릴 지 여부를 나타냅니다 (값true , false). 출력은 줄 바꿈으로 구분하여 후행 줄 바꿈과 함께 표준 출력으로 인쇄됩니다.

l->n->{for(int i=0,o,c,d,s=0;i++<n;System.out.println(o)){while(i>>s>0)s++;for(o=c=0;c++<s;)for(d=0;d++<(l?s-c+1:c);o|=i>>s-c&1)o<<=1;}}

언 골프 람다

l ->
    n -> {
        for (
            int i = 0, o, c, d, s = 0;
            i++ < n;
            System.out.println(o)
        ) {
            while (i >> s > 0)
                s++;
            for (o = c = 0; c++ < s; )
                for (
                    d = 0;
                    d++ < (l ? s - c + 1 : c);
                    o |= i >> s - c & 1
                )
                    o <<= 1;
        }
    }

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

제한

그들은에 축적되어 있기 때문에 int s에 출력은 31 비트로 제한됩니다. 결과적으로 입력은 7 비트로 제한되므로 프로그램이 지원하는 최대 입력은 127입니다.

설명

이 솔루션은 비트 단위 연산을 사용하여 확장 된 각 숫자를 구성합니다. 외부 루프는 반복i 는 1에서 n 까지 늘려 질 숫자를 합니다. 각 반복 후에 늘린 값을 인쇄합니다.

내부 while루프 s는의 비트 수로 증가 i하고 후속 비트는 각 비트 위치에서 for반복 c됩니다. 해당 루프 내 d에서 현재 비트를 반복하는 횟수까지 카운트합니다 (입력에 따라 다름) l. 각 단계에서 o왼쪽으로 이동하고 해당 비트 i가 마스크 해제되고 OR 입력됩니다.

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