내 길을 제곱


32

사람들은 숫자의 제곱에 숫자가 곱해 진다고 계속 말합니다. 이것은 분명히 거짓입니다. 숫자를 제곱하는 올바른 방법은 숫자를 자릿수와 같은 수의 숫자로 쌓아서 정사각형으로 만드는 것입니다. 왼쪽에서 오른쪽으로 만) 및 세로로 (위에서 아래로만) 함께 추가합니다. 따라서 숫자 123의 경우 먼저 사각형을 만듭니다.

123
123
123

그런 다음 사각형에서 모든 행과 열을 가져 와서 함께 추가하십시오.

123+123+123+111+222+333

우리에게 결과를 제공합니다 1035.

음수의 경우 일반적으로 쌓아두고 ( 자릿수 만 계산 하므로 음수 부호는 길이에 포함되지 않음) 수평 숫자를 정상적으로 읽고 (음수 부호와 함께) 음수 부호를 무시하십시오. 수직 번호. 따라서 숫자의 -144경우 사각형을 얻습니다.

-144
-144
-144

우리에게주는 -144-144-144+111+444+444, 어떤 같음567

숫자가 하나 뿐인 숫자의 경우 제곱은 항상 두 배가 된 숫자와 같습니다 (수평 및 수직으로 한 번 읽음). 그래서 4우리를 제공합니다

4

어떤 우리를 제공 4+4, 어떤 같음8 .

소수 부분이있는 숫자의 경우, 일반적으로 스택하고 ( 숫자숫자 를 쌓은 횟수로 계산되므로 소수점이 계산되지 않음) 수직 숫자를 읽을 때는 소수점을 무시하십시오. 예를 들어 숫자 244.2는 우리에게

244.2
244.2
244.2
244.2

어느 것이 우리에게주는 244.2+244.2+244.2+244.2+2222+4444+4444+2222것과 같습니다 14308.8.

분수 또는 복소수는 제곱 할 수 없습니다.

당신의 작업 :

손으로 숫자를 제곱하는 데 지쳤으므로 프로세스를 자동화하기로 결정했습니다. float 또는 string 중 원하는 것을 입력으로 사용하고 제곱 한 결과를 반환하는 프로그램이나 함수를 작성하십시오.

예 :

123    -> 1035
388    -> 3273
9999   -> 79992
0      -> 0
8      -> 16
-6     -> 0
-25    -> 27
-144   -> 567
123.45 -> 167282.25
244.2  -> 14308.8
2      -> 4
-0.45  -> 997.65
0.45   -> 1000.35

채점 :

내 손이 그 정사각형을 모두 쓰지 못하고 컴퓨터가 복사 / 붙여 넣기를 지원하지 않으므로 입력 할 수있는 코드가 가장 적은 항목이 어떤 이유로 바이트 단위로 측정됩니까?


1
컴퓨터가 숫자를 이진수로 저장하기 때문에 "123.45"및 "244.2"는 유효하지 않습니다. 문제가 10 진수 표현에 의존 할 때까지는 일반적으로 문제가되지 않습니다.
Leaky Nun

@LeakyNun, 난 당신이 무슨 뜻인지 모르겠어요. 문제는 해결할 수 없습니다 (적어도 파이썬에서는). 많은 바이트로도 상당히 쉽게 할 수 있다고 확신합니다. 그러나 일부 문자열 조작이 필요합니다.
그리폰-복원 모니카

@Gryphon 그래서 입력을 문자열로 가져와야합니까?
Leaky Nun

3
@Gryphon 이것이 실패한 곳입니다. 244.2부동 수가 아닙니다. 문자열로 변환 할 수 없습니다 "244.2".
Leaky Nun

3
@Gryphon 그러나 같은 행동 매우 불편합니다.
Leaky Nun

답변:


8

05AB1E , 7 바이트

þSDg×+O

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

설명

þSDg×+O Implicit input
þ       Keep digits
 S      Get chars
  D     Duplicate
   g    Length
    ×   Repeat string(s)
     +  Add (implicit input added to all elements)
      O Sum

3
당신이 기뻐할 때 Ooo 설명
Jonathan Allan

1
또한 단일 선행 0은 -1 <input <1의 입력에 대한 요구 사항입니다 (즉, 0.45와 .45는 다른 입력이지만 동일한 숫자, 전자 만 허용됩니다)
Jonathan Allan

