사실 후 액세서리!


10

이 도전은 수학에서 영감을 얻은 사실입니다. 프로그래밍이 아닙니다 .


계승 또는 사실에 대한 수학적 표기법 은 느낌표입니다 !. 느낌표는 not많은 프로그래밍 언어에서 공통 기호입니다 .

도전:

숫자와 문자를 포함하는 문자열 + !을 입력으로 사용하여 다음을 출력하십시오.

느낌표 앞의 모든 항목은 수학 표현식으로 평가되어야 2+2합니다 4.

하나의 느낌표 후 모든 부속품으로 추가해야하므로, 그것의 앞에 무엇을 : 2+2!5제공해야 45하기 때문에 2+2=4, 및 5부속품입니다. 2+2!5+5제공해야합니다 410.

이후 !도 뜻 not이야 아무것도 하지 사후 액세서리는해야 하지 추가 될 수있다. 그래서, 2+2!!5제공해야 4하기 때문에, 5액세서리가 아닙니다. 자, not(not(true))==true그래서 2+2!!!5주어야한다 45. 2+2!!5!5+5제공해야합니다 410때문에 2+2=4다음 요인과 그 다음 !5!5+5. 첫 번째 5는 사실이 아니라 5+5다른 느낌표 뒤에 있으며, 다시 한 번 사실입니다.

설명 :

  • 느낌표는 +양쪽에 인접하지 않습니다 .
  • +숫자에 대한 선행은 없습니다 ( 5, 아닙니다 +5).
  • 첫 번째 앞에있는 표현식의 결과 인 경우 앞에 0을 선택적으로 포함 할 수 있습니다 !. 모두 404입력 허용 출력 :0+0!4

요약 : 각 합계를 평가합니다 ( !구분자로 처리 ). 그런 다음 짝수 뒤에 나오는 모든 숫자를 버립니다 !(문자열의 시작부터 계산). 그런 다음 모두 제거합니다 !.

테스트 사례 :

!
   <- Empty string

5
5

12!
12

!87
87

!!5
   <- Empty string

5+5!2+2
104

5+5!!2+2
10

1!2!3!4!5!6!7!8!9
12468

10+10!!2+2!!3+3!4+4
208

2!!3!5
25

2!!3!5!7
25

10!!!!!!!5
105

이것은 이므로 바이트 단위의 가장 짧은 코드 (각 언어로)가 이깁니다! 설명을 강력히 권장합니다!


음 ... 우리가 2 !! 3! 5라고 말하면 5는 3의 액세서리입니까?
officialaimm

3
@officialaimm입니다 25(추가 된 테스트 사례 참조). 더 중요한 2!!3!5!7것은 여전히 왼쪽에 25짝수가 있기 때문 !입니다 7(따라서 숫자 앞에 런을 세는 것이 아니라 !왼쪽에 모두 있습니다).
Martin Ender 2012

출력은 Mathematica 일 수 Row있습니까?
ngenisis 2012

음 ...이 도전은 실제로 계승과 아무 관련이 없습니까?
DLosc

답변:



5

자바 스크립트 (ES6), 58 56 바이트

Martin Ender 덕분에 2 바이트를 절약했습니다 .

let f =
x=>x.replace(/[^!]+/g,eval).replace(/!(\d*)!?\d*/g,"$1")
<input value="2+2!5+5" oninput="try{O.value=f(value)}catch(e){}"><br>
<input id=O value="410" disabled>

어떻게 든 개선 될 수 있습니다 ...


에 함수 인수를 잘 사용했습니다 replace.
Neil

@ Neil 감사합니다,하지만 더 나은 방법을 찾았습니다 :-)
ETHproductions

코드 스 니펫이에 대한 잘못된 답변을 제공하고 1+1!5있습니다. 나는 당신이 eval전에 조금 잊었다 고 생각 합니다 !.
Value Ink

@ValueInk 아 젠장, 나는 그것을 고칠 수있는 쉬운 방법이 없다고 생각합니다.
ETHproductions

2

젤리 , 16 바이트

ṣ”!µḢW;m2$VṾ$L¡€

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

설명

여기서 중요한 관찰은 단계를 "순서대로"실행할 수 있다는 것입니다. 합계를 평가 한 다음 마음에 들지 않는 것을 무시하는 대신 유효하지 않은 위치의 합계를 무시한 다음 나머지를 평가할 수 있습니다.

ṣ”!µḢW;m2$VṾ$L¡€
ṣ”!                Split input on '!'
   µ               Set as the new default for missing arguments
    Ḣ              Take the first element, removing it from the default
     W;  $         Cons with
       m2            every odd-numbered element of {the tail of the !-split input}
               €   For each remaining element
          VṾ$      Evaluate and de-evaluate it
             L¡      a number of times equal to its length

합계 "10+10"를 평가하면 숫자 20로 평가됩니다 ( 예 : 문자열로 평가 해제) "20". 이 과정을 반복해도 추가 효과는 없습니다 (등등 성). 따라서 null 문자열을 제외하고 는 문자열의 모든 요소를 ​​효과적으로 평가하는데 , 길이가 0이므로 평가되지 않습니다.


