Wydrukuj pierwsze N ​​znaków swojego kodu


21

Powinieneś napisać program lub funkcję, która Njako wartość wejściową przyjmuje dodatnią liczbę całkowitą i wypisuje pierwsze Nznaki kodu. Jeśli Njest większa niż długość kodu, powinieneś cyklicznie wypisywać kod.

Czytanie kodu źródłowego w jakikolwiek sposób i czytanie z pliku, standardu itp. Jest niedozwolone.

Przykłady

(zakładając, że masz kod yourcode)

Dane wejściowe => Dane wyjściowe:

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

Wyjaśnienie

Twój program powinien mieć co najmniej 1 bajt.


15
Gratulujemy opublikowania 2000. golfowego wyzwania golfowego! :)
Martin Ender

3
Douglas Hofstadter pokochałby to!
Luis Mendo,

1
@ MartinBüttner W rzeczywistości istnieje ponad 300 usuniętych pytań [code-golf]. Ale wystarczająco blisko;)
Klamka

11
@ MartinBüttner Dziękuję. Tylko 48, aby przejść do okrągłej liczby!
randomra

5
Może nadszedł czas, aby wyraźnie wspomnieć, że puste programy są nieprawidłowe?
Martin Ender

Odpowiedzi:



10

> <> , 49 bajtów

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

Połowa kodu konwertuje dane wejściowe z ciągu na wartość int. Jeśli wolno nam zamiast tego użyć punktu kodowego pojedynczego znaku odczytanego ze STDIN, wówczas ten program byłby znacznie krótszy przy 21 bajtach:

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

Wyjaśnienie

Dla wyjaśnienia użyję drugiego programu.

'rozpoczyna parsowanie ciągów, wypychając każdy znak, aż do znalezienia cytatu zamykającego. Ponieważ reszta linii nie ma 'cudzysłowu, każdy znak oprócz początkowej 'jest wypychany na stos.

Ale> <> to toroidalny język 2D, więc po przekroczeniu linii wskaźnik instrukcji wraca do początku, uderzając 'ponownie i przerywa parsowanie łańcucha. Rezultat jest taki, że wypchnęliśmy wszystko, co niezbędne, z wyjątkiem wstępnego cytatu, a mianowicie

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

'jest ASCII 39, więc popychamy początkowy cytat, popychając 3d* = 3*13 = 39. Następnie przesuwamy stos w prawo ( }) i wstecz ( r), dając:

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

Teraz wszyscy jesteśmy przygotowani do rozpoczęcia drukowania. iczyta znak wejściowy, ale znaki> <> są w zasadzie liczbami całkowitymi. W pierwszym programie izamieniono go na pętlę, która konwertuje ciąg cyfr ze STDIN na liczbę całkowitą.

Następnie wykonujemy następującą pętlę, aby wydrukować pierwsze N ​​znaków:

:?!;               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 bajtów

Można w to dużo grać w golfa ..

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

Rozszerzenie kodu :

