コードの最初のN文字を印刷します


21

N入力として正の整数を受け取り、Nコードの最初の文字を出力するプログラムまたは関数を作成する必要があります。場合Nあなたが周期的に出力をあなたのコードを継続すべきであるあなたのコードの長さよりも大きくなっています。

ソースコードの読み取り、およびファイル、stdioなどからの読み取りは禁止されています。

(コードがであると仮定yourcode

入力=>出力:

5=> yourc
10=> yourcodeyo
22=>yourcodeyourcodeyour

明確化

プログラムは少なくとも1バイトの長さが必要です。


15
2000回目のコードゴルフチャレンジの投稿おめでとうございます!:)
マーティンエンダー


1
@MartinBüttner実際、削除された[code-golf]質問は300個以上あります。しかし、十分に近い;)
ドアノブ

11
@MartinBüttnerありがとうございます。ラウンド数になるまでわずか48です!
randomra

5
たぶん、空のプログラムは無効であると明示的に述べたときでしょうか?
マーティンエンダー

回答:



10

> <>、49バイト

'3d*}r0ff+0i:&0(?.~~a*&"0"-+60.&~:?!;1-&:o}&" "0.

コードの半分は、入力を文字列からintに変換しています。代わりにSTDINから読み取られた単一の文字のコードポイントを使用できる場合、このプログラムは21バイトではるかに短くなります。

'3d*}ri:?!;1-&:o}&60.

説明

説明のために2番目のプログラムを使用します。

'文字列の解析を開始し、閉じ引用符が見つかるまですべての文字をプッシュします。行の残りの部分には'引用符がないため、イニシャル以外のすべての文字'がスタックにプッシュされます。

しかし、> <>はトロイダル2D言語です。そのため、行が終了すると、命令ポインターは先頭に戻り、'再度ヒットして文字列の解析を停止します。その結果、最初の引用を除く必要なすべてをプッシュしました。つまり、

3d*}ri:0=?;1-&:o}&60.

'ASCII 39なので、を押して最初の引用をプッシュし3d* = 3*13 = 39ます。次に、スタックを右にシフト(})および逆にシフト(r)して、次のようにします。

.06&}o:&-1;?=0:ir}*d3'

これで、印刷を開始する準備がすべて整いました。i入力の文字を読み込みますが、> <>文字は基本的に整数です。最初のプログラムでは、iは数字列をSTDINから整数に変換するループに置き換えられます。

次に、次のループを実行して、最初のN文字を出力します。

:?!;               If the top of the stack (N) is 0, then terminate
                   Otherwise...
1-                 Subtract 1 from N
&                  Move N to the register temporarily
:o                 Output the next char in the program
}                  Shift the stack right
&                  Put N back on the stack
60.                Repeat loop by jumping back to the first :

9

CJam、34 17 16バイト

これはたくさんゴルフできます。

{`"_~"+ri_@*<}_~

コード拡張

{`"_~"+ri_@*<}_~
{            }_~      "Put this code block on stack, take a copy and execute the copy";
 `                    "When executed, this block will the top element on stack to a string";
  "_~"                "Then put this string on stack";
      +               "Concat it to the the previous string on stack which ` created";
       ri             "Read an integer from STDIN";
         _@           "Copy the integer and put the concatinated string on top of stack";
           *          "Repeat the string input number of times";
            <         "Take the first input number of characters from the repeated string";

最後に、スタック上のすべてのものが自動的にSTDOUTに出力されます

こちらからオンラインでお試しください


5

Python 2、117バイト

b=input();a=lambda x:(b*(2*(x+chr(34))+')'))[:b];print a("b=input();a=lambda x:(b*(2*(x+chr(34))+')'))[:b];print a(")

人生のヒント:実行しないでくださいlist(itertools.cycle(x))。なんらかの理由で、その理由が想像できません。通訳がクラッシュします。


1
itertools.cycle()は無限のジェネレーターなので、コンピューターに無限のメモリがない限り、問題が発生します:)
Sp3000

5

JavaScript(ES6)、65 52 50 47 41 39

q=n=>('q='+q).repeat(n/39+1).slice(0,n)

ES6 repeat()を使用してコードを複製し、スライスします。ハードコーディングされた長さを使用します。


古いバージョン(50):

