CodeGolf-지저분한 개발자 # 2 배리


11

이것은 CodeGolf 의 후속 조치입니다 -Barry 가 우리를 위해 더 악화시킨 유일한 문제 는 소음 # 1을 무시 하십시오. 무슨 일이 있었는지 보자

최신 정보

나는 내가 원하는 것을 잘 설명하지 못하기 때문에 임의의 입력과 예상 출력을 생성하는 코드를 추가했으며 때로는 단어보다 코드가 잘못되어 있다고 생각합니다 (항상 그렇지 않습니까?)

기술

Dumb Corp 의 API의 또 다른 방법은 공급자가 품목에 대해 제공하는 현재 가격, 최대 판매를 할 수있는 최적의 가격 및 이전 가격과 비교하여 해당 가격의 경향을 문자열 UP또는로 제공 DOWN합니다. 상점에서 품목을 제거해야하는지 아니면 기다려야하는지 결정해야합니다.

입력

80,90,UP
150,100,DOWN
65,65,UP
1618,1618,DOWN
840,1200,DOWN
54,12,UP
30,1,UP

예상되는 출력을 가진 거대한 입력 샘플 데모의 경우 브라우저 콘솔에 다음 코드 (js)를 입력하면 테스트를 위해 유효한 임의 입력이 출력됩니다.

var output = "";
var result = "";

for(i=10;i--;){
  var currentPrice = Math.floor(Math.random() * 10000) + 1;
  var optimalPrice = Math.floor(Math.random() * 10000) + 1;
  var tendency = Math.round(Math.random())?"UP":"DOWN";
  var tresult = "WAIT\n";

  if((currentPrice > optimalPrice && tendency == "UP") ||
     (currentPrice < optimalPrice && tendency == "DOWN")){
       tresult = "STOP\n";
     }

  output +=currentPrice+","+optimalPrice+","+tendency+"\n";
  result +=tresult;
}
console.log(output);
console.log(result);

언제나 그렇듯이 G입력 으로 변수 를 사용할 수 있지만, 언어로 입력을 쉽게 읽을 수 있다면 괜찮습니다. 형식은 일정하며 형식을 따릅니다.int,int,string

원하는 출력

당신은이 작업의 두뇌입니다. Barry는 서버에서이 계산을 수행해야합니다. 그러나 우리는 당신이 알고 있듯이 그를 믿을 수 없습니다. WAIT경향이 최적의 가격을 향하거나 STOP경향이 하락하는 경우 출력해야합니다 .

다시 말해, 80,90,UP입력으로, 현재 가격이 80이고 최적 가격이 90 인 제품이 올라가는 경향이 있음을 알고 있어야합니다 WAIT. 반면에, 840,1200,DOWN제품 가격이 내려 가고 최적의 가격이 높아짐에 따라을 출력하여 손실을 막아야 STOP합니다.

두 가격이 동일 WAIT하면 경향에 관계없이 출력 됩니다.

새 줄에있는 각 제품, 한 줄에 한 단어 씩 :

WAIT
WAIT
WAIT
WAIT
STOP
STOP
STOP

가능한 경우 구문을 보면 모든 것을 알 수 없으므로 코드가 작동하는지 확인하는 방법을 제공하십시오. 항상 가능한 한 적은 문자를 사용하고 다른 언어와 경쟁하지 않고 비슷한 구문을 가진 언어와 경쟁한다는 것을 기억하십시오.


테스트 결과는 예상 한 결과 없이는 크게 유용하지 않습니다.
찰스는

@NotthatCharles : 게시물의 원하는 출력 섹션의 블록이 입력 섹션의 테스트 데이터의 예상 결과라고 확신합니다.
Alex A.

나는 "거대한 입력 샘플"을 의미했다
Charles가 아니라

실제로 도움이되지 않았으므로 예상 출력을 제공하도록 코드를 업데이트했습니다.
Juan Cortés

5
캐릭터 점수를 선호하는 이유가 있습니까? 이 주변의 기본값은 바이트입니다 ( 참가자가 선택한 기존 인코딩). 문자를 사용하면 사람들이 코드를 유니 코드 문자 등으로 인코딩하여 압축합니다. (여러분의 선택이 무엇이든 지금 당장이 과제에 대해 변경하지 마십시오. 그러나 앞으로의 과제에 대해서는 염두에 두시기 바랍니다.)
Martin Ender

답변:


6

CJam, 31 29 27 자

"㫅㍸ꕆ敟鸢Ꝓ約䢫솓儓隆뻨"2G#b128b:c~

이것은 문자로 점수를 사용하기 위해 다음 코드의 인코딩 된 버전입니다.