@JonathanAllan 어쨌든 후자는 처리되지 않습니다.
Outgolfer Erik

@JonathanAllan 완료했습니다.
Outgolfer Erik

7

젤리 ,  13  12 바이트

fØDẋ€L$ŒV+VS

문자 목록 (올바른 형식의 10 진수, 단일 선행 0은 -1 <n <1 의 요구 사항 임)을 승인하고 숫자 를 리턴하는 모나드 링크 .

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

14 바이트는 숫자를 받아들이고 반환합니다 (입력은 +/- 10-5 로 제한 ŒṘ) : ŒṘfØDẋ€L$ŒV+⁸S.

방법?

fØDẋ€L$ŒV+VS - Link: list of characters         e.g. "-0.45"
 ØD          - yield digit characters                "0123456789"
f            - filter keep                           "045"
      $      - last two links as a monad:
     L       -   length (number of digit characters) 3
   ẋ€        -   repeat list for €ach digit          ["000","444","555"]
       ŒV    - evaluate as Python code (vectorises)  [0,444,555]
          V  - evaluate (the input) as Jelly code    -0.45
         +   - addition (vectorises)                 [-0.45,443.55,554.55]
           S - sum                                   997.65

음, 당신은 대체 할 수 +€와 함께 +-1 15 바이트 버전.
Outgolfer Erik

이미 감사했습니다!
Jonathan Allan

음, 15 바이트 버전에는 없습니다. 편집 : 3 초 너무 이른 것 같아요
에릭 The Outgolfer

예, 방금 15 바이트 버전이라고 말씀하셨습니다. 다시 한 번 감사드립니다!
Jonathan Allan

6

하스켈, 59 56 바이트

f s|l<-filter(>'.')s=0.0+sum(read<$>(s<$l)++[c<$l|c<-l])

입력은 문자열로 사용됩니다.

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

작동 원리

l<-filter(>'.')s      -- let l be the string of all the numbers of the input string
f s   = 0.0 + sum     -- the result is the sum of (add 0.0 to fix the type to float)
   read<$>            -- turn every string of the following list into a number
   s<$l               -- length of l times the input string followed by
   [c<$l|c<-l]        -- length of l times c for each c in l   

5

Japt v2 , 16 바이트

o\d
l
¬xpV +V*Ng

온라인으로 테스트하십시오!

설명

o\d    First line: Set U to the result.
o      Keep only the chars in the input that are
 \d      digits. (literally /\d/g)

l    Second line: Set V to the result.
l    U.length

¬xpV +V*Ng    Last line: implicitly output the result.
¬             Split U into chars.
 x            Sum after
  pV            repeating each V times.
     +V*Ng    Add V * first input (the sum of the horizontals) to the result.

4

C # (.NET 코어), 150 (141) 133 바이트

@TheLethalCoder 덕분에 9 바이트 절약 @TheLethalCoder 덕분에
8 바이트 절약

a=>{var c=(a+"").Replace(".","").Replace("-","");int i=0,l=c.Length;var r=a*l;for(;i<l;)r+=int.Parse(new string(c[i++],l));return r;}

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

문자열을 입력으로 받아서 '제곱'숫자를 부동 소수점으로 출력합니다.


이 코드는 다음 알고리즘을 따릅니다.

  1. 입력에서 새 문자열을 만들지 만 소수점과 기호는 사용하지 않으므로 열의 길이와 숫자를 얻을 수 있습니다.

  2. 지점 1에서 만든 문자열의 길이와 입력 시간을 계산하십시오.

  3. '사각형'의 각 열에 대해 열 번호와 행 길이가 포함 된 새 문자열을 만들고 결과에 추가하십시오.

예:

입력: -135.5

  1. 소수점과 기호를 바꾸면 1355길이가4 .
  2. 입력 시간 4 : -135.5 * 4 = -542 .
  3. 이제 우리는, 각 열에 대한 새로운 문자열을 생성을 구문 분석하고 우리의 결과에 추가 :
    1111, 3333, 5555, 5555.

이 숫자를 합하면 우리가 얻는 15012것입니다. 이것이 바로 프로그램이 출력하는 것입니다.


1
사이트에 오신 것을 환영하며 멋진 첫 번째 답변 (특히 설명을 부탁드립니다!)!
Dada

@Dada 감사합니다! 심지어 터프한 나는 같은 것들에서 얻은 바이트에 다소 만족하지 string.Replace()않지만 그것이 작동하는 유일한 방법이라고 생각합니다!
Ian H.