q=n=>n>(l=(t='q='+q).length)?t+q(n-l):t.slice(0,n)

関数を作成しq、単一のパラメーターを取得します。

関数のテキストを文字列化しn、テキストの長さよりも大きい場合、関数を再帰的に呼び出します。それ以外の場合は、テキストの部分文字列を返します。

非ES6バージョン(65):

function q(n){return t=q+'',l=t.length,n>l?t+q(n-l):t.slice(0,n)}

1
.repeat周期的な要件にES6ではなく再帰を使用することは、単に天才でした。
ジェイコブ

1
実際、それを使用repeat()することで束を削減できるように思えたので、代わりにそれを使用しました。
Scimonster

見えませんでした。とにかく-これは非常に良い答えです
ジェイコブ

なぜ/39+1?なぜ十分に長い文字列を残さないのですか?
l4m2

1
q=n=>('q='+q).repeat(n).slice(0,n)Firefoxで
正常に

5

J-24文字

単一の正の整数引数を取り、文字列を吐き出します。

($],quote)&'($],quote)&'

Jには自己参照のトリックはありませんので、私たちはそれを単純な方法で行います。爆発の説明:

  ],quote                 NB. right arg prepended to quotation of right arg (quine)
 $                        NB. cyclically take left-arg characters from that
(        )&'($],quote)&'  NB. preload right arg with  ($],quote)&

$J の2項演算子は、左に指定された次元に合うように右の引数からアイテムを周期的に取得します。ディメンションが単一の数値である場合、これは単純な1Dの文字のリストであるため、質問に正確に答えます。

tryj.tkで試してみてください。


quote動詞の一般的な目的は何ですか?
randomra

