화장지 미스터리


36

오늘날 매우 실용적인 문제를 해결해야합니다. 화장지 롤에 특정 수의 시트가 있어야하는 루프는 몇 개입니까? 몇 가지 사실을 살펴 보자.

  • 맨손 화장지 실린더의 직경은 3.8cm
  • 화장지 한 장의 길이는 10cm입니다.
  • 화장지 한 장의 두께는 1mm입니다.

실린더를 처음으로 감싸기 전에 둘레는 3.8 * pi입니다. 원통 주위에 시트를 감쌀 때마다 반경이 0.1 씩 증가하므로 둘레는 0.2 * PI 씩 증가합니다. 이 정보를 사용 하여 화장지 n 장에 맞는 루프 수를 확인하십시오 . (참고 : 최소한 3.14159만큼 정확한 Pi의 근사값을 사용하십시오).

테스트 사례 :

n = 1 :

  • 10 / (3.8 * pi) = .838 루프

n = 2 :

  • (우리는 얼마나 많은 풀 루프를 만들 수 있습니까?) 1 풀 루프 = 3.8 * pi = 11.938.
  • (첫번째 루프 이후에 얼마나 남았습니까?) 20-11.938 = 8.062
  • (나머지 조각은 두 번째 루프를 얼마나 만드는가?) 8.062 / (4 * pi) = .642 루프
  • 답 : 1.642 루프

n = 3 :

  • 첫 번째 전체 루프 = 3.8 * pi = 11.938, 두 번째 전체 루프 = 4 * pi = 12.566
  • 30-11.938-12.566 = 5.496
  • 5.496 / (4.2 * pi) = .417
  • 답 : 2.417 루프

n = 100 => 40.874


35
휴! 두께 1mm? 골판지가 아닌 화장지를 사용하고 있습니까?
Digital Trauma

11
@DigitalTrauma 분명히 트리플 플라이에 대해 모른다 : p
geokavel

2
화장지가 단계를 만들지 않고 지속적으로 반지름을 늘리는 가정하에 요청한 결과에 대한 닫힌 형태 근사치를 얻을 수 있습니다. 이것으로 충분합니까? nloops = sqrt(n+11.34)*0.0564189 - 0.19
flawr

2
제안 된 테스트 사례 : 100->40.874
Dennis

1
트리플 플라이 판지?! 지금 의 그 두꺼운!
mbomb007

답변:


13

Pyth, 27 23 바이트

+fg0=-QJc*.n0+18T50)cQJ

온라인으로 사용해보십시오. 테스트 스위트.

설명

                            Q = input number (implicit)
 f                 )        increment T from 1, for each T:
             +18T             add 18 to T, get radius
         *.n0                 multiply by pi to, get half the circumference
        c        50           divide by 50, get circumference in sheets
       J                      save it to J
    =-Q                       decrement Q by it
  g0                          use this T if Q is now <= 0
+                           add
                     Q        Q (now <= 0)
                    c J       divided by J (the last circumference)
                            and print (implicit)

설명 부탁 해요?
Conor O'Brien

@ CᴏɴᴏʀO'Bʀɪᴇɴ 추가되었습니다. Pyth를 설명하는 것은 항상 너무 재미 있습니다.
PurkkaKoodari

2
귀하의 설명은 Surfin 'Word
geokavel

10

하스켈, 59 46 44 바이트

5 / pi의 배율이 적용되어 종이 실린더의 둘레는 19,20,21 ... cm이고 시트는 50 / picm입니다.

명명되지 않은 함수를 사용하여 xnor 덕분에 2 바이트를 절약했습니다.

x!s|s>x=1+(x+1)!(s-x)|1>0=s/x
(19!).(50/pi*)

꽤 재귀적인 방법입니다. 참고 다른 선이있을 때 익명의 기능도 사용할 수 있습니다 (이를 지원하지 않는 하스켈에도 불구하고)을 마지막 줄뿐만 pointfree이 될 수 있도록 (19!).(50/pi*).
xnor

