拡張真実マシン


17

多くの人々は、プログラミングにおける真実マシンとは何かを知っています。しかし、私たちが物事を一気に始める時です。拡張真実マシンの紹介!拡張真理値マシンは、整数nと空でない文字列の2つの入力を入力として受け取りますss 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

Haskell、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

Python 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は、ループが常に少なくとも1回実行されることを保証します。これは、の場合n=0nループの次の繰り返しでが負になるため、ループは永遠に実行され続けることを意味します。


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

05AB1E17 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_
エリックアウトゴルファー

@EriktheOutgolferありがとう、編集。
同志スパークルポニー

1

Cubix、41 四十の4 45バイト

入力を受け取ります <N> <String>

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

オンラインでお試しください!

判決:

      . 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 カウンターがゼロの場合、カウンターとEOIマーカーを削除して、永久出力ループを開始します。
    • ( 正の場合、カウンターをデクリメントします
  • <<q?/o()u出力ループ。これにより、EOIマーカー(-1)に達するまでスタックの各文字が出力されます。
  • ... _ ... ?wq!EOIマーカーの最後で、キューブを回ってに戻り?、レーンを変更し、EOIマーカーを一番下にドロップしてカウンターをテストします。
  • @ ゼロの場合、停止
  • ?u( 正のUターンとデクリメントの場合、thieはループの開始点に到達します
  • ? ... <) 負の場合、立方体を反対側に移動し、増分を渡しながらループの先頭にリダイレクトします。
  • /)< 負の増分で出力ループに進む場合

文字列が数字で始まる場合、これは機能しませんか?
破壊可能なレモン

@DestructibleLemon修正
-MickyT

0

JavaScript(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.
スティーブン

文字列PPCGを繰り返し警告します。(少なくとも)Chromeでは、ブラウザを停止して停止する必要があります。
リックヒッチコック

私はあなたの主張を理解しています。私のコードは、それをサポートするブラウザの末尾呼び出し再帰最適化を利用すると思います。
リックヒッチコック

console.logでテストします。エラーが発生します。
スティーブン

うーん、あなたは絶対に正しい:(
リックヒッチコック

0

JavaScript(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))}

-4、Arjunのおかげで-5バイト

リック・ヒッチコックのおかげで-3バイト

最初はJavaの回答とは異なりましたが、ゴルフの後すぐに非常によく似たものになりました。アラートは無限ですが、見た目を良くしたい場合はに切り替えconsole.logます。l=alert;書き込みのalert長さは同じですが、切り替えるとconsole.log短くなり、再定義されます。


1
while(!n)l(s)の代わりにif(!n)for(;;)l(s)
アルジュン

2
[...s].reverse()代わりにs.split''.reverse()
リックヒッチコック

@RickHitchcock私はいつもそれを忘れます:(
スティーブン

l(s.repeat(Math.abs(n)))for最後にループの代わりに。
アルジュン

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

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

オンラインでお試しください!


これは、完全なプログラムではなくスニペットのように見えますが、コミュニティのコンセンサスによって許可されていません。
エソランジングフルーツ

リンクした投稿によると、「デフォルトは「プログラムまたは関数」でなければなりません」。したがって、OPは完全なプログラムが必要であると明示的に述べていないため、回答を更新しました。現在はメソッドで構成されています。
内気なベルーガ

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バイト(134 #include<string.h>で前)

#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実行するRetinaコードを生成します。. 暗黙的な出力をオフにします(そうでない場合、文字列はn + 1回印刷されます)、-$2+繰り返しループを設定します{captureing group 2}回繰り返されます。最初のマイナスは、ループ内の収束機能を無効にし、最初の反復後に停止するため、数値を負の数値に変換します。>各ループの後に印刷するようにこのループを設定します。残りのコードは、単に文字列を出力することです。


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.