일부 숫자를 압축 해제


21

당신의 임무는 길이가 10 줄인 지퍼를 생성하는 프로그램이나 기능을 만드는 것입니다. 지퍼의 각 줄은 두 개의 대시로 표시됩니다 --.

--
--
--
--
--
--
--
--
--
--

프로그램 / 기능은 입력으로 백분율 (10으로 나눌 수 있음)을 취하고, 출력은 상단에서 백분율로 지퍼 "풀린"(대시로 구분) 지퍼가되고, 1- 인덱싱 된 최저 레벨이 2 번 반복됩니다. 모든 이전 레벨은 4, 6, 8 등을 반복했습니다. 지퍼 바닥을 중앙에 유지하면서

>>10%
-11-
 --
 --
 --
 --
 --
 --
 --
 --
 --

>>50%
-1111111111-
 -22222222-
  -333333-
   -4444-
    -55-
     --
     --
     --
     --
     --

>>100%
-11111111111111111111-
 -222222222222222222-
  -3333333333333333-
   -44444444444444-
    -555555555555-
     -6666666666-
      -77777777-
       -888888-
        -9999-
         -10-

입력 (백분율)은 원하는대로 포맷 할 수 있지만 (50 %, .5, 50, 5 [제로 암시] 등) 항상 0에서 100 사이의 범위에 있고 10으로 나눌 수 있습니다. 출력은 예제를 유지해야합니다.


입력이 될 수 0%있습니까? 입력을 10으로 나눈 값을 사용할 수 있습니까? 예를 들어, 대신 50%얻을 5?
DJMcMayhem

1
입력 (백분율)은 원하는대로 포맷 할 수 있지만 (50 %, .5, 50), 그냥 가능 5합니까?
Luis Mendo

@DrGreenEggsandIronMan 입력은 0 %가 될 수 있으며 가장 편리한 형식으로 입력 할 수 있습니다.
atlasologist

@LuisMendo, 예, 질문으로 편집하겠습니다. 감사합니다.
atlasologist

후행 줄 바꿈 대신 선행 줄 바꿈이 허용됩니까? 절대 패딩이 허용됩니까?
Titus

답변:


10

파이썬 2- 184 151 146 바이트

def r(n):
  n/=10
  for i in range(1,11):
    if n<0:print"%s--"%p
    elif i>9:print" %s-10-"%p
    else:p=" "*~-i;print"%s-%s-"%(p,`i`*2*n);n-=1

마지막 숫자는 좀 엉망이되었습니다. 나중에 살펴보면 두 번째 if 문을 제거 할 수 있습니다.

편집 : 3 바이트를 제거하기 위해 Thx에서 mbomb007로. 많은 바이트를 제거하는 데 도움이되는 형식화 팁을 제공하는 charredgrass에 감사드립니다! :-D 또 다른 2 바이트를 도와 준 TheBikingViking에게 감사드립니다!


1
에서 i>9대신 i==10공백을 사용 하여 공간을 제거하십시오 range(1, 11).
mbomb007

1
파이썬에서 골프를 치기위한 작은 팁 : 문장을 한 줄로 압축하여 공백에서 많은 바이트를 줄입니다. 예를 들어 마지막 3 줄이 될 수 있습니다 p=" "*(i-1);print"%s-%s-"%(p,str(i)*2*n);n-=1.
charredgrass

감사 ! 그것은 이것으로 많은 도움이되고 앞으로 골프에서 그것을 명심할 것입니다
Jeremy

1
(i-1)마지막 줄을 로 바꾸면 2 바이트를 줄일 수 있습니다 ~-i. 이것은 연산자 우선 순위와 비트 플립 다음에 부정이 적용된다는 사실을 이용합니다 1.
TheBikingViking

사용의 포인트 란 range(1,11)다음과 (i-1)?
Leaky Nun

10

파이썬 2, 74 바이트

n=input()
x=0
exec"print' '*x+'-'+`x+1`*(n-x<<1-x/9)+'-';x=min(x+1,n);"*10

execDennis 덕분에 루프 를 수정하여 2 바이트를 절약했습니다.

