Máy mở rộng sự thật


17

Nhiều người biết máy thật trong lập trình là gì. Nhưng đã đến lúc chúng ta đá mọi thứ lên một mức. Giới thiệu, cỗ máy sự thật mở rộng! Một cỗ máy sự thật mở rộng có hai thứ là đầu vào, một số nguyên nvà một chuỗi không trống s. Nó xuất s nthời gian với khoảng trắng theo dõi tùy chọn. Tuy nhiên, nếu nbằng 0, bạn phải xuất scho đến khi chương trình được dừng thủ công, tức là không bao giờ kết thúc.

Ngoài ra, nếu nlà một số âm, thì chuỗi cần phải được đảo ngược. Ví dụ với s=hellon=-1, đầu ra sẽ là olleh.

Phương pháp đầu vào tiêu chuẩn, bất kỳ loại đầu ra nào miễn là có thể xử lý vô hạn. Nếu bạn có câu trả lời không xử lý vô hạn, vui lòng đăng nó nếu nó thú vị hoặc bằng ngôn ngữ không thể xử lý đầu ra vô hạn.

Các trường hợp thử nghiệm

n, s, output

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

Đây là , vì vậy mã ngắn nhất sẽ thắng!

Đây là bài Sandbox gốc. Chỉnh sửa đã được thực hiện cho nó. Cảm ơn @ComradeSparklePony đã tạo ra ý tưởng cho thử thách này

Câu trả lời:


3

Haskell, 57 54 byte

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

Giải trình:

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

-3 byte nhờ @nimi


Bạn có thể sử dụng -nthay vì abs n.
nimi


2

MATL , 37 byte

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

Hãy thử trực tuyến!

Giải trình:

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

Python 3, 71 byte

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

Hãy thử trực tuyến!

Biến kđảm bảo vòng lặp luôn chạy ít nhất một lần. Điều này có nghĩa là nếu n=0, sau đó nsẽ âm trong lần lặp tiếp theo của vòng lặp, vì vậy vòng lặp sẽ tiếp tục được chạy mãi mãi.


1

Matlab, 87 byte

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

Nỗ lực đầu tiên của tôi tại code-golf! Bất kỳ đề nghị cho chơi golf đều được chào đón.


Chào mừng đến với trang web! :)
DJMcMayhem

1

05AB1E , 17 16 14 byte

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

Hãy thử trực tuyến!

Giải trình:

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.

Đã lưu 2 byte nhờ @EriktheOutgolfer


Bạn có thể thay thế '-åbằng 0‹0Qvới _.
Erik the Outgolfer

@EriktheOutgolfer Cảm ơn, đã chỉnh sửa.
Đồng chí SparklePony

1

Cubix , 41 Bốn mươi bốn 45 byte

Đưa đầu vào là <N> <String>

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

Hãy thử trực tuyến!

Lập thể

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

Xem nó chạy

Vẫn còn một lượng no-op trong mã mà tôi có thể lấy thêm một vài byte, nhưng muốn lấy nó trước khi tôi phá vỡ nó.

Thủ tục cơ bản là

  • I lấy bộ đếm từ đầu vào
  • A lấy phần còn lại của đầu vào dưới dạng ký tự
  • ;p? loại bỏ không gian, đưa số lên và kiểm tra nó
    • psuqB$)nếu bộ đếm âm, đảo ngược ngăn xếp. Điều này liên quan đến việc xử lý số đầu vào và điểm đánh dấu EOI (-1). Tăng số lượt truy cập.
    • ;p;ouqu nếu bộ đếm bằng 0, hãy loại bỏ bộ đếm và điểm đánh dấu EOI và bắt đầu vòng lặp đầu ra vĩnh viễn.
    • ( nếu giảm tích cực truy cập
  • <<q?/o()uvòng lặp đầu ra. Điều này sẽ xuất ra từng ký tự của ngăn xếp cho đến khi đạt đến điểm đánh dấu EOI (-1).
  • ... _ ... ?wq!trên điểm đánh dấu EOI cuối, đi xung quanh khối lập phương và phản xạ trở lại ?, thay đổi làn đường, thả điểm đánh dấu EOI xuống phía dưới và kiểm tra bộ đếm.
  • @ nếu không, dừng lại
  • ?u( nếu bạn quay đầu và giảm giá trị tích cực, cuối cùng bạn sẽ đánh vào đầu vòng lặp
  • ? ... <) nếu âm tính, đi xung quanh khối tới các khối khác, chuyển hướng đến đầu vòng lặp trong khi vượt qua gia số.
  • /)< nếu tăng âm và tiếp tục vòng lặp đầu ra

điều này không hoạt động nếu chuỗi bắt đầu bằng một số?
Lemon phá hủy

Đã sửa lỗi @DeststallibleLemon
MickyT

0

JavaScript (ES6), 79 byte

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

Đoạn trích:

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")


