Mesin Kebenaran yang Diperpanjang


17

Banyak orang tahu apa itu mesin kebenaran dalam pemrograman. Tapi sudah saatnya kita membuat segalanya menjadi takik. Memperkenalkan, mesin kebenaran yang diperluas! Mesin kebenaran yang diperluas membutuhkan dua hal sebagai input, integer ndan string nonempty s. Ini menghasilkan s nkali dengan spasi tambahan trailing opsional. Namun, jika nsama dengan 0, Anda harus menampilkan ssampai program dihentikan secara manual yaitu tidak boleh dihentikan.

Juga, jika nangka negatif, maka string perlu dibalik. Misalnya dengan s=hellodan n=-1, hasilnya adalah olleh.

Metode input standar, segala jenis output selama dapat menangani yang tak terbatas. Jika Anda memiliki jawaban yang tidak menangani infinite, jangan ragu untuk mempostingnya jika menarik atau dalam bahasa yang tidak dapat menangani output infinite.

Uji Kasus

n, s, output

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

Ini , jadi kode terpendek menang!

Ini adalah pos Sandbox asli. Pengeditan telah dilakukan untuk itu. Terima kasih buka @ComradeSparklePony untuk membuat ide tantangan ini

Jawaban:


3

Haskell, 57 54 byte

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

Penjelasan:

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 terima kasih kepada @nimi


Anda bisa menggunakan -nbukan abs n.
nimi


2

MATL , 37 byte

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

Cobalah online!

Penjelasan:

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

Cobalah online!

Variabel kmenjamin loop selalu dijalankan setidaknya sekali. Ini berarti bahwa jika n=0, maka nakan menjadi negatif pada iterasi loop berikutnya, sehingga loop akan terus dijalankan selamanya.


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

Upaya pertama saya di kode-golf! Semua saran untuk bermain golf dipersilakan.


Selamat datang di situs ini! :)
DJMcMayhem

1

05AB1E , 17 16 14 byte

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

Cobalah online!

Penjelasan:

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.

Disimpan 2 byte berkat @EriktheOutgolfer


Anda dapat mengganti '-ådengan 0‹dan 0Qdengan _.
Erik the Outgolfer

@EriktheOutgolfer Terima kasih, diedit.
Kamerad SparklePony

1

Cubix , 41 Empat puluh empat 45 byte

Mengambil input sebagai <N> <String>

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

Cobalah online!

Kubus:

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

Tonton terus

Masih ada sejumlah no-ops dalam kode yang saya mungkin bisa mendapatkan beberapa byte lagi, tetapi ingin mendapatkan ini sebelum saya memecahkannya.

Prosedur dasarnya adalah

  • I dapatkan counter dari input
  • A ambil sisa input sebagai karakter
  • ;p? hapus spasi, angkat nomornya dan ujilah
    • psuqB$)jika penghitung negatif, balikkan tumpukan. Ini melibatkan penanganan nomor input dan penanda EOI (-1). Tambahkan penghitung.
    • ;p;ouqu jika penghitungnya nol, lepaskan penghitung dan penanda EOI dan mulailah loop keluaran yang abadi.
    • ( jika positif penurunan counter
  • <<q?/o()uloop output. Ini akan menampilkan setiap karakter tumpukan hingga penanda EOI (-1) tercapai.
  • ... _ ... ?wq!pada ujung penanda EOI, berkeliling kubus dan refleksikan kembali ke ?, ganti jalur, letakkan penanda EOI ke bawah dan uji penghitung.
  • @ jika nol, berhentilah
  • ?u( jika positif berbalik dan menurun, akhirnya dia akan mencapai awal lingkaran
  • ? ... <) jika negatif, pergi sekitar kubus ke sisi lain, redirect ke awal loop sambil melewati kenaikan.
  • /)< jika kenaikan negatif dan melanjutkan ke loop keluaran

tidakkah ini gagal jika string dimulai dengan angka?
Destructible Lemon

@DestructibleLemon diperbaiki
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))

Potongan:

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


Saya mencoba melakukan sesuatu yang rekursif seperti ini, tetapi saya tidak berpikir !n&&untuk mengulanginya tanpa batas. Namun, apakah ini akan menabrak StackOverflow pada akhirnya? it should never terminate.
Stephen