편집 : 나는 약간 다른 접근 방식을 취하고 2 바이트를 더 절약했습니다.


1
루프 '-'+`x+1`*(n-x<<1-x/9)+'-'에서를 로 바꾸면 문자열 형식을 사용하여 2 바이트를 절약 할 수 있습니다 . exec'-%s-'%`x+1`*(n-x<<1-x/9)
R. Kap

아니, 나는 주변에 괄호가 필요하다 `x+1`*(n-x<<1-x/9).
Lynn

4

PowerShell을 V2 +, 130 120 116 110 바이트

param($n)$i=0;10..1|%{" "*$i+(("-"+("$($i+1)"*([math]::Max($n-10+$_,0))*2)),"-10")[$n-$_-eq9]+"-";$i+=$i-ne$n}

편집 1- $x변수 를 제거 하고 문자열이 구성되는 방식을 약간 다시 실행 하여 10 바이트를 골프로 치십시오 .
편집 2-입력 방법을 다시 실행하고 $i각 루프를 계산 하는 방법을 다시 실행하여 또 다른 4 바이트를 골프화했습니다 .
편집 3-입력을로 허용하여 OP로 6 바이트를 저장 0..10하므로 10으로 나눌 필요가 없습니다.

놀랍게도 어렵다!

로 입력을 받아 1, 5등의 저장 $n. 설정 도우미 $i변수 (변수가 초기화해야한다는 사실을 매우 희귀 한 번 한 0다음 PowerShell에서), 그리고에서 루프를 시작 10으로 1.

반복 할 때마다, 우리는 동일한 공간의 번호와 우리의 문자열을 시작 설정 $i의사 삼항 다음에 (... , ...)[]. 의사 원의 내부에서, 우리는 하나의 문자열을 선택 -자릿수의 수 (높은으로 $n-10+$_또는 02를 곱한 값) 또는 문자열 -10선택이 우리가 10의 반복에있어 여부에 따라하고 우리 입력했다 - 100. 우리는 그것을 final로 연결합니다 -. 결과 문자열이 파이프 라인에 배치됩니다.

마지막으로, 우리는 증가 $i하고 이것은 정말 까다로 웠습니다. 우리는 바이너리 캐스트 투 인트 릭 트릭을 사용 $i하여에 도달 할 때 까지만 증가 $n시킨 다음 동일한 값을 유지합니다. 이를 통해 적절한 수준에서 지퍼 압흔의 "끝"에 도달 할 수 있습니다.

루프가 완료되면 결과 문자열이 모두 파이프 라인에 누적되고 출력이 내재됩니다.

PS C:\Tools\Scripts\golfing> .\unzip-some-numbers.ps1 70
-11111111111111-
 -222222222222-
  -3333333333-
   -44444444-
    -555555-
     -6666-
      -77-
       --
       --
       --

PS C:\Tools\Scripts\golfing> .\unzip-some-numbers.ps1 100
-11111111111111111111-
 -222222222222222222-
  -3333333333333333-
   -44444444444444-
    -555555555555-
     -6666666666-
      -77777777-
       -888888-
        -9999-
         -10-


3

파이썬, 95 84 바이트

@Dr Green Eggs와 Iron Man 덕분에 람다는 합법적이라는 것을 몰랐습니다.

lambda p:'\n'.join(' '*min(p,l)+'-'+(2-(l==9))*(p-l)*str(l+1)+'-'for l in range(10))

1
이봐, 첫 번째 대답! 목록 이해에서 벗어나 2 바이트를 절약 join하고 생성기를 직접 가져올 수 있습니다.
Morgan Thrapp

2
인쇄하는 대신 람다를 수행 할 수 있습니다. Morgan의 제안으로 : lambda p:'\n'.join(' '*min(p,l)+'-'+(2-(l==9))*(p-l)*str(l+1)+'-'for l in range(10))(84 bytes)
DJMcMayhem


1

루비, 74 바이트

질문에 지정된 묵시적 제로 형식을 사용하므로 익명 함수가에 할당 된 경우도 마찬가지 40%입니다 . 전체 백분율이 필요한 경우 +6 바이트f[4]fn/=10;

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