@randomra標準ライブラリでのその定義は''''&,@(,&'''')@(#~ >:@(=&''''))、または英語で「任意の'文字を2倍にしてから、最初と最後に1を追加します」です。JはAdaのような文字列リテラルを使用するため、文字列をエスケープします。
algorithmshark

4

k2-7文字

{x#$_f}

英語では、これは引数xが「xtake string self」である関数です。

  • Self(名詞_f)は、現在実行中の最も内側の関数です。ここが関数{x#$_f}です。
  • 文字列(monadic $)は、引数を文字列に変換します。関数の場合、関数の元の定義で文字列を作成します。
  • take(dyadic #)は、right-argのリストからleft-argアイテムを取ります。文字列の場合、アイテムは文字であるため、これはまさに私たちが望むことをしています。

これ、オープンソースのコナで機能しません。ブラックホールを作成し、それらをあらゆるものの引数として使用しようとするすべての試みを食い止めるためです。適切なk3セマンティクスはわかりませんが、おそらくそれほど親切ではありません。

Qでは、これは{x#string .z.s}k4 {x#2_$.z.s}です。2_母親だけが愛せる理由から、k4で2つの初期キャラクターをドロップするために使用する必要があります。


3

ルビー、66 64 63バイト

eval s=%q(puts"eval s=%q(#{s})".chars.cycle.take(gets.to_i)*'')

呼び出しを回避するために関数を使用するのと同じことgetsが少し長くなります(81バイト):

def f(i);eval s=%q(puts"def f(i);eval s=%q(#{s});end".chars.cycle.take(i)*'');end

同じのラムダバージョンは69バイトと65バイトです。

l=->i{eval s=%q(puts"l=->i{eval s=%q(#{s})}".chars.cycle.take(i)*'')}
->i{eval s=%q(puts"->i{eval s=%q(#{s})}".chars.cycle.take(i)*'')}

1
.cycleきちんとした、私はそれを覚えておく必要があります。:)あなたは、おそらく短縮することができます.join*''
マーティンエンダー

String#format補間の代わりに使用することにより、いくつかの文字を保存できますeval s="$><<('eval s=%p'%s).chars.cycle.take(gets.to_i)*''"
。– Ventero

3

Mathematica、65バイト

Print[StringTake[StringJoin @@ Table[ToString[#0], {#1}], #1]] & 

これを適切なクインにするためには、末尾のスペースも含めてすべてのスペースが必要です。これは純粋な関数であり、次のように使用できます。

Print[StringTake[StringJoin @@ Table[ToString[#0], {#1}], #1]] & [75]

印刷する

Print[StringTake[StringJoin @@ Table[ToString[#0], {#1}], #1]] & Print[Stri

残念ながら、ToString関数に適用しても関数を正確に入力した方法が得られないため、空白を削除#1#たり、関数呼び出しのプレフィックス表記を短縮したり使用したりして、これを短縮することはできません。


「短縮##1」?
地下

@undergroundmonorail逆に、ありがとう
マーティン・エンダー

3

MATLAB、319 141文字

私は元のものから数バイトを絞ることができました:

function d=g(n);d='gvodujpo!e>h)o*<e>(<e>\e)2;2:*.2-e-e)2:;foe*.2^<e>e)2,npe)1;o.2-252**<';d=[d(1:19)-1,d,d(19:end)-1];d=d(1+mod(0:n-1,141));

素晴らしい答え...!仕組みがわからない:
ルイスメンドー

3

JavaScript、34バイト

f=n=>n&&('f='+f+f(n-1)).slice(0,n)

コードを繰り返しn、結果をスライスする再帰関数。


3

Japt、2バイト

îî

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

î1つ目は、1つのパラメーターを取得し、それをlengthまで繰り返すnumberメソッドですn。最初の方法なのでn、入力になります。2番目îは文字列にキャストされ、繰り返されます。

これは以下に変換されます:

n.î("î")-> "î"長さに達するまで繰り返しますn

8バイトソリューション

îQi"îQi"

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

îQi"îQi" にトランスパイル n.î(Qi"îQi")

n.î(Qi"îQi")
      "îQi"    // String "îQi"          -> îQi
    Qi         // Insert "              -> îQi"
n.î            // Repeated to length n  -> îQi"îQi"îQi"  (n=12)

1
そのシンプルさが美しい!
シャギー

2

R、203バイト

N = 203の場合、コードは完全に印刷されます。

(f <- function(N){
str <- paste0("(f <- function(N)", paste0(as.character(body(f)), collapse = "\n"), ")}(", N, ")")
cat(rep(str, floor(N/nchar(str))), sep = "")
cat(substr(str, 1, N%%nchar(str)))})(203)

N = 50の場合、コードはそれ自体をトリミングします。

(f <- function(N){
str <- paste0("(f <- function(N

N = 300の場合、コードは部分的に繰り返されます。

(f <- function(N){
str <- paste0("(f <- function(N)", paste0(as.character(body(f)), collapse = "\n"), ")}(", N, ")")
cat(rep(str, floor(N/nchar(str))), sep = "")
cat(substr(str, 1, N%%nchar(str))))}(300)(f <- function(N){
str <- paste0("(f <- function(N)", paste0(as.character(body(f)), collapse = "\

これを試してみてください(f=function(N){s=paste0("(f=",paste0(capture.output(f),collapse=""),")");cat(rep(s,N%/%nchar(s)),substr(s,1,N%%nchar(s)),sep="")})(200)
トーマス

2

Matlab(57)

function s=f(n);s=evalc('type f');s=s(mod(1:n,nnz(s))+1);

最後の行の1(ではなく0)初期インデックスは、Matlabの関数typeが初期の改行を導入するためです。これは削除する必要があります。デニスの訂正(最後のインデックス)と提案(nnzより短い)に感謝しますnumel


これは私が期待すること(f(4)が 'fun'を返す)を実行しないのではないかと心配です。良いニュースは2文字を保存することで修正できることです。(を削除します-1)。-私はあなたにも二改行を削除して、入れ替えることができると思いnumelためnnz
デニスジャエルディン

@Dennisこれら2つのアイデアをありがとう!両方を組み込むように編集しました
ルイスメンドー

うーん、私はバズキルになりたくありませんが、ソースコードを何らかの方法で読み取り、ファイル、stdioなどから読み取るtype fという要件と衝突しませんか?
knedlsepp

@knedlseppあなたは正しいと思います。私もその疑いがありました。typeおそらくハードディスクにアクセスします。答えを削除する必要があると思いますか?
ルイスメンドー

@LuisMendo:誰も本当に気にしないと思う。:-)数日前にこれに似たクインを作成するのにすでに失敗していたので、昨日この問題に挑戦したかっただけです。もちろん、Matlabソリューションが既に存在するかどうかを確認する必要がありました。:-)最後に、これは私が十分に深く掘り下げて最終的に解決策を生み出すのに十分な動機を与えました。(私はmod-indexingのアイデアを途中で盗みました。)
knedlsepp

2

単項(1-8バージョン)、23855バイト

入力を '1'の単項として受け取り、コードは23855 '1's(,[.,])です


1
これは何の頭痛の種でもありますか?
DJMcMayhem

@DJMcMayhemそれは猫です
-l4m2

ここで、単項入力が意味をなす言語を見つけ、一部の1文字プログラムがcatを実行します
l4m2

2

Japt40 28バイト


"îR+Q+V+Q+R+V"
îR+Q+V+Q+R+V

初めてクインを書くので、これはおそらくかなり短くすることができます。一方で、私はそれがまったく機能するようになったことにとても満足しています。

意図的な先頭の改行、2行目はデータであり、残りの行はデータをラップ解除し、入力と同じ長さに達するまで結果の文字列全体を繰り返します。

Oliverのおかげで、なんと12バイトも削られました。

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


ニース:)、置き換えることができるtTU¯U、あなたが使用できるîの代わりにpフロントに移動することにより:オンラインそれを試してみてください
オリバー

考え直して、私はあなたがそれをまったくスライスする必要があるとは思わない。îR+Q+V+Q+R+Vうまく動作するはずです。
オリバー

@Oliverああ、それは賢い、私は知らなかった、それはî非常に便利です。どうもありがとう!
Nit

私はどちらかquinesとあまりにも良いではないが、私は考えて 、これは 24バイトのために働く必要があります。
シャギー

1

C ++、305

int L=305;string s="int main(){string t=\"string s=\";int n;cin>>n;t+=s;t+=\"\";\";t+=s;while(n>0){if(n>L){cout<<t;n-=L;}else{cout<<t.substr(0,n);}return 0;}";
int main(){string t="int L=305;string s=\"";int n;cin>>n;t+=s;t+="\";";t+=s;while(n>0){if(n>L){cout<<t;}else{cout<<t.substr(0,n);}n-=L;}return 0;}

説明 エスケープ文字を除き、他のすべての文字が出力されます。mainメソッドは文字列s内にあり、main内に完全な文字列が構築され、stdoutに出力されます


1

Pyth、15 13 14バイト

<jN*Q]"<jN*Q]"

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

標準のPyth quineの修正バージョン。


@ l4m2どうして?...私は何も間違って表示されていない、説明してください
hakr14

29 <jN*Q]"<jN*Q]<jN*Q]"<jN*Q]<jN間違っているべきですか?
l4m2

@ l4m2ああ、そうだね。私はそれを修正しました。
hakr14

<jN*Q]"<jN*Q]"動作しているようですか?
l4m2

ええ、私はそれを実現しました。助けてくれてありがとう!
hakr14

1

Hoon、185バイト

=/(f "=/(f k |=(n=@ =+((trim 5 f) `tape`(scag n `tape`(zing (reap n :(weld p <f> (slag 1 q))))))))" |=(n=@ =+((trim 5 f) `tape`(scag n `tape`(zing (reap n :(weld p <f> (slag 1 q))))))))

fプログラムのコードをテープとして設定しますが、それ自体は「k」です。変数5を設定して、文字5でテープを分割します[p=left q=right]。文字列p、元の文字列f、およびの最初の文字以降のすべてを結合しますq。その文字列を数n回繰り返してから、その最初のn文字を返します。

これを行うと、Hoonのstdlibがフォーマット関数や検索と置換を持たないため、わずかに妨げられました...また、scag型情報を保持する必要があるため、の後に別のキャストが必要な理由がわかりません。だからそうなるのです。




1

Gol> <>、12バイト

"r2ssIFLko|;

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

使い方

"r2ssIFLko|;

"..."   Push the chars in reverse order
r2ss    Reverse the stack, then push `"`
IF...|  Input n, and repeat the following n times...
  L     Push the loop counter (0 to n-1)
   k    Pop x and copy x-th from the top
    o   Pop and print as char
;       Halt

k 何度でもラップできるので、入力に応じてスタック全体を複製する必要はありません。


1

SmileBASIC、106 66バイト

INPUT N?MID$(("+CHR$(34))*3,23,N)INPUT N?MID$(("+CHR$(34))*N,23,N)

0

KSFTゴルフ -4文字、6バイト

KSFTgolfは、コードゴルフ用に設計しようとしている言語の場合。私はそれを大きく変えてきたので、これはおそらく実際に数えるべきではないでしょう。

☃\@2

これは何語ですか?リンクはありますか?スペック?説明..
オプティマイザー

@Optimizerああ、そうです。私はそれを忘れていました。これは、私がコードゴルフ用に設計してきた言語です。これは、最終的には(すべてのバグを修正した場合)実際に勝つことができる課題です。
KSFT

1
さらに、私が見る限り、言語は10分前に作成されたので、技術的には、これは非競合的な回答です:)。また、これはあなたのコードに対応するブロックであり、このチャレンジのために特別に行われたもののように見えます(ファイル全体に他のユニコードベースのコードブロックはないため)。
オプティマイザー

@Optimizerその命令は実際には以前の言語で行われていました(ただし、数日前に作成されたチャレンジが投稿された後に少し変更されたコミットがプッシュされました)。ただし、チャレンジが投稿されたときに公開されていた言語のバージョンではこれが機能しないと思うので、答えで述べたように、この答えは実際に数えられるとは思わない。
KSFT

4
雪だるまを作りたいですか?
flawr


0

J、41バイト

今、それは頭の体操だった!

((,quote,')$~'"_)'((,quote,'')$~''"_)')$~

説明:

((,quote,')$~'"_)'((,quote,'')$~''"_)')$~  | Expression taking 1 argument
                                       $~  | Reshape left argument to fit right, taking cyclically.
(                                     )    | One large expression that evaluates to a string
                 '((,quote,'')$~''"_)'     | String literal containing the code to the left of it
 (,quote,'$)~'"_)                          | A 4-Hook:
         '$)~'"_                           | The string '$)~'
   quote,                                  | Appended to the quoted version of the string
  ,                                        | Appended to the raw string

例:

   ((,quote,')$~'"_)'((,quote,'')$~''"_)')$~ 10
((,quote,'

   ((,quote,')$~'"_)'((,quote,'')$~''"_)')$~ 20
((,quote,')$~'"_)'((

   ((,quote,')$~'"_)'((,quote,'')$~''"_)')$~ 30
((,quote,')$~'"_)'((,quote,'')

   ((,quote,')$~'"_)'((,quote,'')$~''"_)')$~ 41
((,quote,')$~'"_)'((,quote,'')$~''"_)')$~

   ((,quote,')$~'"_)'((,quote,'')$~''"_)')$~ 50
((,quote,')$~'"_)'((,quote,'')$~''"_)')$~((,quote,


0

Java 10、193 176バイト

n->{var s="n->{var s=%c%s%1$c;s=s.format(s,34,s);for(int i=n;i>0;i/=176)s+=s;return s.substring(0,n);}";s=s.format(s,34,s);for(int i=n;i>0;i/=176)s+=s;return s.substring(0,n);}

説明:

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

n->{                       // Method with integer parameter and String return-type
  var s="n->{var s=%c%s%1$c;s=s.format(s,34,s);for(int i=n;i>0;i/=176)s+=s;return s.substring(0,n);}";
                           //  Unformatted source code
  s=s.format(s,34,s);      //  Create the formatted quine
  for(int i=n;i>0;         //  Loop `i` as long as it's not 0
      ;                    //    After every iteration:
       i/=176)             //     int-divide `i` by the hardcoded length of the source code
    s+=s;                  //   Exponentially enlarge the source code
  return s.substring(0,n);}//  Return the first `n` characters of the source code

-part:

  • var sは、未フォーマットのソースコードが含まれています。
  • %sを使用して、このStringをそれ自体に入力するために使用されますs.format(...)
  • %c%1$cおよびは34、二重引用符のフォーマットに使用されます。
  • s.format(s,34,s) すべてをまとめます。

チャレンジパート:

  • for(int i=n;i>n;i/=176)ループceil(n/176)回数。ここ176で、ソースコードの長さです。
  • s+=s;ソースコード文字列のサイズを指数関数的に増加させます。(にabなりababます;にababなりababababます;にababababなりababababababababます;など)
  • s.subtring(0,n);n文字列の最初の文字を受け取ります。


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