Ini akan mengingatkan PPCG string berulang kali. Di Chrome (setidaknya), saya harus mematikan browser untuk menghentikannya.
Rick Hitchcock

Saya mengerti maksud Anda. Saya pikir kode saya akan mengambil keuntungan dari optimasi rekursi panggilan ekor di browser yang mendukungnya.
Rick Hitchcock

Uji dengan console.log. Saya mendapatkan kesalahan.
Stephen

Hmm, Anda benar sekali: (
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 berkat Arjun

-3 byte terima kasih kepada Rick Hitchcock

Memulai berbeda dari jawaban Java , tetapi dengan cepat menjadi sangat mirip setelah bermain golf. Peringatan tidak terbatas, tetapi jika Anda ingin terlihat bagus, beralihlah keconsole.log . l=alert;dan menulis alertmemiliki panjang yang sama, tetapi jika Anda beralih ke console.logitu lebih pendek untuk mendefinisikannya kembali.


1
while(!n)l(s)bukannya if(!n)for(;;)l(s).
Arjun

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

@RickHitchcock Saya selalu lupa tentang itu :(
Stephen

l(s.repeat(Math.abs(n)))bukannya forloop pada akhirnya.
Arjun

0

QBIC , 36 byte

Lot ging di sini, dan QBIC / QBasic tidak memiliki sintaks untuk menangani kondisi seperti itu secara elegan.

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

Penjelasan:

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

Cobalah online!


Ini terlihat seperti cuplikan daripada program lengkap, yang tidak diizinkan oleh konsensus komunitas .
Buah Esolanging

Menurut pos yang Anda tautkan, "Defaultnya adalah 'program atau fungsi'" . Karena itu, karena OP tidak secara eksplisit menyatakan bahwa mereka menginginkan program lengkap , saya telah memperbarui jawaban saya. Sekarang terdiri dari suatu metode .
Bashful Beluga

0

str , 30 byte

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

Cobalah online!

Penjelasan

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

Cobalah online!

Siapa bilang, kita perlu strlen?

C (gcc) , 115 byte (134 dengan#include<string.h> di depan)

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

Cobalah online!

Tanpa #include<string.h>kita mendapatkan prototipe implisit untuk strlenpengembalian itu int, tetapi strlenadalahsize_t (setidaknya saat ini, tidak sempurna yakin tentang k & r atau C89, tapi saya percaya, itu kembali intdi hari tua).

Yang hilang #include <stdio.h>bukan masalah, karena karena promosi bilangan bulat, prototipe default akan menjadi int putchar(int)apa yang kita inginkan.


0

Retina , 49 byte

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

Format input: mengambil string, diikuti oleh baris baru, diikuti oleh nomor.

Cobalah online!

Penjelasan:

/¶-/&V`^.+

The /¶-/&berjalan baris ini hanya jika nomor tersebut negatif. Vadalah tahap mundur, dan terbalik ^.+, yang cocok dengan string ( .cocok dengan setiap karakter selain dari baris baru).

/¶0/&//+>G0`

The /¶0/&berjalan baris ini hanya jika nomor tersebut adalah 0. //+>dimulai loop tak terbatas, yang mencetak string kerja setelah setiap iterasi. G0mengambil string dan membuang nomornya; ia melakukan ini tanpa batas, mencetak setiap waktu.

~`...

Ini menandai kode yang akan menghasilkan string; program mengevaluasi string sebagai kode Retina setelahnya.

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

(.+)¶-*(\d+)cocok dengan seluruh string dan menempatkan string dalam menangkap grup 1 dan nomor dalam menangkap grup 2. .-$2+>K` $1menghasilkan kode Retina untuk dijalankan: . mematikan output implisit (jika tidak, string akan dicetak n + 1 kali), -$2+menetapkan pengulangan lingkaran yang berulang untuk {menangkap grup 2} kali. Minus di awal mengubah angka menjadi angka negatif, karena ini menonaktifkan fungsi konvergensi dalam loop, yang akan menghentikannya setelah iterasi pertama. >atur loop ini untuk mencetak setelah setiap iterasi. Sisa kode hanya untuk mencetak string.


0

Perl 6 , 44 byte

{[$^s.flip,$s,$s Zxx-$^n,Inf,$n][$n.sign+1]}

Cobalah online!

Blok kode anonim yang mengambil angka dan string dan mengembalikan daftar (mungkin tak terbatas)

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.