->n{10.times{|i|puts' '*[i,n].min+"-#{i>8?10:(i+1).to_s*2*(n-i)if i<n}-"}}

1

파이썬 3, 98, 90, 87 , 85 바이트.

이미 10으로 나눈 숫자를 가져옵니다. 아마도 일부 괄호를 제거 할 수 있지만 이것은 완전히 골프를 치르는 데는 매우 닫힙니다.

lambda n:'\n'.join(' '*min(i,n)+'-%s-'%(str(i+1)*(n>i>8or(n-i)*2))for i in range(10))

1

하스켈, 83 바이트

f n=unlines[[[1..y]>>" ",take(2*(n-y))$cycle$show$y+1]>>=(++"-")|y<-min n<$>[0..9]]

무엇입니까 ++"-"?
someonewithpc

1

자바 스크립트 es7, 105 바이트

A=>[...Array(10)].map((a,i)=>' '.repeat((d=A<i)?A:i)+('-'+(i+1+'').repeat(d?0:i<9?2*(A-i):1)+'-')).join`
`

와 전화

f=A=>[...Array(10)].map((a,i)=>' '.repeat((d=A<i)?A:i)+('-'+(i+1+'').repeat(d?0:i<9?2*(A-i):1)+'-')).join`
`


f(10)
f(5)
f(0)

The program/function ...-발췌문 아님
Titus

1
\n실제 줄 바꿈으로 바꾸면 바이트를 저장할 수 있습니다.
Mama Fun Roll

1
@Titus 무슨 소리 야? 이 "스 니펫"은 함수입니다.
NiCk Newman

1
아 맞다. ES7, 잊어 버렸습니다.
Titus

@MamaFunRoll 나는 그것을 가지고 있었지만 ""로 감쌀 수 없었고 .length를 할 수 없었기 때문에 100 % 확신을 갖지 못했습니다. 분명하게 덧붙였습니다.)
Charlie Wynn

1

파이썬 2.7, 113 (108) 77 바이트

n =
범위 (0,10)의 x에 대한 n = 입력 () :
v = str (x + 1) * (nx) 2
x
n> 89 : v = '10 '
print' '* min (x, n) + '-'+ v + '-'

골프를 처음 했어요. 계속 간다, <100을 얻으려고 노력해라.
입력이 1-10이라고 가정합니다.

편집 : @LeakyNun의 답변 (감사)의 몇 가지 트릭을 사용하고 조금 더 움켜 쥐고 ... 기본적으로 동일한 대답 : /`int` 문자열 변환에 대해 몰랐으며 2-부울 if 문을 제거하면 전체 v 변수를 제거 할 수 있습니다. 매우 시원합니다.

내 버전 :

n=input()
for x in range(10):print' '*min(x,n)+'-'+`x+1`*(n-x)*(2-(x>8))+'-'

좋은 답변, 사이트에 오신 것을 환영합니다! 들여 쓰기 레벨을 4 대신에 1 개의 공백으로 변경하여 9 바이트를 제거 할 수 있습니다.
DJMcMayhem

실제로, 이것으로 이것을 더 짧게 만들 수 있습니다 :n=input(); for x in range(0,10):print' '*min(x,n)+'-'+('10'if x*n>89 else str(x+1)*(n-x)*2)+'-'
DJMcMayhem


0

파이썬 2.7, 110 99 95 91 바이트 :

G=input();i=1;exec"print' '*[~-i,G][i>G]+'-%s-'%[`i`*(2*-~G-i*2),'10'][(i>9)*G>9];i+=1;"*10

포괄적 인 범위의 정수로 입력을받는 완전한 프로그램 . [1,10]여기서 10평균 100%1수단 10%. 아마 조금 더 아래로 골프를 칠 수 있습니다.

온라인으로 사용해보십시오! (아이디어)


0

PHP 5.3, 92 91 바이트