설정 i하고 l플로팅 하여 일부 바이트를 저장할 수 있습니다 .
TheLethalCoder

@TheLethalCoder 슬프게도 인덱싱은 플로트와 함께 작동하지 .Length않으며 암시 적으로 플로트로 변환 할 수 없습니다.
Ian H.

1
a=>{var c=a.Replace(".","").Replace("-","");int i=0,l=c.Length;var r=float.Parse(a)*l;for(;i<l;)r+=int.Parse(new string(c[i++],l));return r;}141 바이트 입력을 가져 와서 float문자열로 캐스팅 하여 저장할 수 는 n+""있지만 확인하지 않았습니다.
TheLethalCoder

3

Brachylog , 23 바이트

{∋ịṫ}ᶠ⟨≡zl⟩j₎ᵐ;[?]zcịᵐ+

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

Brachylog는 수레와 잘 어울리지 않습니다 ...

설명:

{∋ịṫ}ᶠ⟨≡zl⟩j₎ᵐ;[?]zcịᵐ+ Takes string (quoted) input, with '-' for the negative sign
     ᶠ                  Return all outputs (digit filter)
{   }                    Predicate (is digit?)
 ∋                        An element of ? (input)
  ị                       Convert to number (fails if '-' or '.')
   ṫ                      Convert back to string (needed later on)
      ⟨   ⟩             Fork
       ≡                 Identity
         l               Length
                        with
        z                Zip
             ᵐ          Map
            ₎            Subscript (optional argument)
           j              Juxtapose (repeat) (this is where we need strings)
              ;         Pair with literal
               [ ]       List
                ?         ?
                  z     Zip
                   c    Concatenate (concatenate elements)
                     ᵐ  Map
                    ị    Convert to number
                      + Add (sum elements)

3

껍질 , 15 바이트

§+ȯṁrfΛ±TṁrSR#±

문자열을 받아서 숫자를 반환합니다. 온라인으로 사용해보십시오!

설명

내장 구문 분석 기능 r이 기본값을 반환하는 대신 유효하지 않은 입력에 대해 구문 분석 오류를 발생 시키는 것은 약간 성가 시므로 숫자가 아닌 열로 명시 적으로 필터링해야합니다. 잘못된 입력에서 0을 반환 fΛ±하면 3 바이트를 삭제 하고 저장할 수 있습니다.

§+ȯṁrfΛ±TṁrSR#±  Implicit input, e.g. "-23"
             #±  Count of digits: 2
           SR    Repeat that many times: ["-23","-23"]
         ṁr      Read each row (parse as number) and take sum of results: -46
  ȯṁrfΛ±T        This part is also applied to the result of SR.
        T        Transpose: ["--","22","33"]
     fΛ±         Keep the rows that contain only digits: ["22","33"]
   ṁr            Parse each row as number and take sum: 55
§+               Add the two sums: 9


3

파이썬 2 , 81 74 바이트

@Mr 덕분에 -7 바이트 Xcoder :'/'<i

  • 정수 또는 float를 취하고 float를 반환합니다.
lambda x:sum(float(i*len(z))for z in[[i for i in`x`if"/"<i]]for i in[x]+z)

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

설명:

123.45은 입력으로 제공됩니다. [i for i in`x`if"/"<x]문자열 화 된 정수의 목록을 제공합니다 ['1','2','3','4','5'](또한 z). 이제 우리는 반복 처리를 통해 [x]+z, 즉 [123.45,'1','2','3','4','5'], 각 요소를 승산 len(z)여기서, 5및 (그래서 문자열도 따라서 변환 있음) float로 각각 변환 얻었다 [617.25,11111.0,22222.0,33333.0,44444.0,55555.0]. 마지막으로 우리는를 계산 sum(...)하고 구합니다 167282.25.


78 바이트 . 교체 i.isdigit()"/"<i<":"
씨 Xcoder

1
74 바이트 . 당신은 대체 할 수 있습니다 i.isdigit()"/"<i모두 있기 때문에, 사실 .-숫자보다 낮은 ASCII 코드를 가지고, ADN /그들 사이에
씨 Xcoder

천만에요. 내 대답에 대한 대안으로 Python 3으로 포팅했습니다.
Mr. Xcoder

3

자바 스크립트, 75 62 바이트