r{',/:~3<)(f*~<"STOP""WAIT"?Nr}h

여기에서 모든 테스트 사례를 실행하십시오.

이 인코딩하여이를 단축 할 수있는 방법이 될 수 STOPWAIT,하지만 난 나머지 아주 행복 해요.

설명

코드는 한 번에 한 줄씩 읽고 처리 한 다음 줄 바꿈을 누른 후 다음 줄을 읽는 루프로 둘러싸여 있습니다. 루프는 일단 r빈 문자열을 반환합니다 (즉, 모든 줄이 처리 된 후). 이 비트입니다.

r{ ... Nr}h

각 줄을 처리하는 경우 대문자 문자가 CJam의 변수라는 사실을 사용하므로 일부 입력을 평가할 수 있습니다.

',/:~3<)(f*~<"STOP""WAIT"?
',/                        e# Split the input on commas.
   :~                      e# Eval each of the three resulting strings. The first two
                           e# will yield the prices, the third will dump a bunch of
                           e# values corresponding to the variables DNOPUW in the array.
     3<                    e# Truncate to three elements, so we only get the prices and
                           e# the values corresponding to U (0) and D (13).
       )(                  e# Slices off that variable value and decrement it, to get
                           e# something negative for UP and positive for DOWN.
         f*                e# Multiply both numbers by that value. So if we had UP then
                           e# both numbers will be negative now, otherwise they'll just
                           e# be scaled without affecting their relative size.
           ~<              e# Unwrap the array and check which element is larger.
             "STOP""WAIT"? e# Select the desired output string based on this boolean.

따라서 UP우리는 가격의 상대적인 크기를 뒤집어 결국 모든 불평등으로 단일 사례를 다룰 수 있습니다.


OP에서 설명을 요청했으며 코드가 여러 줄의 입력에서 작동해야한다고 말했습니다. 이를 달성하는 가장 짧은 방법은 다음과 같습니다."㫅㍸ꕆ敟鸢Ꝓ約䢫솓儓隆뻨"2G#b128b:c~
Dennis

@Dennis Ugh, 캐릭터 별 점수 ... 감사합니다.
마틴 엔더


4

펄, 77 73 바이트

while(<>){@p=split",";print($p[0]<$p[1]and$p[2]=~/D/?"STOP":"WAIT")."\n"}

작동 방식은 다음과 같습니다.

  • while(<>) 모든 줄을 파싱합니다.
  • @p=split","모든 쉼표로 나눕니다. 기본 Perl 연산자 $_(라인이 저장되는 위치)를 사용하고 있습니다.
  • print (ternary) 인쇄 대상을 결정합니다.
  • $p[0]<$p[1]and$p[2]=~/D/ 현재 가격이 원하는 가격보다 낮은 지 묻고 가격이 하락합니다 (D를 확인하여).
  • (condition)?(if):(else) 삼항 연산자입니다.
  • 조건이 이전에 일치하면을 출력 STOP합니다. 그렇지 않으면을 출력 WAIT합니다.

입력에 후행 줄 바꿈이 없다고 가정합니다. 후행 줄 바꿈은 추가를 생성합니다 WAIT.

4 바이트 절약에 도움을 준 Alex A.에게 감사합니다!


내가 Perl을 사용한 이후 꽤 오랜 시간이 걸렸지 만, 그래야 and합니까? 사용할 수 있습니까 &?
Alex A.

@AlexA. 왜 그런지 잘 모르겠지만 &&이상하게 행동합니다. 나는 그것을 사용하려고 시도했고, 그것은 "일치하지 않는 <>"이라고 말했다.
ASCIIThenANSI

허. 기묘한. 오 잘 좋은 해결책.
Alex A.

당신은 하나의 전화를 print하고 같은 것을 할 수 print((condition)?"STOP":"WAIT")."\n"있습니까?
Alex A.

@AlexA. 허, 그럴 줄 몰랐어 감사!
ASCIIThenANSI


3

R, 95 (108)

실제로 친구가 아닌 R과 문자열 :)

eval(parse(t=sub("U","<",sub("D",">",gsub("(.*),(.*),(.).*","cat(if(\\1\\3=\\2)'WAIT\n'else'STOP\n')",G)))))

입력은 문자형 벡터이며 G각 문자열을 if평가 되는 명령문 으로 변경합니다 .

편집 규칙에 대한 해석을 어지럽 혔습니다. 몇 문자 수정.

> G=c(
+     '80,90,UP',
+     '150,100,DOWN',
+     '65,65,UP',
+     '1618,1618,DOWN',
+     '840,1200,DOWN',
+     '54,12,UP',
+     '30,1,UP'
+ )
> eval(parse(t=sub("U","<",sub("D",">",gsub("(.*),(.*),(.).*","cat(if(\\1\\3=\\2)'WAIT\n'else'STOP\n')",G)))))
WAIT
WAIT
WAIT
WAIT
STOP
STOP
STOP
>

