확장 진실 기계


17

많은 사람들이 프로그래밍 의 진실 기계 가 무엇인지 알고 있습니다. 그러나 우리가 일을 시작하는 시간입니다. 확장 된 진실 기계를 소개합니다! 확장 된 진리 머신은 정수 n와 비어 있지 않은 문자열 두 가지를 입력으로받습니다 s. s n선택적인 후행 공백으로 시간을 출력 합니다. 그러나와 n같으면 프로그램을 수동으로 중지 할 때까지 0출력해야합니다 s. 즉, 절대 종료되지 않아야합니다.

또한 n음수이면 문자열을 바꿔야합니다. 예를 들어 s=helloand를 사용 n=-1하면 출력은입니다 olleh.

무한 입력을 처리 할 수있는 한 표준 입력 방법. 무한히 처리되지 않는 답변이 있다면, 흥미 있거나 무한한 출력을 처리 할 수없는 언어라면 자유롭게 게시하십시오.

테스트 사례

n, s, output

5, "hello world", "hello worldhello worldhello worldhello worldhello world"
0, "PPCG", "PPCGPPCGPPCGPPCG..."
-2, "truThY", "YhTurtYhTurt"
2000, "o", "oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo"

이것은 이므로 가장 짧은 코드가 승리합니다!

여기에 원래의 샌드 박스 포스트입니다. 수정되었습니다. 이 도전에 대한 아이디어를 만들어 주신 @ComradeSparklePony에게 감사드립니다.

답변:


3

하스켈, 57 54 바이트

f 0=cycle
f n|n<0=f(-n).reverse|n>0=concat.replicate n

설명:

f 0           -- If n=0 ..
 =cycle       -- infinitely repeat the input
f n|n<0       -- Otherwise, if n<0 ..
 =f(-n)       -- call f with the negative of n ..
 .reverse     -- and the reverse of the input
 |n>0         -- Finally, if n>0 ..
 concat       -- concatenate the result of ..
 .replicate n -- repeating the input n times

@nimi 덕분에 -3 바이트


-n대신 사용할 수 있습니다 abs n.
nimi


2

MATL , 37 바이트

jXJiXI0=?`1wtwDw]}I0>?I:"t]x}PI|:"t]x

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

설명:

j            % input string
XJ           % copy to clipboard J
i            % input
XI           % copy to clipboard I
0            % number literal
=            % is equal? (element-wise, singleton expansion)
?            % if
  `          % do...while
    1        % number literal
    w        % swap elements in stack
    t        % duplicate elements
    w        % swap elements in stack
    D        % convert to string and display / string representation
    w        % swap elements in stack
  ]          % end
}            % else
  I          % paste from clipboard I
  0          % number literal
  >          % is greater than? (element-wise, singleton expansion)
  ?          % if
    I        % paste from clipboard I
    :        % range; vector of equally spaced values
    "        % for
      t      % duplicate elements
    ]        % end
    x        % delete
  }          % else
    P        % flip the order of elements
    I        % paste from clipboard I
    |        % absolute value / norm / determinant
    :        % range; vector of equally spaced values
    "        % for
      t      % duplicate elements
    ]        % end
    x        % delete
             % (implicit) end
             % (implicit) end
             % (implicit) convert to string and display

1

파이썬 3, 71 바이트

def f(n,s,k=1):
 if n<0:s=s[::-1];n=-n
 while n|k:print(end=s);n-=1;k=0

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

변수 k는 루프가 항상 한 번 이상 실행되도록 보장합니다. 이 방법은 만약 것으로 n=0, 다음 n루프가 영원히 실행하는 것, 그래서 루프의 다음 반복에 음수가 될 것입니다.


1

Matlab, 87 바이트

n=input('')
s=input('','s')
a=repmat(s,1,abs(n))
while~n s=[s s]
end
if n<0,flip(a)
end

코드 골프에 대한 나의 첫 번째 시도! 골프에 대한 제안은 환영합니다.


사이트에 오신 것을 환영합니다! :)
DJMcMayhem

1

05AB1E , 17 16 14 바이트