a=>(b=a.match(/\d/g)).map(b=>a+=+b.repeat(c),a*=c=b.length)&&a

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

Arnauld 덕분에 -2 바이트 Shaggy
덕분에 -5 바이트 (함수는 숫자를 받아야하지만 지금은 다른 많은 답변도 문자열을받습니다)


3

펄 5 , 37 33 + 1 (-p) = 38 34 바이트

$_*=@n=/\d/g;for$\(@n){$_+=$\x@n}

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

Dom의 코드에서 몇 가지 트릭을 사용하여 4 바이트를 면도했습니다.

설명 :

@n=/\d/g;    # extract digits from input
$_*=@n;      # multiply input by number of digits
for$\(@n){   # for each digit:
  $_+=       # add to the input
  $\x@n}     # this digit, repeated as many times as there were digits
             # taking advantage of Perl's ability to switch between strings
             # and numbers at any point

매우 비슷한 접근 방식으로 나왔지만 $ \를 사용하여 루프를 종료하고 몇 바이트를 줄였습니다. 온라인으로 시도하십시오!
Dom Hastings

당신의 영감을 사용하여 광산을 면도했습니다. 마지막에 "} {"구성은 무엇입니까? 나는 그것에 익숙하지 않다.
Xcali

이 사이트에서 배운 그것의 하나는, 기본적으로 -n하고 -p그대로 감싸 while(){...}도록 코드 주위에 }{그 중 휴식. 이것은 설정 $_되지 않지만 $\ 변수로 사용 $\ 하면 모든 인쇄에 추가 되므로 여전히 인쇄됩니다. 당신은 그 안에 숫자 나 무언가를 저장하고 무시할 수 있다는 것을 의미합니다 $_. 그것이 훌륭한 설명인지는 모르지만 Perl thread 에서 골프 팁 g를 확인하십시오. 그래도 점수에 도움을 주셔서 감사합니다!
돔 헤이스팅스



2

Pyth , 21 20 바이트

K@jkUTQ+smv*lKdK*lKv

테스트 스위트.

완전히 다른 접근법을 사용합니다 @EriktheOutgolfer의 답변 과 채팅에서 1 바이트의 골프를 22에서 21로 나에게 도움이되었습니다.


설명

K@jkUTQ+s.ev*lKbK*lKv

K @ jkUTQ-숫자를 필터링하여 변수 K에 할당합니다.
         m-지도. 변수 d를 사용하여 숫자를 반복
           v-평가 (부동으로 변환).
            * lKd-각 문자열 숫자에 K 길이를 곱합니다.
        s-합계
       +-합
                 * lKvQ-숫자에 숫자의 길이를 곱합니다.

2

옥타브 , 100 82 바이트

과제에 반환 값이 있고 18바이트를 절약한다고 알려주는 @TomCarpenter에게 감사드립니다 .

@(v)(n=nnz(s=strrep(num2str(abs(v)),'.','')-'0'))*v+sum(sum(s'*logspace(0,n-1,n)))

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

언 골프 / 설명

function f=g(v)
  s=strrep(num2str(abs(v)),'.','')-'0';  % number to vector of digits (ignore . and -)
  n=nnz(s);                              % length of that vector
  f=n*v+sum(sum(s'*logspace(0,n-1,n)))   % add the number n times and sum the columns of the square
end

이것이 작동하는 방식은 기본적으로 숫자 자체를 n곱한 다음 열의 합 을 추가해야한다는 것 입니다. 합산 s' * logspace(0,n-1,n)하는 경우, 예를 들어 열을 달성 한 합을 v=-123.4그 행렬이 될 것이다 :

[ 1     10    100   1000;
  2     20    200   2000;
  3     30    300   3000;
  4     40    400   4000 ]

그래서 우리는 단지 sum그것을 필요로 하고 끝났습니다.


1
익명 함수로 모두 스매싱하여 18 바이트를 절약 할 수 있습니다 @(v)(n=nnz(s=strrep(num2str(abs(v)),'.','')-'0'))*v+sum(sum(s'*logspace(0,n-1,n))). 온라인으로 사용해보십시오!
톰 카펜터

1

스위프트 4 , 139134 바이트

func f(s:String){let k=s.filter{"/"<$0};print(Float(s)!*Float(k.count)+k.map{Float(String(repeating:$0,count:k.count))!}.reduce(0,+))}

테스트 스위트.


설명

  • func f(s:String)- f명시 적 String 매개 변수를 사용하여 함수 를 정의합니다 s.

  • let k=s.filter{"/"<$0}나는 둘 것으로 나타났습니다 : - 숫자를 필터 -하고는 .모든 숫자보다 작은 ASCII-값을 가지고 있고, /사이에 ., -그리고 0. 따라서 "/"필자는 Python 답변에서와 같이 현재 문자보다 작은 지 확인했습니다 .

  • print(...) -결과를 인쇄합니다.

  • Float(s)!*Float(k.count)-문자열과 자릿수를 모두 Float로 변환하고 곱합니다 (Swift는 Float 및 Int 곱셈을 허용하지 않습니다 :()). 이 숫자 추가 그래서 x시간을 어디에 x포함 된 숫자의 수입니다.

  • k.map{Int(String(repeating:$0,count:k.count))!- 현재 값으로 k.map{}매핑 k합니다 $0. String(repeating:$0,count:k.count)각 숫자를 가져 와서 x동일한 숫자 의 문자열을 만들어 Float(...)!부동 소수점 숫자로 변환합니다.

  • .reduce(0,+) -위 목록의 합계를 가져옵니다.

  • 그리고 마지막으로 +두 결과를 요약합니다.


예를 들어 봅시다!

우리의 String이라고 가정하십시오 "0.45". 먼저 숫자를 필터링하여로 남겨 둡니다 0, 4, 5. "0.45"Float 로 변환 하고 자릿수를 곱합니다 0.45 * 3 = 1.35. 그런 다음 각 숫자를 가져 와서 사각형의 너비를 채울 때까지 해당 숫자를 반복하는 문자열로 바꿉니다 0, 4, 5 -> 000, 444, 555. 우리는 이것을 요약합니다 000 + 444 + 555 = 999. 그런 다음 결과를 함께 추가합니다 1.35 + 999 = 1000.35.


1

C #, 139137 바이트

using System.Linq;n=>{var d=(n+"").Where(char.IsDigit);return d.Sum(i=>int.Parse(new string(i,d.Count())))+new int[d.Count()].Sum(_=>n);}

@Ian H 덕분에 2 바이트를 절약했습니다.

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

풀 / 포맷 버전 :

namespace System.Linq
{
    class P
    {
        static void Main()
        {
            Func<double, double> f = n =>
            {
                var d = (n + "").Where(char.IsDigit);
                return d.Sum(i => int.Parse(new string(i, d.Count()))) + new int[d.Count()].Sum(_ => n);
            };

            Console.WriteLine(f(123));
            Console.WriteLine(f(-144));
            Console.WriteLine(f(4));
            Console.WriteLine(f(244.2));

            Console.ReadLine();
        }
    }
}

var d=(n+ ...대신을 사용하여 처음에 2 바이트를 절약 할 수 있습니다 var d = (n ....
Ian H.

@IanH. 모든 공백을 제거하는 것을 잊었습니다. -_- 지원 전화를받는 동안 응답을 얻는 것입니다.
TheLethalCoder

1

수학, 107 바이트

(t=Length[s=#&@@RealDigits[#]//.{a___, 0}:>{a}];If[IntegerPart@#==0,t++];t#+Tr[FromDigits@Table[#,t]&/@s])&

1

PHP, 78 88 +1 바이트

for($e=preg_match_all("#\d#",$n=$argn);~$c=$n[$i++];)$s+=str_repeat($c,$e);echo$s+$n*$e;

로 파이프로 실행하십시오 -nR.

PHP 7.1에서 경고가 발생할 수 있습니다. Repace $c,$e으로 $c>0?$c:0,$e수정합니다.


0

파이썬 3 , 68 70 73 77 바이트

lambda n:sum(float(n)+int(_*sum(x>"/"for x in n))for _ in n if"/"<_)

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

모든 자릿수 문자를 반복하고 전체 자릿수 문자로 반복하여이를 정수로 만든 다음에 추가합니다 n. 이 방법 nd합의 수평 부분과 수직 부분 인 숫자 반복과 함께 시간을 더합니다. 원래 사용 str.isdigit되었지만 >"/"이 스레드의 다른 사용자 덕분에 많은 바이트를 절약했습니다. n문자열로 사용하여 2 바이트를 절약 하지만 출력은 더 복잡합니다.

lambda n:sum(n+int(_*sum(x>"/"for x in str(n)))for _ in str(n)if"/"<_)

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

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