이는 각 항목을 조건부로 평가하는 좋은 방법입니다. 어떻게 든 각 항목의 논리적 AND와 그 평가 된 가치를 취할 수 있습니까? (젤리에서는 빈 줄이 틀렸다고 가정합니다)
ETHproductions

@ETHproductions : Jelly의 암시로 인해 바이트를 절약 할 수는 없습니다. 가능한 경우 동일한 값을 두 번 사용하지 않는 것을 선호하고 값을 재사용하려면 일반적으로 적어도 µ어딘가에 여분을 추가 µ해야합니다 (루프 내에서 작동하지 않으므로 무언가가 필요함을 의미합니다) 더 자세한 정보). 나는 그것으로 작동하도록 ṣ”!µḢW;m2$ȧVṾ$$€만들었지 만 더 짧지는 않습니다 (그리고 제어 구조를 중첩하는 능력의 가장자리로 Jelly를 밀 때 발생할 수있는 달러 기호가

2

젤리 , 18 바이트

ṣ”!µḊm2;@ḢW$LÐfVṾ€

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

어떻게?

ṣ”!µḊm2;@ḢW$LÐfVṾ€ - Main link: string
ṣ”!                - split on '!' characters
   µ               - monadic chain separation (call that x)      e.g. ['1+1','0+0','0+0','0+0','','1+0','','','']
    Ḋ              - dequeue x (all but the leftmost entry of x) e.g.       ['0+0','0+0','0+0','','1+0','','','']
     m2            - modulo 2 index into that result             e.g.       ['0+0',      '0+0',   '1+0',   '']
           $       - last two links as a monad
         Ḣ         -     head x (the leftmost entry of x)        e.g.  '1+1'
          W        -     wrap                                    e.g. ['1+1']
       ;@          - concatenate with reversed arguments         e.g. ['1+1','0+0',      '0+0',   '1+0',   '']
             Ðf    - filter keep:
            L      -     length (keep that have non-zero length) e.g. ['1+1','0+0',      '0+0',   '1+0']
               V   - eval as jelly code (vectorises)             e.g. [  2,    0,          0,       1]
                      Yes, addition is just + and decimal numbers are just strings of digits in Jelly believe it or not!
                Ṿ€ - uneval €ach (creates a string from each one)e.g. [ '2',  '0',        '0'     ,'1']
                      without the € it would uneval the list and hence yield commas too)
                   - implicit print (prints the resulting list [of characters and possibly
                      lists of characters] as if it were all one string.)

나는 이것이 0+0입력의 중간에 (버려지지 않는 곳에서) 문자 그대로 작동한다고 생각하지 않습니다 . 숫자 0을 생성해야하지만 널 문자열을 생성합니다.

아, 사실-더 긴 해결책으로 옮겨야 할 것입니다 :(
Jonathan Allan

수정해야합니다 (지금 골프 가능).
Jonathan Allan


1

루비 , 58 56 + 1 = 59 57 바이트

-p플래그를 사용합니다 . -2에서 바이트 Tutleman .

i=0;$_=' '+$_;gsub(/!?([^!]*)/){eval$1if(2>i+=1)||i%2<1}

온라인으로 사용해보십시오! (추가 라인이 추가되어 모든 입력 라인을 취하고 다른 라인으로 출력을 인쇄합니다.)


나는 당신이 괄호를 떨어 뜨릴 수 있다고 생각합니다 eval$1.
Tutleman

@Tutleman 허. 나는 어떤 문제로 인해 Parens를 추가했는지 알지 못했지만 (프로그램 작성을 시작할 때 존재하지 않았 음) 실제로 떨어 뜨릴 수있는 것 같습니다.
Value Ink

0

배치, 192 184 바이트

@echo off
set/ps=
call:c . "%s:!=" "%"
echo(%s%
exit/b
:c
set s=
if not %2=="" set/as=%2
:l
shift
shift
if "%1"=="" exit/b
if %1=="" goto l
set/at=%1
set s=%s%%t%
goto l

빈 문자열을 처리해야하는 것은 불편합니다.


0

, 18 바이트

나는 이것이 가장 짧은 것이라고 생각하지만 ... 약 3 번의 반복도 말했지만.

{VaX++v%2+!v}Ma^'!

입력을 명령 행 인수로 사용합니다. 온라인으로 사용해보십시오!

설명

                    a is 1st cmdline arg; global variable v is -1 (implicit)
              a^'!  Split a on !
{           }M      Map this function to the resulting list (note that inside function,
                    a is the function arg):
    ++v              Increment v (so that v tracks the 0-based index of the current
                     element)
       %2            We want to keep the elements where v%2 is 1...
         +!v         ... and also v=0, where v%2 is 0, but adding !v makes it 1
  aX                 String-multiply the argument by the above quantity (turning elements
                     we don't want into empty string)
 V                   Eval it (eval'ing empty string gives nil, but that's okay because
                     nil doesn't output anything)
                    Autoprint the resulting list, concatenated together (implicit)

0

R, 95 바이트

function(x)for(e in strsplit(gsub('!([^!]*)![^!]*','\\1!',x),'!')[[1]])cat(eval(parse(text=e)))

아마도 개선의 여지가 있을지 모르지만 지금은 내가 생각해 낼 수있는 최선의 방법입니다.

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