와우, 내 접근을 물 밖으로 날려 버려!
CR Drost


5

하스켈, 97 바이트

p&((m,x):(n,y):z)|y<p=p&((n,y):z)|1>0=m+(p-x)/(y-x)
t=(&zip[0..](scanl(+)0$map(*pi)[0.38,0.4..]))

필터링을 &연산자에서 takeWhile명령문 으로 이동하여 추가로 골프를 칠 수는 있지만 골프 언어가 아니라면 비교적 경쟁력이있는 것으로 보입니다.

설명

전체 루프를 구성하는 화장지 길이의 스트림은 먼저로 계산됩니다 scanl (+) 0 (map (* pi) [0.38, 0.4 ..]]. 우리는 이것들을 완전 회전 수로 압축하여, Double암시 적으로 타입을 선택합니다 . 우리는 &계산하려는 현재 번호로 이것을 전달 합니다 p.

&목록 처리 (Double, Double)까지 앞으로 건너 뛰기 (a)에서 오른쪽에 쌍을 snd . head . tail보다 큰 p있는 점, snd . head이하이다 p.

채워진이 행의 비율을 얻기 위해 (p - x)/(y - x),지금까지 행한 전체 루프 수에이를 계산 하여 추가합니다.


4

C ++, 72 바이트

float f(float k,int d=19){auto c=d/15.9155;return k<c?k/c:1+f(k-c,d+1);}

C ++은 기본 함수 인수를 지원하므로 여기에서 반경을 초기화하는 데 필요했기 때문에 C ++을 사용했습니다.

재귀는 for-loop를 사용하는 것보다 짧은 코드를 생성하는 것으로 보입니다 . 또한, auto대신 float- 1 바이트 이하!


1
당신 dradius를 사용하여 거의 나를 속 였습니다 ...
Toby Speight

3

루아, 82 바이트

n=... l,c,p=10*n,11.938042,0 while l>c do l,c,p=l-c,c+.628318,p+1 end print(p+l/c)

범용 언어에는 나쁘지 않지만 물론 전용 골프 언어에 비해 경쟁이 심하지 않습니다. 상수에는 지정된 정밀도까지 pi가 미리 곱해집니다.


OP는 어떤 종류의 입력을 받아 들일 것인지 구체적이지 않았으므로의 초기화를 생략 n했지만 나머지는 그대로 (있는 그대로) 실행했을 것입니다. 어쨌든 이제는 n명령 행에서 가져 옵니다. 예를 들어 3 매의 경우 다음과 같이 실행하십시오 lua tp.lua 3.
criptych는 Monica

정확하게이 질문의 규칙이 아니라 일반적인 정책입니다. 질문에서 달리 언급하지 않는 한, 입력을 하드 코딩하면 제출이 스 니펫이 되며 기본적으로 허용되지 않습니다 . 사이트 전체 기본값에 대한 자세한 정보는 code golf tag wiki 에서 찾을 수 있습니다 .
Dennis

"전체 프로그램 또는 기능"부분에 대해서는 알고 있었지만 "입력을 하드 코딩하면 제출이 스 니펫이된다"는 것을 몰랐습니다. 설명해 주셔서 감사합니다. 나는 이것이 실제로 함수로서 더 길 것이라고 생각합니다!
criptych는 Monica

3

자바 스크립트, 77 바이트

function w(s,d,c){d=d||3.8;c=d*3.14159;return c>s*10?s*10/c:1+w(s-c/10,d+.2)}


3
PPCG에 오신 것을 환영합니다! 원하는 경우 JavaScript ES6을 사용하여 55 바이트로 얻을 수 있습니다.w=(s,d=3.8,c=d*3.14159)=>c>s*10?s*10/c:1+w(s-c/10,d+.2)
Downgoat

3

C, 87 바이트