Tôi đã cố gắng làm một cái gì đó đệ quy như thế này, nhưng tôi đã không nghĩ đến !n&&việc lặp đi lặp lại vô tận. Tuy nhiên, điều này sẽ đạt được một StackOverflow cuối cùng? it should never terminate.
Stephen

Nó sẽ cảnh báo chuỗi PPCG nhiều lần. Trong Chrome (ít nhất), tôi phải tắt trình duyệt để dừng trình duyệt.
Rick Hitchcock

Tôi hiểu quan điểm của bạn. Tôi nghĩ rằng mã của tôi sẽ tận dụng tối ưu hóa đệ quy cuộc gọi đuôi trong các trình duyệt hỗ trợ nó.
Rick Hitchcock

Kiểm tra nó với console.log. Tôi nhận được một lỗi.
Stephen

Hmm, bạn hoàn toàn chính xác: (
Rick Hitchcock

0

JavaScript (ES6), 98 94 91 83 byte

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

-4, -5 byte nhờ Arjun

-3 byte nhờ Rick Hitchcock

Bắt đầu khác với câu trả lời Java , nhưng nhanh chóng trở nên rất giống nhau sau khi chơi golf. Thông báo là vô hạn, nhưng nếu bạn muốn nó trông đẹp, hãy chuyển sang console.log. l=alert;và viết ra alertcó cùng độ dài, nhưng nếu bạn chuyển sang console.logngắn hơn để xác định lại.


1
while(!n)l(s)thay vì if(!n)for(;;)l(s).
Arjun

2
[...s].reverse()thay vìs.split''.reverse()
Rick Hitchcock

@RickHitchcock Tôi luôn quên điều đó :(
Stephen

l(s.repeat(Math.abs(n)))thay vì forvòng lặp cuối cùng.
Arjun

0

QBIC , 36 byte

Rất nhiều điều thú vị ở đây và QBIC / QBasic không có cú pháp để xử lý các điều kiện như vậy một cách thanh lịch.

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

Giải trình:

~:<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

Java (OpenJDK 8) , 137 byte

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]);}

Hãy thử trực tuyến!


Điều này trông giống như một đoạn trích chứ không phải là một chương trình đầy đủ, không được sự đồng thuận của cộng đồng .
Esolanging Fruit

Theo bài đăng bạn đã liên kết, "Mặc định phải là 'chương trình hoặc chức năng'" . Do đó, vì OP không tuyên bố rõ ràng rằng họ muốn có một chương trình đầy đủ , tôi đã cập nhật câu trả lời của mình. Bây giờ nó bao gồm một phương pháp .
Bashful Beluga

0

str , 30 byte

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

Hãy thử trực tuyến!

Giải trình

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 byte

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));}

Hãy thử trực tuyến!

Ai nói, chúng ta cần strlen?

C (gcc) , 115 byte (134 có #include<string.h>ở phía trước)

#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));}

Hãy thử trực tuyến!

Không có #include<string.h>chúng tôi nhận được một nguyên mẫu ngầm cho strlenlợi nhuận đó int, nhưng strlensize_t(ít nhất là ngày nay, không hoàn toàn chắc chắn về k & r hoặc c89, nhưng tôi tin rằng, nó đã trở lại intvào thời xưa).

Thiếu #include <stdio.h>không phải là một vấn đề, bởi vì quảng bá số nguyên, nguyên mẫu mặc định sẽ int putchar(int)là chính xác những gì chúng ta muốn.


0

Võng mạc , 49 byte

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

Định dạng đầu vào: lấy trong chuỗi, theo sau là một dòng mới, theo sau là số.

Hãy thử trực tuyến!

Giải trình:

/¶-/&V`^.+

Chỉ /¶-/&chạy dòng này nếu số âm. Vlà giai đoạn đảo ngược và nó đảo ngược ^.+, khớp với chuỗi ( .khớp với mọi ký tự ngoài dòng mới).

/¶0/&//+>G0`

Dòng /¶0/&này chỉ chạy nếu số là 0. //+>bắt đầu một vòng lặp vô hạn, nó in chuỗi làm việc sau mỗi lần lặp. G0lấy chuỗi và loại bỏ số; nó làm điều này vô tận, in mọi lúc.

~`...

Mã này đánh dấu sẽ tạo ra một chuỗi; chương trình đánh giá chuỗi dưới dạng mã Retina sau.

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

(.+)¶-*(\d+)khớp với toàn bộ chuỗi và đặt chuỗi vào bắt nhóm 1 và số trong bắt nhóm 2. .-$2+>K` $1tạo mã Retina để chạy: . tắt đầu ra ẩn (nếu không chuỗi sẽ được in n + 1 lần), -$2+đặt vòng lặp lặp lặp đi lặp lại trong {chụp nhóm 2} lần. Điểm trừ ở đầu biến số thành số âm, vì điều này vô hiệu hóa chức năng hội tụ trong vòng lặp, sẽ dừng số đó sau lần lặp thứ nhất. >đặt vòng lặp này để in sau mỗi lần lặp. Phần còn lại của mã chỉ là để in chuỗi.


Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.