0‹iR}¹Ä×¹_i[²?

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

설명:

0‹iR}¹Ä×¹_i[²?
0‹             Is the input negative?
  iR}          If so, reverse the second input.
     ¹Ä        Get the absolute value of the first input.
       ×       Repeat the string that many times.
        ¹_     Boolean NOT the first input. (Is the first input 0?)
          i    If so...
           [   Do forever...
            ²? Print the second input without a newline.

@EriktheOutgolfer 덕분에 2 바이트 절약


당신은 대체 할 수 '-å0‹0Q함께 _.
Outgolfer Erik

@EriktheOutgolfer 감사합니다. 편집했습니다.
스파클 포니 동지

1

Cubix , 41 45 개의 45 바이트

다음과 같이 입력을받습니다. <N> <String>

.uq.sB.p$IA;p?;ouu(..!q/o()uq?..@<w?q<<_)

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

Cubified :

      . u q
      . s B
      . p $
I A ; p ? ; o u u ( . .
! q / o ( ) u q ? . . @
< w ? q < < _ ) . . . .
      . . .
      . . .
      . . .

실행중인 것을보십시오

코드에 여전히 몇 가지 바이트를 더 얻을 수있는 코드가 없지만 중단하기 전에이를 원했습니다.

기본 절차는

  • I 입력으로부터 카운터를 얻다
  • A 나머지 입력을 문자로 사용
  • ;p? 공간을 제거하고 숫자를 가져 와서 테스트하십시오.
    • psuqB$)카운터가 음수이면 스택을 뒤집습니다. 여기에는 입력 번호와 EOI 마커 (-1) 처리가 포함됩니다. 카운터를 증가시킵니다.
    • ;p;ouqu 카운터가 0이면 카운터와 EOI 마커를 제거하고 영구 출력 루프를 시작하십시오.
    • ( 카운터가 양수 감소하면
  • <<q?/o()u출력 루프 EOI 마커 (-1)에 도달 할 때까지 스택의 각 문자를 출력합니다.
  • ... _ ... ?wq!EOI 마커가 끝나면 큐브 주위를 돌아 다니며, ?차선 변경, EOI 마커를 바닥에 놓고 카운터를 테스트하십시오.
  • @ 0이면 중단
  • ?u( 양의 U 턴과 감소하면 루프 시작 부분에 도달합니다.
  • ? ... <) 음수이면 큐브를 다른쪽으로 이동하고 증가분을지나면서 루프의 시작 부분으로 리디렉션합니다.
  • /)< 음의 증분 인 경우 출력 루프로 진행

문자열이 숫자로 시작하면 작동하지 않습니까?
파괴 가능한 레몬

@DestructibleLemon 수정 됨
MickyT 2016 년

0

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

 f=(n,s)=>n<0?f(-n,[...s].reverse().join``):(alert(!n?s:s.repeat(n)),!n&&f(n,s))

단편:

f=(n,s)=>n<0?f(-n,[...s].reverse().join``):(alert(!n?s:s.repeat(n)),!n&&f(n,s))

f(5, "hello world")
//f(0, "PPCG")  //uncomment this at your peril!!!
f(-2, "truThY")
f(2000, "o")


나는 이런 식으로 재귀를 시도했지만 !n&&무한 반복을 생각하지 않았습니다 . 그러나 이것이 결국 StackOverflow에 도달합니까? it should never terminate.
Stephen

문자열 PPCG에 반복해서 경고합니다. 적어도 Chrome에서는 브라우저를 중지해야 브라우저를 중지해야합니다.
Rick Hitchcock

나는 당신의 요점을 이해합니다. 내 코드는 그것을 지원하는 브라우저에서 tail call recursion 최적화를 활용할 것이라고 생각합니다.
Rick Hitchcock

console.log로 테스트하십시오. 오류가 발생합니다.
Stephen