{`"_~"+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";

Na koniec wszystko na stosie jest automatycznie drukowane do STDOUT

Wypróbuj online tutaj


5

Python 2, 117 bajtów

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

Protokół życia: nie wykonuj list(itertools.cycle(x)). Z jakiegoś powodu nie wyobrażam sobie, dlaczego powoduje awarię tłumacza.


1
itertools.cycle()jest nieskończonym generatorem, więc jeśli twój komputer nie ma nieskończonej pamięci, będziesz mieć problemy :)
Sp3000 26.01.2015

5

JavaScript (ES6), 65 52 50 47 41 39

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

Używa ES6 repeat()do klonowania kodu, a następnie wycina. Używa zakodowanej długości.


Stara wersja (50):

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

Tworzy funkcję q , biorąc pojedynczy parametr.

Ciąg znaków tekstu funkcji i rekurencyjnie wywołuje funkcję, jeśli njest większa niż długość tekstu. W przeciwnym razie zwraca podłańcuch tekstu.

Wersja inna niż ES6 (65):

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

1
stosowanie rekurencji zamiast ES6 .repeat, ponieważ wymagania cykliczne były po prostu genialne.
Jakub

1
Właściwie wygląda na to, że użycie opcji repeat()umożliwiło mi wycięcie go, więc użyłem tego zamiast tego.
Scimonster,

Nie widziałem tego. W każdym razie - to bardzo ładna odpowiedź
Jacob

dlaczego /39+1? dlaczego nie zostawić wystarczająco długiego sznurka?
l4m2

1
q=n=>('q='+q).repeat(n).slice(0,n)działa dobrze na firefox
l4m2

5

J - 24 char

Pobiera jeden dodatni argument liczby całkowitej i wyrzuca ciąg.

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

J nie ma żadnych sztuczek z odniesieniami do siebie, więc robimy to po prostu jak na dłoni. Wyjaśnione przez wybuch:

  ],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)&

Diadyk $Operator w J cyklicznie pobiera elementy z prawego argumentu, aby dopasować go do wymiarów określonych po lewej stronie. Gdy wymiar jest pojedynczą liczbą, jest to prosta lista znaków 1D, więc robimy dokładnie to, o co pyta pytanie.

Go wypróbować na tryj.tk .


Jaki jest ogólny cel quoteczasownika?
randomra

@ randomra Jego definicja w standardowej bibliotece brzmi „ ''''&,@(,&'''')@(#~ >:@(=&''''))w języku angielskim”: „ podwoj dowolne 'znaki, a następnie dodaj jeden na początku i na końcu”. J używa literałów ciągów podobnych do Ada, więc to ucieka od łańcucha.
algorytmshark

4

k2 - 7 znaków

{x#$_f}

W języku angielskim jest to funkcja z argumentem, xktórego definicja to „ xweź ciąg znaków”.

  • Self (rzeczownik _f) to najbardziej wewnętrzna funkcja obecnie wykonywana. Oto funkcja {x#$_f}.
  • Ciąg (monadyczny $) konwertuje swój argument na ciąg. W przypadku funkcji tworzy ciąg znaków z oryginalną definicją funkcji.
  • Take (dyadic #) pobiera elementy lewostronne z listy w prawym argrze . W przypadku łańcucha elementy są znakami, więc robi to dokładnie to, czego chcemy.

To nie będzie działać w open-source Kona, ponieważ wydaje się tworzyć czarne dziury, które jedzą wszelkie próby wykorzystania ich jako argumenty do niczego. Nie jestem pewien właściwej semantyki k3, ale prawdopodobnie nie są one o wiele milsze.

W Q jest to {x#string .z.s}iw k4 {x#2_$.z.s}. Musimy użyć, 2_aby upuścić dwie początkowe postacie w k4, z powodów, które tylko matka mogła pokochać.


3

Rubin, 66 64 63 bajtów

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

To samo przy użyciu funkcji unikania wywoływania getsjest nieco dłuższe (81 bajtów):

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

Te same wersje Lambda mają 69 i 65 bajtów:

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
.cyclejest fajnie, muszę to pamiętać. :) Prawdopodobnie możesz skrócić .joindo *''.
Martin Ender

Możesz zapisać kilka znaków, używając String#formatzamiast interpolacji:eval s="$><<('eval s=%p'%s).chars.cycle.take(gets.to_i)*''"
Ventero,

3

Mathematica, 65 bajtów

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

Wszystkie spacje są konieczne, aby uczynić z tego właściwy quine, w tym jeden tylny. Jest to czysta funkcja, której można użyć w następujący sposób:

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

który drukuje

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

Niestety, stosowanie ToStringdo funkcji nie daje dokładnie tak wprowadzoną funkcję, więc nie może to skrócić usuwając spacje, skrócenie #1do #lub z użyciem notacji prefiksu dla wywołań funkcji.


„skrócenie #do #1”?
metro

@undergroundmonorail na odwrót, dzięki
Martin Ender

3

MATLAB, 319 141 znaków

Udało mi się wycisnąć kilka bajtów z oryginalnego:

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

Świetna odpowiedź...! Nie mam pojęcia, jak to działa :-)
Luis Mendo

3

JavaScript, 34 bajty

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

Funkcja rekurencyjna, która powtarza nczasy kodu , a następnie wycina wynik.


3

Japt , 2 bajty

îî

Wypróbuj online!

Pierwszy îto metoda numeryczna, która przyjmuje jeden parametr i powtarza go na długość n. Ponieważ jest to pierwsza metoda, nstaje się wejściem. Drugi îzostaje wrzucony do struny i powtórzony.

Przenosi to na:

n.î("î")-> Powtarzaj, "î"aż osiągnie długośćn

8 bajtowe rozwiązanie

îQi"îQi"

Wypróbuj online!

îQi"îQi" transpiles do n.î(Qi"îQi")

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

1
Piękna w swojej prostocie!
Kudłaty

2

R 203 bajty

Gdy N = 203, kod jest w pełni drukowany.

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

Gdy N = 50, kod sam się przycina.

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

Gdy N = 300, kod częściowo się powtarza.

(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 = "\

Spróbuj:(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)
Thomas

2

Matlab (57)

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

Początkowy 1indeks (zamiast 0) w ostatnim wierszu wynika z tego, że funkcja Matlaba typewprowadza początkowe przesunięcie wiersza, które należy usunąć. Podziękowania dla Dennisa za jego korektę (ostatni indeks) i jego sugestię ( nnzkrótszą niż numel).


Obawiam się, że to nie robi tego, czego bym się spodziewał (f (4) zwraca „zabawę”), dobrą wiadomością jest to, że można to naprawić, zapisując 2 znaki. (usuń -1). - Myślę, że możesz także usunąć drugą nową linię i zamienić numelna nnz.
Dennis Jaheruddin

@Dennis Dzięki za te dwa pomysły! Zredagowałem, aby włączyć oba
Luis Mendo

Hm, nie chcę być buzzkillem, ale czy ta type fczęść nie koliduje z wymaganiem Czytanie kodu źródłowego w jakikolwiek sposób i czytanie z pliku, standardu itp. Jest niedozwolone ?
knedlsepp

@knedlsepp Myślę, że masz rację. Też miałem takie podejrzenia. typeprawdopodobnie uzyskuje dostęp do dysku twardego. Czy uważasz, że powinienem usunąć odpowiedź?
Luis Mendo

@LuisMendo: Nie sądzę, żeby ktokolwiek naprawdę miał coś przeciwko. :-) Chciałem tylko wczoraj rozwiązać ten problem, ponieważ kilka razy wcześniej nie udało mi się stworzyć quine podobnego do tego. I oczywiście musiałem sprawdzić, czy istnieje już rozwiązanie Matlab. :-) Ostatecznie dało mi to wystarczającą motywację, aby zagłębić się w to głęboko, aby w końcu stworzyć rozwiązanie. ( modNawiasem mówiąc, ukradłem twój pomysł na rozpacz).
knedlsepp

2

Unary (wersja 1-8) , 23855 bajtów

Pobiera dane wejściowe jako jednoargumentowe z „1”, a kod to 23855 „1” ( ,[.,])


1
Co to za pieprzenie to też tłumaczy?
DJMcMayhem

@DJMcMayhem It's a cat
l4m2

Teraz znajdź język, który ma jednoargumentowe znaczenie i jakiś program 1-char do do cat
l4m2

2

Japt , 40 28 bajtów


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

Pierwszy raz piszę quine, więc prawdopodobnie można to trochę skrócić. Z drugiej strony cieszę się, że w ogóle udało mi się to zrobić.

Prowadząc celowo nowy wiersz, drugi wiersz to dane, a reszta rozpakowuje dane, a następnie powtarza cały wynikowy ciąg, aż osiągnie długość równą wartości wejściowej.

Dzięki Oliverowi udało się ogolić aż 12 bajtów .

Wypróbuj online!


Nice :) można zastąpić tTUz ¯Ui można go używać îzamiast pprzesuwając go do przodu: Spróbuj Online
Oliver

Po zastanowieniu, nie sądzę, że trzeba go w ogóle pokroić. îR+Q+V+Q+R+Vpowinien działać dobrze.
Oliver,

@Oliver Oh to sprytne, nie wiedziałem o îtym, to bardzo przydatne. Wielkie dzięki!
Nit

Nie jestem też zbyt dobry w quinesach, ale myślę, że powinno to działać na 24 bajty.
Kudłaty

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

Wyjaśnienie Oprócz znaku ucieczki wszystkie inne znaki są drukowane. Główna metoda znajduje się wewnątrz ciągu s, a wewnątrz głównego cały ciąg jest budowany i drukowany na standardowym wyjściu



1

Hoon , 185 bajtów

=/(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))))))))

Ustaw fkod programu jako taśmę, ale dla samego siebie „k”. Podziel taśmę na znak 5, ustawiając zmienne [p=left q=right]. Spawaj razem struny p, oryginalny ciąg fi wszystko po 1. znaku q. Powtórz ten ciąg znaków n, a następnie zwróć jego pierwsze nznaki.

To trochę utrudniało to, że stdlib Hoon'a nie miał funkcji formatowania ani znajdź i zamień ... Poza tym nie jestem pewien, dlaczego potrzebujemy kolejnej obsady po scag, ponieważ powinna zachować informacje o typie. Tak to idzie.




1

Gol> <> , 12 bajtów

"r2ssIFLko|;

Wypróbuj online!

Jak to działa

"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 możemy zawijać dowolną liczbę razy, więc nie musimy powielać całego stosu w zależności od danych wejściowych.


1

SmileBASIC, 106 66 bajtów

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

0

KSFTgolf - 4 znaki, 6 bajtów

KSFTgolf, jeśli język, który próbowałem zaprojektować dla golfa kodu. Dużo to zmieniałem, więc to chyba nie powinno się liczyć.

☃\@2

Jaki to język ? Jakieś linki? Spec? wyjaśnienie ..
Optymalizator

@Optimizer Ah, racja. Zapomniałem o tym. To język, który projektuję dla golfa kodowego. To w końcu wyzwanie, w którym (jeśli naprawię wszystkie błędy) może faktycznie wygrać.
KSFT,

1
Co więcej, o ile widzę, język został utworzony około 10 minut temu, więc technicznie jest to odpowiedź niekonkurująca :). Również, jak sądzę to jest blok odpowiadający Twoim kodzie, który całkowicie wygląda jak coś, co zostało zrobione specjalnie dla tego wyzwania (jak istnieją żadne inne bloki kodu Unicode oparty w całości pliku).
Optymalizator

@Optimizer Ta instrukcja była wcześniej w języku (chociaż zatwierdzenie, które ją nieznacznie zmieniło, zostało wypchnięte po opublikowaniu wyzwania), które zostało utworzone kilka dni temu. Ponieważ nie sądzę, aby działało to w wersji języka, która była publiczna w momencie opublikowania wyzwania, nie sądzę jednak, aby ta odpowiedź rzeczywiście się liczyła, jak już powiedziałem w mojej odpowiedzi.
KSFT,

4
Czy chcesz zbudować bałwana?
flawr


0

J, 41 bajtów

To była łamigłówka!

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

Wyjaśnienie:

((,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

Przykłady:

   ((,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 bajtów

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

Wyjaśnienie:

Wypróbuj online.

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:

  • The var sZawiera kod źródłowy niesformatowany.
  • %ssłuży do wprowadzania tego ciągu do siebie za pomocą s.format(...).
  • %c, %1$ci 34służą do formatowania podwójnych cudzysłowów.
  • s.format(s,34,s) łączy to wszystko.

Część wyzwania:

  • for(int i=n;i>n;i/=176)ceil(n/176)razy pętli , gdzie 176jest długość kodu źródłowego.
  • s+=s;wykładniczo zwiększa rozmiar kodu źródłowego String. ( abstaje się abab; ababstaje się abababab; ababababstaje się abababababababab; itp.)
  • s.subtring(0,n);pobiera pierwsze nznaki ciągu.


Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.