<?for(;$i<10;$i++)echo'
'.str_pad('-'.str_repeat($i+1,$n>9&&$i>8?:($n-$i)*2).'-',22,' ',2);
  • register_globals=1and short_open_tags=1(and error_reporting=0)를 포함한 PHP 5.3
    CLI의 호출로php-cgi -f <filename> n=<number>
  • 0에서 10까지의 숫자

  • 웹 브라우저에서 <scriptpath>?n=<number>다음 을 사용하여 호출하는 방법 : prepend<pre>
  • 4.0.1 <PHP <5.3 : 교체 ?:와 함께 ?1:(1)
  • PHP> = 5.4의 경우 : 첫 번째 $n($n=$_GET[n])(+11)로 바꿉니다.

함수로 ungolfed (모든 PHP> = 4.0.1)

function unzip($n) // $n from 0 to 10
{
    for($i=0;$i<10;$i++)                // $i = line number -1
        $s.='
'.str_pad(                              // pad the result of the following on both sides
            '-'.                            // prepend '-'
            str_repeat($i+1,                // print line number
                ($n>9&&$i>8 ? 1             // in tenth line, if $n is 10: once
                : ($n-$i)*2)                    // else  2*($n-$i) times
            ).'-'                           // append '-'
            , 22,' ', STR_PAD_BOTH);    // pad to 22 width with SPC on both sides
    return $s;
}

테스트 스위트

echo'<table border=1><tr>';
for($i=0;$i<11;$i++)echo'<th>',$i*10,'%</th>';
echo'</tr><tr>';
for($i=0;$i<11;$i++)echo'<td><pre>', unzip($i), '</pre></td>';
echo '</table>';

이제 이것은 나에게 새로운 것입니다 : PHP가 JavaScript보다 뛰어납니다.
이 접근 방식은 최소한으로 골프를 쳤다고 생각합니다.


STR_PAD_BOTH이것이 무엇입니까, K & R C? 우리도 #definePHP로 작업합니까? :-)
고양이

@cat : yup, PHP에는 실제 정의가 있습니다. 그러나 정적 인 것만; C에서 좋아하지 않음
Titus


0

펄, 122 바이트

$k=<>;for(my $i=0;$i++<10;){$s="-"."$i"x($k/10-$i+1);$p=length $s;$l=$l>$p?$l:$p;printf "%${l}s%s\n",$s,scalar reverse $s}

0

공통 Lisp (Lispworks), 314 바이트

(defun f()(let((s(string(read))))(let((n(/(parse-integer(subseq s 0(1-(length s))))10)))(if(> n 0)(progn(dotimes(r n)(progn(dotimes(c r)#1=(format t" "))(format t"-")(if(=(1+ r)10)(format t"10")(dotimes(j(* 2(- n r)))(format t"~S"(1+ r))))(format t"-~%")))(dotimes(d(- 10 n))(dotimes(c n)#1#)(format t"--~%")))))))

금색 :

    (defun f ()
      (let ((s (string (read))))
        (let ((n (/ (parse-integer (subseq s 0 (1- (length s)))) 10)))
          (if (> n 0)
              (progn
                (dotimes (r n)
                  (progn
                    (dotimes (c r)
                      (format t " "))
                    (format t "-")
                    (if (= (1+ r) 10)
                        (format t "10")
                      (dotimes (j (* 2 (- n r)))
                        (format t "~S" (1+ r))))
                    (format t "-~%")))
                (dotimes (d (- 10 n))
                  (dotimes (c n)
                    (format t " "))
                  (format t "--~%")))))))

용법:

    CL-USER 2515 > (f)
    10%
    -11-
     --
     --
     --
     --
     --
     --
     --
     --
     --
    NIL

    CL-USER 2516 > (f)
    50%
    -1111111111-
     -22222222-
      -333333-
       -4444-
        -55-
         --
         --
         --
         --
         --
    NIL

    CL-USER 2517 > (f)
    100%
    -11111111111111111111-
     -222222222222222222-
      -3333333333333333-
       -44444444444444-
        -555555555555-
         -6666666666-
          -77777777-
           -888888-
            -9999-
             -10-
    NIL

0

APL, 46 바이트

{↑(⍳10){(''↑⍨1-⍺⌊a+1),1⌽'--',⍵⍴⍕⍺}¨10↑2×⌽⍳a←⍵}

인수는 백분율을 10으로 나눈 값으로 제공해야합니다 (즉, [0,10] 범위의 단순 정수).

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