마지막 두 개가 왜 "wait"를 반환합니까? 그들은 "중지"를 제공해야합니다.
Oebele

@Oebele 나는 규칙을 오해했다. 더 높은 현재 가격이 내려가는 것은 분명하지 않았습니다. 곧 해결 될 것입니다
MickyT

3

루비-89 문자

G.split.map{|a|b,c,d=a.split(?,);puts (b.to_i>=c.to_i)^(e=d[2])&&(b!=c||e)?'STOP':'WAIT'}

루비 피들

bluetorange에 대한 도움으로!


새로운 동일한 테스트 사례에 적합합니까? 나는 또한 이와 같은 것을 시도했지만 그 테스트 사례 중 하나에 실패했습니다.
Oebele

@Oebele는 그것을 보지 못했습니다 ... 그들이 내 원본 뒤에 추가되었는지 확실하지 않지만 =지금은 감사를 추가했습니다 :)
RichieAHB

잠깐-왜 =내가 알고있는 것을 추가 하는 대신 많은 바이트를 사용하여 복잡한 해결 방법을 수행 했습니까? 고칠 시간입니다!
Oebele

이 경우를 설명 1618,1618,DOWN합니까?
nderscore

어쩌면 나는 바보이지만이 코드를 얻지 못합니다. 각 줄의 쉼표로 구분 된 3 개의 값 각각에 대해 첫 번째, 두 번째 및 네 번째 문자로 무언가를 수행하고 WAIT 또는 STOP을 인쇄하는 것 같습니다. 사용한 a.split.map{..}인쇄물 (3) WAIT이나 STOP각 입력 라인을. sth를 하시겠습니까? 좋아 b,c,d=a.split(?,)? 또한 !b[3][2]보다 짧지 만 b[3]=='UP'그래야한다고 생각 b[2]합니까? 문자열을 비교할 때는 >=주의를 기울여야 "9">="77"합니다. 기본 입력 줄 구분 기호는 \n이므로 split인수없이 사용할 수 있습니다 . ?\n보다 짧습니다 '\n'.
blutorange

3

파이썬 3, 89 84 82 바이트

for l in G:a,b,c=l.split(',');print('WSATIOTP'[a==b or(int(a)<int(b))^(c<'U')::2])

설명:

for l in G:                                   #For every line in G:
           a,b,c=l.split(',');                #Split the line into three strings.
                              print()         #Print the contained expression.

'WSATIOTP'                                    #'WAIT' and 'STOP' interleaved.
          [                              ::2] #Select every other character.
                or                            #If either expression is true, pick 'WAIT'
           a==b
                  (             )^(     )     #Select 'WAIT' if exactly one is true.
                   int(a)<int(b)              #If first number < second number.
                                   c<'U'      #If c is 'DOWN'

설명 할까?
Juan Cortés

@ JuanCortés 설명이 추가되었습니다.
TheNumberOne

1
아름답습니다.
Juan Cortés

2

Matlab, 100 90 바이트

내가 원하는만큼 작지 않습니다. 특히 부울에서 문자열로의 변환은 매우 깁니다. Octave로 전환하여 몇 바이트를 줄이려고 시도했지만 Octave에서는 아직 % c가 텍스트 스캔에 지원되지 않습니다.

B=textscan(G,'%f,%f,%c%s\n');xor(B{1}>=B{2},B{3}==85);C(a)={'STOP'};C(~a)={'WAIT'};char(C)

개인적으로 나는이 솔루션이 지금까지 split을 사용하지 않는 유일한 솔루션이라고 생각합니다 :)

편집 : 원래는 평등 상황을 너무 복잡하게 해결했습니다.


이것은 실제로 92 바이트입니다- 함수 호출 a=전에 비트 를 놓쳤습니다 xor. 그럼에도 불구하고 실제로 올바른 출력을 생성하지는 않습니다.
톰 카펜터

2

자바 스크립트 ECMAScript 6, 112b

var O="";for(let E of G.split("\n"))[A,B,C]=E.split(","),O+=("U"<C||-1)*(A-B)>0?"STOP\n":"WAIT\n";console.log(O)

ECMAScript 6 호환 브라우저에서만

설명

("U"<C||-1)*(A-B)>0?"STOP\n":"WAIT\n"

0이 참인지 묻는다면 거짓을 반환하므로 1에- UP, -1에 대해 말할 수 있다는 사실을 이용합니다 DOWN. 그런 다음 현재 가격과 최적 가격의 차이를 곱하여 두 부분 모두 0보다 큰 부분 에서 작동하도록합니다.

조건이 충족되면 STOP, 그렇지 않으면 (동일한 값 포함)을 반환WAIT

추가 골프가 필요합니다


2

자바 스크립트 ( ES6 ), 82 80 79 바이트

편집 : @ JuanCortés 곱셈 방법을 사용하여 -2