float d(k){float f=31.831*k,n=round(sqrt(f+342.25)-19);return n+(f-n*(37+n))/(38+2*n);}

전체 루프 수에 대한 명시 적 공식을 사용합니다.

floor(sqrt(100 * k / pi + (37/2)^2) - 37/2)

나는 대체 100 / pi에 의해 31.831, 교체 floorround성가신 수 회전, -18.5깨끗한에를 -19.

이 루프의 길이는

pi * n * (3.7 + 0.1 * n)

이 길이를 전체 길이에서 빼면 코드는 나머지를 적절한 원주로 나눕니다.


이 솔루션은 O(1)다른 솔루션과는 달리 복잡성이 있습니다. 따라서 루프 또는 재귀보다 약간 더 깁니다.


2

C #, 113 바이트

double s(int n){double c=0,s=0,t=3.8*3.14159;while(n*10>s+t){s+=t;c++;t=(3.8+c*.2)*3.14159;}return c+(n*10-s)/t;}

언 골프 드 :

double MysteryToiletPaper(int sheetNumber) 
    { 
        double fullLoops = 0, sum = 0, nextLoop = 3.8 * 3.14159; 

        while (sheetNumber * 10 > sum + nextLoop) 
        { 
            sum += nextLoop; 
            fullLoops++; 
            nextLoop = (3.8 + fullLoops * .2) * 3.14159; 
        } 

        return fullLoops + ((sheetNumber * 10 - sum) / nextLoop); 
    }

결과 :

1 매

0,837658302760201

2 매

1,64155077524438

3 매

2,41650110749198

100 매

40,8737419532946


2

PHP, 101 바이트

<?$p=pi();$r=3.8;$l=$argv[1]*10;$t=0;while($r*$p<$l){$t+=($l-=$r*$p)>0?1:0;$r+=.2;}echo$t+$l/($r*$p);

언 골프

<?
$pi = pi();
$radius = 3.8;
$length_left = $argv[1]*10;
$total_rounds = 0;
while ($radius * $pi < $length_left) {
    $total_rounds += ($length_left -= $radius * $pi) > 0 ? 1 : 0;
    $radius += .2;
}
echo $total_rounds + $length_left/( $radius * $pi );

나는 이것이 조금 더 짧아 질 수 있다고 생각하지만 아이디어가 부족합니다.


2

파이썬 (3), 114 (109) 99 바이트

이 함수는 원주의 합이 시트 수의 길이보다 클 때까지 각 레이어의 원주를 추적합니다. 일단 이런 일이 생기면 대답은 다음과 같습니다.

  • 계산 된 레이어 수 + 남은 시트 길이 / 가장 최근 레이어의 둘레 보다 하나

def f(n):
    l,s=0,[]
    while sum(s)<n:s+=[.062832*(l+19)];l+=1
    return len(s)-1+(n-sum(s[:-1]))/s[-1]

최신 정보

  • -10 [16-05-09] 내 수학 최적화
  • -5 [16-05-04] 최소화 된 줄 수

1

자바 스크립트, 44 바이트

w=(i,d=19,c=d/15.9155)=>i<c?i/c:1+w(i-c,d+1)

나는 anatolyg의 아이디어를 사용하고 코드를 JavaScript로 번역했습니다.


1

> <>, 46 44 바이트

a*0"Gq",:&a9+*\
?\:{$-{1+{&:&+>:{:})
;>{$,+n

프로그램 시작시 스택에 나타날 용지 수를 예상합니다.

이것은 대략적인 pi of 을 사용하여 레지스터에 355/113 = 3.14159292...저장 pi/5합니다. 현재 반복의 원주는 스택에 있으며 pi/5각 반복에 추가됩니다.

편집 : 원주를 직접 저장하기 위해 리팩토링되었습니다-이전 버전이 저장 pi/10되고 직경이로 시작하여 382 바이트 더 길었습니다.


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