흠, 당신은 절대적으로 맞습니다 : (
Rick Hitchcock

0

자바 스크립트 (ES6), 98 94 91 83 바이트

n=>s=>{s=n<0?[...s].reverse().join``:s;while(!n)l(s);l(s.repeat(n<0?-n:n))}

Arjun 덕분에 -4, -5 바이트

Rick Hitchcock 덕분에 -3 바이트

자바 답변 과 는 다른 시작 했지만 골프 후 빠르게 비슷해졌습니다. Alert는 무한하지만 멋지게 보이려면로 전환하십시오 console.log. l=alert;쓰고 쓰는 alert길이는 같지만 console.log다시 바꾸면 짧아집니다.


1
while(!n)l(s)대신에 if(!n)for(;;)l(s).
Arjun

2
[...s].reverse()대신s.split''.reverse()
Rick Hitchcock

@RickHitchcock 나는 항상 잊어 버린다 :(
Stephen

l(s.repeat(Math.abs(n)))for마지막 에 루프 대신 .
Arjun

0

QBIC , 36 바이트

여기에 많은 문제가 있으며 QBIC / QBasic에는 그러한 조건을 우아하게 처리 할 수있는 구문이 없습니다.

~:<0|;=_fA}[abs(a)|Z=Z+A]~a|_X}{?A';

설명:

~:<0|       IF cmd line arg 'a' is negative
  ;=_fA         Make cmd line arg A$ into its reverse
}           Close the IF (this eliminates the need for a | fuction terminator on _f)
[abs(a)|    FOR b = 1 to (abs(a) (hammering out negatives)
  Z=Z+A         Add A$ to Z$ (on exit, Z$ is printed explicitly)
]           NEXT
~a|_X       IF a is non-zero, terminate the program
}           END IF
{?A';       If we're here, just start a DO-loop and keep on printing the input.

0

자바 (OpenJDK 8) 137 바이트

void f(String[] a){for(long n=Long.valueOf(a[0]),i=0;n==0|i++<Math.abs(n);)System.out.print(n<0?new StringBuilder(a[1]).reverse():a[1]);}

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


이것은 전체 프로그램이 아닌 스 니펫처럼 보입니다 . 커뮤니티 합의에 의해 허용되지 않습니다 .
Esolanging 과일

링크 한 게시물에 따르면 "기본값은 '프로그램 또는 기능'이어야합니다 . " 따라서 OP는 전체 프로그램 을 원한다고 명시 적으로 밝히지 않았으므로 답변을 업데이트했습니다. 이제 방법으로 구성됩니다 .
Bashful Beluga 2016 년

0

str , 30 바이트

I#Lbd0<[_u_][d0='e'u#?]#?xo;db

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

설명

I#Lbd0<[_u_][d0='e'u#?]#?xo;db
...........................;      preamble
I                                 read number
 #L                               read rest of STDIN
   b                              buffer the STDIN
    d                             duplicate number
     0<[   ]           #?         if the number is less than zero
        _                         negate that number
         u_                       and reverse STDIN from buffer
            [         ]           otherwise
             d0='e  #?            if its 0, push the empty string
                  'u              otherwise, push the unbuffered STDIN untouched
                         x        repeat STDIN by the TOS
                          o       and output
                           ;..    main program (only activates when input = 0)
                            d     duplicate the implicitly unbuffered STDIN
                             b    and rebuffer it
                                  implicitly displayed

0

C (GCC) , 115 (112) 109 107 104 바이트

f(n,s,l,p,d)char*s;{d=n<0?-1:1;do for(l=1,p=0;p>=0;p+=l)s[p]?d==l&&putchar(s[p]):l--;while(!n||(n-=d));}

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

누가 우리가 필요하다고 strlen했습니까?

C (gcc) , 115 바이트 ( #include<string.h>앞에있는 134 )

#include<string.h>
f(n,s)char*s;{int l=strlen(s),d=n<0?0:2,m=d--,p;do for(p=m?0:l-1;p!=(m?l:-1);p+=d)putchar(s[p]);while(!n||(n-=d));}

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

#include<string.h>우리가 없이는strlen 그 수익을 int하지만, strlen이다 size_t(적어도 요즘, 아니 완벽하게 확인 K & R 또는 C89에 대해,하지만 난 생각이 반환 int옛날에).

#include <stdio.h>정수 승격으로 인해 기본 프로토 타입 int putchar(int)이 정확히 원하는 것이므로 누락 이 문제가되지 않습니다 .


0

망막 , 49 바이트

/¶-/&V`^.+
/¶0/&//+>G0`
~`(.+)¶-*(\d+)
.-$2+>K`$1

입력 형식 : 문자열을 입력 한 다음 줄 바꿈, 숫자를 입력합니다.

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

설명:

/¶-/&V`^.+

/¶-/&숫자가 음수 인 경우에만이 줄을 실행합니다. V는 역 단계이며 역으로 바뀌며 ^.+, 이는 문자열과 일치합니다 (줄 .바꿈을 제외한 모든 문자와 일치).

/¶0/&//+>G0`

/¶0/&수가 0 인 경우에만이 광고를 실행 //+>각 반복 후에 작동 문자열을 인쇄하는 무한 루프를 시작한다. G0문자열을 받아서 숫자를 버립니다. 매번 인쇄 할 때마다이 작업이 무한대로 수행됩니다.

~`...

문자열을 생성하는 코드를 표시합니다. 프로그램은 문자열을 Retina 코드로 평가합니다.

(.+)¶-*(\d+)
.-$2+>K`$1

(.+)¶-*(\d+)전체 문자열과 일치하고 문자열을 캡처 그룹 1에, 숫자를 캡처 그룹 2에 넣습니다 .-$2+>K.`$1 실행되는 망막 코드를 생성하는 : . (그렇지 않으면 문자열이 인쇄 될 것 N + 1 회) 떨어져 암시 출력을 전환, -$2+반복 루프를 설정합니다 {capturing group 2} 번 반복됩니다. 처음의 마이너스는 숫자를 음수로 바꿉니다. 이는 루프에서 수렴 기능을 비활성화하여 첫 번째 반복 후에는 수렴 기능을 중지시킵니다. >반복 할 때마다이 루프가 인쇄되도록 설정합니다. 나머지 코드는 문자열을 인쇄하는 것입니다.


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