편집 : 곱셈 방법을 줄이기 위해 트릭을 사용하여 -1

alert(G.replace(/(.+),(.+),(.)+/g,(x,c,o,t)=>(c-o)*~{P:-2}[t]>0?'STOP':'WAIT'))

댓글 :

alert(                           // alert final output after replacement
    G.replace(/(.+),(.+),(.)+/g, // capture group for sections of each line
                                 // (.)+ captures only the last character
                                 // . doesn't match newlines, so this runs for each line
        (x,c,o,t)=>              // use a function to calculate each replacement string
            (c - o)              // calculate difference, negative for o>c
            *                    // multiply by
            ~{ P: -2 }[t]        // { P: -2 }[t] returns -2 for UP ('P') -2, else undefined
                                 // ~-2 => 1, ~undefined => -1
            > 0                  // if result > 0 (muplication of negatives or positives)
            ? 'STOP' : 'WAIT'    // return corresponding replacement string
    )
)

스 니펫 데모 :

function run(){
    G = input.value;
    /* start solution */
    alert(G.replace(/(.+),(.+),(.)+/g,(x,c,o,t)=>(c-o)*~{P:-2}[t]>0?'STOP':'WAIT'))
    /* end solution */
}
<textarea id="input" cols="25" rows="7">80,90,UP
150,100,DOWN
65,65,UP
1618,1618,DOWN
840,1200,DOWN
54,12,UP
30,1,UP</textarea><br />
<button id="run" onclick="run();">Run</button>

개정 이력 :

// 80
alert(G.replace(/(.+),(.+),(.)+/g,(x,c,o,t)=>(c-o)*(t>'N'||-1)>0?'STOP':'WAIT'))

// 82
alert(G.replace(/(.+),(.+),(.)+/g,(x,c,o,t)=>+c>o&t>'N'|+c<o&t<'P'?'STOP':'WAIT'))

논리를 설명 할까? 멋져 보이지만 무슨 일이 일어나고 있는지 전혀 모른다
Juan Cortés

@ JuanCortés 댓글이 달린 버전을 추가했습니다 :)
nderscore

건배! 이해 내가 않는
후안 코르테스

2

C-91 바이트

C는 어딘가에 있어야하기 때문에

"STOP"또는 "WAIT"를 출력할지 여부를 결정하는데도 @nutki 버전과 매우 유사 해 보입니다.

언 골프

main(i,j)
{
    char c[5];
    while(scanf("%i,%i,%s",&i,&j,c)+1)
        puts((j-i)*(*c-70)<0?"STOP":"WAIT");
}

골프

 main(i,j){char c[5];while(scanf("%i,%i,%s",&i,&j,c)+1)puts((j-i)*(*c-70)<0?"STOP":"WAIT");}

예전 것

Ungolfed-

int main()
{
    int i,j;
    char *c="";
    while(scanf("%i,%i,%s",&i,&j,c)+1)
    {
        if(i<j)
        {
            if(*c-68)
                printf("WAIT\n");
            else
                printf("STOP\n");
        }
        if(i>j)
        {
            if(*c-68)
                printf("STOP\n");
            else
                printf("WAIT\n");
        }
        if(i==j)
            printf("WAIT\n");
    }
    return 0;
}

Golfed

#define W printf("WAIT\n");
#define S printf("STOP\n");
int main(){int i,j;char *c="";while(scanf("%i,%i,%s",&i,&j,c)+1){if(i<j){if(*c-68)W else S}if(i>j){if(*c-68)S else W}if(i==j)W}return 0;}

계속 자르려고 노력 할게요


이 코드는 방금 중단됩니다. 당신은 필요 char c[4]대신 char *c=""(이 또한 짧다).
nutki

@nutki, 실제로 정의되지 않은 동작입니다. 충돌이 발생하지 않아도됩니다.
Spikatrix

@CoolGuy, 1 바이트의 읽기 전용 위치에 5 바이트를 씁니다. 이것이 segfault하지 않는 시스템이 있습니까?
nutki

@nutki-분명히 내 Windows PC에서 작동했습니다!
euanjt

@nutki, 참조? TheE의 시스템은 segfault를 던지지 않았습니다. 정의되지 않은 동작입니다. 한 시스템에서는 작동하지만 다른 시스템에서는 작동하지 않을 수 있습니다. 무슨 일이든 일어날 수 있습니다. 그러나 누가 신경 쓰나요? 프로그램이 그냥 "작업"을 필요로하므로 :) BTW, 그것은 안이 코드 골프입니다 char c[5]합니다 (1 개 공간 \0끝)?
Spikatrix

1

파이썬 3 - 108 106 102 97B

for l in G:a,b,c=l.split(',');s=int(a)-int(b);d=c<'E';print(['WAIT','STOP'][(s<0)*d+(s>0)*(1-d)])

진행중인 작업...

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