লগ স্কেলগুলি কোয়েটারদের জন্য


24

সবাই জানে লগ দাঁড়িপাল্লা হাল ছাড়লে জন্য । অতএব, আপনি একটি প্রোগ্রাম বা ফাংশন লিখতে হবে যে ডি quitifies একটি বার গ্রাফ একটি বেসের একটি লগ স্কেল দিয়ে।

বার গ্রাফ ইনপুটটি একক স্ট্রিং হিসাবে নেওয়া হয় যা বারগুলির একটি তালিকা, যেখানে লগ স্কেল বার গ্রাফের প্রতিটি বার আপনার পছন্দসই প্রিন্টযোগ্য (বা সাদা স্থান) ডিলিমিটার দ্বারা পৃথক করা হয় (সুতরাং 0x09-0x0A + 0x20-0x7E) এবং মুদ্রণযোগ্য অ-সাদা স্থান (তাই 0x21-0x7E) আপনার পছন্দের ফিলার চরিত্রের সমন্বয়ে গঠিত।

প্রোগ্রাম বা ফাংশনটি একটি একক স্ট্রিংকে আউটপুট দেয় যা বারগুলির একটি তালিকা, যেখানে প্রতিটি বার একই ডিলিমিটার দ্বারা পৃথক হয় ইনপুট দ্বারা পৃথক করা হয় এবং ইনপুটটি একই ফিলার চরিত্রের সমন্বয়ে গঠিত হয়।

উদাহরণ

আমরা "\ n" (একটি নতুন লাইন) এর একটি সীমানা এবং "#" এর ফিলার চরিত্র চয়ন করি। আমাদের প্রোগ্রাম বা ফাংশনে দেওয়া ইনপুটটি হ'ল:

বেস = 2 এবং স্ট্রিং =

####
##
######
###

কোডটি দেখতে পেল যে বারগুলির দৈর্ঘ্য [4,2,6,3]। এটা বেস সঙ্গে প্রতিটি দৈর্ঘ্য-বিরোধী লগ গনা হবে 2থেকে পেতে [2^4,2^2,2^6,2^3]= [16,4,64,8]। তারপরে, দৈর্ঘ্যগুলি রৈখিক স্কেল বার বিন্যাসে আউটপুট হয়:

################
####
################################################################
########

ইনপুট আউটপুট

আপনার প্রোগ্রাম বা ফাংশন কোনও যুক্তিসঙ্গত ফর্ম্যাটে ইনপুট এবং আউটপুট দিতে পারে ।

ইনপুট বেস একটি পূর্ণসংখ্যা চেয়ে বড় 1. আপনি অনুমান হতে পারে বেস 256. কম সম্পূর্ণরূপে Regex মেলে স্ট্রিং ইনপুট নিশ্চিত হয় হতে নিশ্চিত করা হয় (f+s)+f+, যেখানে fএবং sযথাক্রমে আপনার গর্ত ইত্যাদি বোজানো এবং বিভেদক দিয়ে প্রতিস্থাপিত করা হয়।

স্ট্রিং আউটপুট সম্পূর্ণরূপে Regex মেলানো (f+s)+f+, যেখানে fএবং sযথাক্রমে একই গর্ত ইত্যাদি বোজানো এবং বিভেদক দিয়ে প্রতিস্থাপিত করা হয়। আউটপুটে allyচ্ছিকভাবে একটি পেছনের নতুন লাইন থাকতে পারে।

আউটপুট এবং ইনপুটটি স্ট্রিংয়ের পরিবর্তে পরিবর্তিত স্ট্রিংগুলির পরিবর্তে স্ট্রিংগুলির একটি তালিকাও হতে পারে, তবে কোন বারটি কোনটি তা বোঝা আবশ্যক।

Testcases

(ধরুন ফিলারটি হ'ল #এবং ডিলিমিটারটি হ'ল \n)

base
-
input string
-
output string
-----
2
-
####
##
######
###
-
################
####
################################################################
########
-----
3
-
##
#
###
#
-
#########
###
###########################
###
-----
100
-
#   I am not the delimiter
###  nor the filler
-
Anything (You do not have to handle input which does not match the regex)
-----
1
-
###
#######
###################################################
- 
Anything (You do not have to handle bases less than or equal to 1).
-----
5
-
####
##
###
#
-
#################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################    
#########################
#############################################################################################################################
#####
-----
2
-
#
#
##
##
#
##
#
#
#
#
##
##
#
#
##
#
-
##
##
####
####
##
####
##
##
##
##
####
####
##
##
####
##

উত্তর:


6

x86 32-বিট মেশিন কোড ফাংশন, 21 বাইট

x86-64 মেশিন কোড ফাংশন, 22 বাইট

32 বিট মোডে 1 বি সংরক্ষণের জন্য বিভাজক = ফিলার -1 ব্যবহার করা দরকার, যেমন fill=0এবং sep=/। 22-বাইট সংস্করণ বিভাজক এবং ফিলার একটি স্বেচ্ছাসেবী পছন্দ ব্যবহার করতে পারে।


এটি ইনপুট-বিভাজক = \n(0xa), আউটপুট-ফিলার = 0, আউটপুট-বিভাজক = /= ফিলার -1 সহ 21-বাইট সংস্করণ । এই ধ্রুবকগুলি সহজেই পরিবর্তন করা যায়।

; see the source for more comments
; RDI points to the output buffer,  RSI points to the src string
; EDX holds the base
; This is the 32-bit version.
; The 64-bit version is the same, but the DEC is one byte longer (or we can just mov al,output_separator)
08048080 <str_exp>:
 8048080:       6a 01           push   0x1
 8048082:       59              pop    ecx           ; ecx = 1 = base**0
 8048083:       ac                      lods   al,BYTE PTR ds:[esi]  ; skip the first char so we don't do too many multiplies

; read an input row and accumulate base**n as we go.
08048084 <str_exp.read_bar>:
 8048084:       0f af ca        imul   ecx,edx       ; accumulate the exponential
 8048087:       ac              lods   al,BYTE PTR ds:[esi]
 8048088:       3c 0a           cmp    al,0xa        ; input_separator = newline
 804808a:       77 f8           ja     8048084 <str_exp.read_bar>
 ; AL = separator or terminator
 ; flags = below (CF=1) or equal (ZF=1).  Equal also implies CF=0 in this case.

 ; store the output row
 804808c:       b0 30           mov    al,0x30       ; output_filler
 804808e:       f3 aa           rep stos BYTE PTR es:[edi],al  ; ecx bytes of filler
 8048090:       48              dec    eax           ; mov al,output_separator 
 8048091:       aa              stos   BYTE PTR es:[edi],al  ;append delim

 ; CF still set from the inner loop, even after DEC clobbers the other flags
 8048092:       73 ec           jnc    8048080 <str_exp>  ; new row if this is a separator, not terminator

 8048094:       c3              ret    

08048095  <end_of_function>
; 0x95 - 0x80 = 0x15 = 21 bytes

64-বিট সংস্করণটি 1 বাইট দীর্ঘ, 2-বাইট ডিইসি বা এ ব্যবহার করে mov al, output_separator। অন্য যে, মেশিন-কোড উভয় সংস্করণের জন্য একই, কিন্তু কিছু রেজিস্টার নাম পরিবর্তন (যেমন rcxপরিবর্তে ecxমধ্যে pop)।

পরীক্ষা প্রোগ্রাম চালানো থেকে নমুনা আউটপুট (বেস 3):

$ ./string-exponential $'.\n..\n...\n....' $(seq 3);echo 
000/000000000/000000000000000000000000000/000000000000000000000000000000000000000000000000000000000000000000000000000000000/

অ্যালগরিদম :

exp *= baseপ্রতিটি ফিলার চরের জন্য করে ইনপুটটি লুপ করুন । ডিলিমিটার এবং সমাপ্ত শূন্য বাইটে, expফিলার বাইটগুলি সংযোজন করুন এবং তারপরে আউটপুট স্ট্রিংয়ের জন্য পৃথক করুন এবং এতে পুনরায় সেট করুন exp=1। এটি অত্যন্ত সুবিধাজনক যে ইনপুটটি কোনও নতুন লাইন এবং একটি টার্মিনেটর উভয় দিয়েই শেষ না হওয়ার গ্যারান্টিযুক্ত ।

ইনপুট-এ, বিভাজকের উপরে থাকা কোনও বাইট মান (স্বাক্ষরবিহীন তুলনা) ফিলার হিসাবে গণ্য করা হয়, এবং বিভাজকের নীচে থাকা কোনও বাইট মানকে একটি স্ট্রিং-মার্কার হিসাবে বিবেচনা করা হয়। (একটি শূন্য-বাইটের জন্য সুস্পষ্টভাবে চেক test al,alকরতে অভ্যন্তরীণ লুপ দ্বারা নির্ধারিত পতাকাগুলিতে অতিরিক্ত বনাম ব্রাঞ্চিং লাগবে )।


নিয়মগুলি কেবল একটি ট্রেলিং বিভাজককে অনুমতি দেয় যখন এটি পিছনের নতুন লাইনে থাকে। আমার বাস্তবায়ন সর্বদা বিভাজককে সংযোজন করে। ৩ বিট মোডে 1 বি সঞ্চয় পেতে, এই নিয়মের জন্য বিভাজক = 0xa ( '\n'এএসসিআইআই এলএফ = লাইনফিড), ফিলার = 0 এক্সবি ( '\v'এএসসিআইআই ভিটি = উল্লম্ব ট্যাব) প্রয়োজন। এটি খুব মানব-বান্ধব নয়, তবে আইনটির চিঠিটি সন্তুষ্ট করে। (আপনি হেক্সডাম্প বা
tr $'\v' xআউটপুটটি এটি কাজ করে যাচাই করতে, বা ধ্রুবকটি পরিবর্তন করতে পারেন যাতে আউটপুট বিভাজক এবং ফিলার মুদ্রণযোগ্য হয় I আমি আরও লক্ষ্য করেছি যে বিধিগুলি মনে করে যে এটি আউটপুট হিসাবে একই ফিল / সিপ ব্যবহার করে একই ইনপুট গ্রহণ করতে পারে , তবে আমি সেই নিয়ম ভঙ্গ করে কোনও লাভ করতে দেখছি না))।


NASM / YASM উত্স। %ifপরীক্ষা প্রোগ্রামের সাথে অন্তর্ভুক্ত স্টাফগুলি ব্যবহার করে 32 বা 64-বিট কোড হিসাবে তৈরি করুন বা আরসিএক্সকে এক্সে পরিবর্তন করুন।

input_separator equ 0xa  ; `\n` in NASM syntax, but YASM doesn't do C-style escapes

output_filler equ '0'                 ; For strict rules-compliance, needs to be input_separator+1
output_separator equ output_filler-1  ; saves 1B in 32-bit vs. an arbitrary choice
    ;; Using output_filler+1 is also possible, but isn't compatible with using the same filler and separator for input and output.

global str_exp
str_exp:                        ; void str_exp(char *out /*rdi*/, const char *src /*rsi*/,
                                ;              unsigned base /*edx*/);
.new_row:
    push   1
    pop    rcx                  ; ecx=1 = base**0

    lodsb                       ; Skip the first char, since we multiply for the separator
.read_bar:
    imul   ecx, edx             ; accumulate the exponential
    lodsb
    cmp    al, input_separator
    ja .read_bar                ; anything > separator is treated as filler
    ; AL = separator or terminator
    ; flags = below (CF=1) or equal (ZF=1).  Equal also implies CF=0, since x-x doesn't produce carry.

    mov    al, output_filler
    rep stosb                   ; append ecx bytes of filler to the output string
%if output_separator == output_filler-1
    dec   eax         ; saves 1B in the 32-bit version.  Use dec even in 64-bit for easier testing
%else
    mov    al, output_separator
%endif
    stosb                       ; append the delimiter

    ; CF is still set from the .read_bar loop, even if DEC clobbered the other flags
    ; JNC/JNB here is equivalent to JE on the original flags, because we can only be here if the char was below-or-equal the separator
    jnc .new_row            ; separator means more rows, else it's a terminator
    ; (f+s)+f+ full-match guarantees that the input doesn't end with separator + terminator
    ret

ফাংশনটি স্বাক্ষর সহ x86-64 SystemV ABI অনুসরণ করে,
void str_exp(char *out /*rdi*/, const char *src /*rsi*/, unsigned base /*edx*/);

এটি কেবলমাত্র আউটপুট স্ট্রিংয়ের দৈর্ঘ্যের কলারটিকে এটিতে একটি অতীত-শেষের পয়েন্টার রেখে অবহিত করে rdi, যাতে আপনি এটির কোনও ফেরতের মান বিবেচনা করতে পারেন স্ট্যান্ডার্ড কলিং কনভেনশন।

xchg eax,ediইক্স বা র্যাক্সের শেষ-পয়েন্টারটি ফিরে আসতে 1 বা 2 বাইট ( ) লাগবে। (যদি x32 এবিআই ব্যবহার করা হয় তবে পয়েন্টারগুলি কেবলমাত্র 32 বিট হওয়ার গ্যারান্টিযুক্ত, অন্যথায় xchg rax,rdiযদি কলার কম 32 বিটের বাইরে একটি বাফারে একটি পয়েন্টার দেয় তবে আমাদের ব্যবহার করতে হবে )) আমি এই সংস্করণটিতে আমি অন্তর্ভুক্ত করি না পোস্ট করা হচ্ছে কারণ কলার কলকারীর কাছ থেকে মান না পেয়ে ব্যবহার করতে পারে এমন কোনও কর্মক্ষেত্র রয়েছে rdi, তাই আপনি কোনও রেপার ছাড়াই সি থেকে এই কল করতে পারেন।

আমরা আউটপুট স্ট্রিং বা যেকোন কিছুই বাতিলও করি না, সুতরাং এটি কেবলমাত্র নতুন লাইন-টার্মিনেটেড। এটি ঠিক করতে 2 বাইট লাগবে: xchg eax,ecx / stosb (আরসিএক্স শূন্য থেকে rep stosb।)

আউটপুট-স্ট্রিংয়ের দৈর্ঘ্য বের করার উপায়গুলি হ'ল:

  • আরডিআই ফিরতি স্ট্রিংয়ের এক অতীত-শেষের দিকে নির্দেশ করে (যাতে কলার লেন = শেষ-শুরু করতে পারে)
  • কলকারী কেবলমাত্র ইনপুটটিতে কত সারি ছিল তা জানতে এবং নিউলাইনগুলি গণনা করতে পারে
  • কলার একটি বড় শূন্য বাফার এবং strlen()তারপরে ব্যবহার করতে পারে ।

এগুলি সুন্দর বা দক্ষ নয় (কোনও এসএম কলারের কাছ থেকে আরডিআইর রিটার্ন মান ব্যবহার করা বাদে) তবে আপনি যদি এটি চান তবে সি থেকে গল্ফড অ্যাসেম ফাংশনগুলি কল করবেন না: পি


আকার / ব্যাপ্তির সীমাবদ্ধতা

সর্বাধিক আউটপুট স্ট্রিং আকারটি ভার্চুয়াল মেমরি ঠিকানা-স্পেস সীমাবদ্ধতার দ্বারা সীমাবদ্ধ। (মূলত এটি যে বর্তমান x86-64 হার্ডওয়্যার কেবল ভার্চুয়াল ঠিকানায় 48 টি গুরুত্বপূর্ণ বিটকে সমর্থন করে, অর্ধেকভাগে বিভক্ত হয় কারণ তারা শূন্য-প্রসারণের পরিবর্তে সাইন-এক্সটেন্ড করে। লিঙ্কিত উত্তরে ডায়াগ্রামটি দেখুন ))

প্রতিটি সারিতে সর্বাধিক 2 ** 32 - 1 ফিলার বাইট থাকতে পারে, যেহেতু আমি 32-বিট রেজিস্টারে ঘনিষ্ঠভাবে জমা করি।

ফাংশনটি 0 থেকে 2 ** 32 - 1 পর্যন্ত ঘাঁটিগুলির জন্য সঠিকভাবে কাজ করে Cor প্রতি লাইনে 1 ফিলার।)

এটি ইন্টেল আইভিব্রিজে এবং পরবর্তীকালেও স্পষ্টতই দ্রুতগতির, বিশেষত বৃহত্তর সারিগুলি সারিবদ্ধ মেমরিটিতে লেখা হওয়ার জন্য। ERMSB বৈশিষ্ট্য সহ সিপিইউগুলিতে প্রান্তিক পয়েন্টার সহ বৃহত গণনাগুলির জন্য rep stosbসর্বোত্তম বাস্তবায়নmemset() । উদাহরণস্বরূপ 180 ** 4টি 0.97 গিগাবাইট, এবং আমার i7-6700k স্কাইলেকে (~ 256k নরম পৃষ্ঠা-ত্রুটি সহ) / dev / নালটিতে লিখতে 0.27 সেকেন্ড সময় নেয়। (লিনাক্সের উপর ডিভাইস-চালক, / dev / নাল জন্য তথ্য যে কোন জায়গায় কপি করে না, এটা ঠিক আয়। সুতরাং সব সময় হয় rep stosbএবং নরম পৃষ্ঠা-ফল্ট যে ট্রিগার যখন প্রথমবারের মত মেমরি স্পর্শ। এটা দুর্ভাগ্যক্রমে বিএসএসে অ্যারের জন্য স্বচ্ছ হিটপেজগুলি ব্যবহার না করা। সম্ভবত কোনও madvise()সিস্টেম কল এটির গতি বাড়িয়ে দেবে))

পরীক্ষা প্রোগ্রাম :

একটি স্ট্যাটিক বাইনারি তৈরি করুন এবং ./string-exponential $'#\n##\n###' $(seq 2)বেস 2 হিসাবে চালান an একটি বাস্তবায়ন এড়ানোর জন্য atoi, এটি ব্যবহার করে base = argc-2। (কমান্ড-লাইন দৈর্ঘ্যের সীমা হাস্যকরভাবে বড় ঘাঁটিগুলি পরীক্ষা করতে বাধা দেয়))

এই মোড়ক 1 জিবি পর্যন্ত আউটপুট স্ট্রিংয়ের জন্য কাজ করে। (এটি কেবলমাত্র একক রাইটিং () সিস্টেমকে কল দেয় এমনকি বিশালাকার স্ট্রিংয়ের জন্য, তবে লিনাক্স এমনকি পাইপগুলিতে লেখার জন্য এটি সমর্থন করে)। অক্ষর গণনা করার জন্য পাইপটি প্রবেশ করুন wc -cবা strace ./foo ... > /dev/nullরাইটিং সিস্কেলে আর্গ দেখতে ব্যবহার করুন।

এটির জন্য আরজি হিসাবে রিটার্ন-মানটি আর্গ হিসাবে স্ট্রিংয়ের দৈর্ঘ্য গণনা করে নেয় write()

;;; Test program that calls it
;;; Assembles correctly for either x86-64 or i386, using the following %if stuff.
;;; This block of macro-stuff also lets us build the function itself as 32 or 64-bit with no source changes.

%ifidn __OUTPUT_FORMAT__, elf64
%define CPUMODE 64
%define STACKWIDTH 8    ; push / pop 8 bytes
%define PTRWIDTH 8
%elifidn __OUTPUT_FORMAT__, elfx32
%define CPUMODE 64
%define STACKWIDTH 8    ; push / pop 8 bytes
%define PTRWIDTH 4
%else
%define CPUMODE 32
%define STACKWIDTH 4    ; push / pop 4 bytes
%define PTRWIDTH 4
%define rcx ecx      ; Use the 32-bit names everywhere, even in addressing modes and push/pop, for 32-bit code
%define rsi esi
%define rdi edi
%define rsp esp
%endif


global _start
_start:
    mov  rsi, [rsp+PTRWIDTH + PTRWIDTH*1]  ; rsi = argv[1]
    mov  edx, [rsp]          ; base = argc
    sub  edx, 2              ; base = argc-2  (so it's possible to test base=0 and base=1, and so ./foo $'xxx\nxx\nx' $(seq 2) has the actual base in the arg to seq)
    mov  edi, outbuf         ; output buffer.  static data is in the low 2G of address space, so 32-bit mov is fine.  This part isn't golfed, though

    call str_exp             ; str_exp(outbuf, argv[1], argc-2)
    ;  leaves RDI pointing to one-past-the-end of the string
    mov  esi, outbuf

    mov  edx, edi
    sub  edx, esi               ; length = end - start

%if CPUMODE == 64 ; use the x86-64 ABI
    mov  edi, 1                 ; fd=1 (stdout)
    mov  eax, 1                 ; SYS_write  (Linux x86-64 ABI, from /usr/include/asm/unistd_64.h)
    syscall                     ; write(1, outbuf, length);

    xor edi,edi
    mov eax,231   ; exit_group(0)
    syscall


%else  ; Use the i386 32-bit ABI (with legacy int 0x80 instead of sysenter for convenience)
    mov ebx, 1
    mov eax, 4                  ; SYS_write (Linux i386 ABI, from /usr/include/asm/unistd_32.h)
    mov ecx, esi  ; outbuf
    ; 3rd arg goes in edx for both ABIs, conveniently enough
    int 0x80                    ; write(1, outbuf, length)

    xor ebx,ebx
    mov eax, 1
    int 0x80     ; 32-bit ABI _exit(0)
%endif


section .bss
align 2*1024*1024 ; hugepage alignment (32-bit uses 4M hugepages, but whatever)
outbuf:    resb 1024*1024*1024 * 1
; 2GB of code+data is the limit for the default 64-bit code model.
; But with -m32, a 2GB bss doesn't get mapped, so we segfault.  1GB is plenty anyway.

এটি মজাদার চ্যালেঞ্জ ছিল যা নিজেকে খুব ভালভাবে asm, বিশেষত x86 স্ট্রিং অপ্সকে ধার দেয় । ইনপুট স্ট্রিংয়ের শেষে কোনও নিউলাইন এবং তারপরে কোনও টার্মিনেটর পরিচালনা করা এড়াতে নিয়মগুলি সুন্দরভাবে ডিজাইন করা হয়েছে।

পুনরাবৃত্তিবৃদ্ধির সাথে ঘনিষ্ঠভাবে ঘন ঘন একই সাথে পুনরাবৃত্ত সংযোজনের সাথে গুণণের মতো এবং যাইহোক আমার প্রতিটি ইনপুট সারিতে অক্ষরগুলি গণনা করার জন্য লুপ করা দরকার।

আমি ওয়ান-অপরেন্ড mulবা imulতার পরিবর্তে দীর্ঘতর ব্যবহারের বিষয়টি বিবেচনা করেছি imul r,r, তবে এর EAX এর অন্তর্নিহিত ব্যবহারটি LODSB এর সাথে বিরোধ করবে would


আমি লোড এবং তুলনা করার পরিবর্তে এসসিএএসবি চেষ্টাও করেছি , তবে xchg esi,ediঅভ্যন্তরীণ লুপের আগে এবং পরে আমার দরকার ছিল , কারণ এসসিএএসবি এবং স্টোসবি উভয়ই ইডিআই ব্যবহার করে। (সুতরাং 64৪-বিট সংস্করণে 32৪-বিট পয়েন্টার কেটে এড়াতে x32 এবিআই ব্যবহার করতে হবে)।

STOSB এড়ানো কোনও বিকল্প নয়; আর কিছুই কোথাও সংক্ষেপে কাছে নেই। এবং এসসিএএসবি ব্যবহারের অর্ধেক সুবিধা হ'ল অভ্যন্তরীণ লুপটি ছেড়ে যাওয়ার পরে AL = ফিলার, সুতরাং আমাদের আরইপি স্টসবির কোনও সেটআপের প্রয়োজন নেই।

এসসিএএসবি আমার যা করা ছিল তার থেকে অন্য দিকের সাথে তুলনা করে, তাই আমার তুলনাগুলি উল্টে দেওয়া দরকার।

এক্সএইচজি এবং স্ক্যাসবি দিয়ে আমার সেরা চেষ্টা। কাজ করে, তবে কম নয় isn't ( 32-বিট কোড, ফিলারকে বিভাজক হিসাবে পরিবর্তন করতে inc/ decট্রিক ব্যবহার করে )।

; SCASB version, 24 bytes.  Also experimenting with a different loop structure for the inner loop, but all these ideas are break-even at best
; Using separator = filler+1 instead of filler-1 was necessary to distinguish separator from terminator from just CF.

input_filler equ '.'    ; bytes below this -> terminator.  Bytes above this -> separator
output_filler equ input_filler       ; implicit
output_separator equ input_filler+1  ; ('/') implicit

 8048080:       89 d1                   mov    ecx,edx    ; ecx=base**1
 8048082:       b0 2e                   mov    al,0x2e    ; input_filler= .
 8048084:       87 fe                   xchg   esi,edi
 8048086:       ae                      scas   al,BYTE PTR es:[edi]

08048087 <str_exp.read_bar>:
 8048087:       ae                      scas   al,BYTE PTR es:[edi]
 8048088:       75 05                   jne    804808f <str_exp.bar_end>
 804808a:       0f af ca                imul   ecx,edx           ; exit the loop before multiplying for non-filler
 804808d:       eb f8                   jmp    8048087 <str_exp.read_bar>   ; The other loop structure (ending with the conditional) would work with SCASB, too.  Just showing this for variety.
0804808f <str_exp.bar_end>:

; flags = below if CF=1 (filler<separator),  above if CF=0 (filler<terminator)
; (CF=0 is the AE condition, but we can't be here on equal)
; So CF is enough info to distinguish separator from terminator if we clobber ZF with INC

; AL = input_filler = output_filler
 804808f:       87 fe                   xchg   esi,edi
 8048091:       f3 aa                   rep stos BYTE PTR es:[edi],al
 8048093:       40                      inc    eax         ; output_separator
 8048094:       aa                      stos   BYTE PTR es:[edi],al
 8048095:       72 e9                   jc     8048080 <str_exp>   ; CF is still set from the inner loop
 8048097:       c3                      ret    

একটি ইনপুট জন্য ../.../., উত্পাদন ..../......../../। আমি বিভাজক = নিউলাইন সহ সংস্করণটির একটি হ্যাক্সডাম্প দেখানো বিরক্ত করব না।


4

গণিত 41 41 বাইট

-3 বাইটস এলএলএএমএএনইওয়াইপি-র ধন্যবাদ জানায়

এটি পূর্ণসংখ্যার পরে স্ট্রিংগুলির তালিকা হিসাবে ইনপুট নেয়। আউটপুট স্ট্রিংগুলির একটি তালিকা।

""<>"#"~Table~#&/@(#2^StringLength@#)&

ব্যাখ্যা:

                   StringLength@# & - find length of each string in first input
                   #2^               & - raise to power of second input
                /@(                 )  - Uses each of these numbers on an inner function of ...
    "#"~Table~#&                       - Create arrys of specific length using character "#"
 ""<>                                  - Join arrays of characters together to make strings

পুরানো সংস্করণ, 41 বাইট

"#"~StringRepeat~#&/@(#2^StringLength@#)&

"" <> "#"~Table~#3 বাইটের চেয়ে কম "#"~StringRepeat~#, সম্ভবত আরও গল্ফযোগ্য।
LLlAMnYP

3

জাপট , 7 বাইট

"ফিলার হিসাবে স্ট্রিংগুলির একটি অ্যারের হিসাবে গ্রাফ এবং পূর্ণসংখ্যা হিসাবে বেসটি গ্রহণ করে।

£QpVpXl

এটি অনলাইনে চেষ্টা করুন

যোগ }Rঅর্ডার গ্রাফ গ্রহণ করার জন্য শেষ হিসেবে একটি newline পরিবর্তে স্ট্রিং পৃথক করা হয়। ( চেষ্টা করে দেখুন )


ব্যাখ্যা

    :Implicit input of array U.
£   :Map over the array, replacing each element with ...
Q   :the " character ...
p   :repeated ...
V   :integer input ...
p   :to the power of ...
Xl  :the length of the current element times.
    :Implicit output of result.

3

এমএটিএল , 14 11 বাইট

Y'iw^1HL(Y"

ডিলিমিটার হ'ল স্পেস। ফিলার স্থান ছাড়া অন্য কোনও চরিত্র।

এটি অনলাইন চেষ্টা করুন!

ব্যাখ্যা

       % Implicit input: string
       %   STACK: '## # ### #'
Y'     % Run-length encoding
       %   STACK: '# # # #', [2 1 1 1 3 1 1]
i      % Input: number
       %   STACK: '# # # #', [2 1 1 1 3 1 1], 3
w      % Swap
       %   STACK: '# # # #', 3, [2 1 1 1 3 1 1]
^      % Power, element-wise
       %   STACK: '# # # #', [9 3 3 3 9 3 3]
1      % Push 1
       %   STACK: '# # # #', [9 3 3 3 27 3 3], 1
HL     % Push [2 2 1j]. When used as an index, this means 2:2:end
       %   STACK: '# # # #', [9 3 3 3 27 3 3], 1, [2 2 1j]
(      % Write specified value at specified entries
       %   STACK: '# # # #', [9 1 3 1 27 1 3]
Y"     % Run-length decoding
       %  STACK: '######### ### ########################### ###'
       % Implicit display

এটি কাজ করে বলে মনে হয় না; আপনি আপনার টিআইওতে অন্তর্ভুক্ত পরীক্ষার ক্ষেত্রে আউটপুটে প্রতিটি লাইনের দৈর্ঘ্য 9,3,27,9 হওয়া উচিত তবে পরিবর্তে এটি 6,3,9,3 হওয়া উচিত।
শেগি

@ শেগি আপনি সম্পূর্ণরূপে ঠিক বলেছেন। লক্ষ্য করার জন্য ধন্যবাদ। আমি আমার সর্বশেষ সম্পাদনায় ভুল করেছি। আমি পূর্ববর্তী সংস্করণে ফিরে এসেছি, এহچ সঠিক
লুইস মেন্ডো

ব্যাখ্যা থেকে এটি কীভাবে কাজ করছে তা অনুধাবন করতে পারিনি - তারপরে আমি টিআইও-তে ক্লিক করেছিলাম! : ডি
শেগি

1
@ শেগি আমি এই সংস্করণটির জন্য কেবল একটি ব্যাখ্যা যুক্ত করেছি, আশা করি আরও পরিষ্কার!
লুইস মেন্ডো

3

হাস্কেল , 37 33 বাইট

Sudee ধন্যবাদ 4 বাইট চাঁচা

\b->map(\x->'#'<$[1..b^length x])

বর্ণনা:

\b->                               -- take an integer b as the first input input
    map(\x->                    )  -- apply the following to every element x in the second input
            '#'<$[1..b^length x]   ---- replicate '#' (b^(length x)) times

হতাশাজনকভাবে, এটি 2 -বাইটটি ওয়ে-হার্ড-টু-পঠনযোগ্য পয়েন্টফ্রি সংস্করণের তুলনায় খুব ছোট:

map.(flip replicate '#'.).(.length).(^)

ইনপুটটি একটি একক স্ট্রিং হওয়া উচিত
বার্তাভেল

@ বার্তাওয়েল, অগত্যা নয়।
শেগি

বার গ্রাফ
ইনপুটটিকে

1
@ বার্তাওয়েল: আউটপুট এবং ইনপুটটি
জুলিয়ান ওল্ফ

2
আপনি প্রতিস্থাপন করতে পারেন replicate(b^length x)'#'সঙ্গে '#'<$[1..b^length x]
sudee

3

রিরেজেক্স , 105 বাইট

#import math
(\d+)\n((;.*\n)*)(_+)/$1\n$2;$1^d<$4>/^\d+\n((;\d+\n?)+)$/$1/^((_*\n)*);(\d+)/$1u<$3>/#input

এটি অনলাইন চেষ্টা করুন!

রিরেজেক্স হ'ল রেটিনার কুৎসিত মামাত ভাইয়ের মতো যা নিয়মিত এক্সপ্রেশনগুলিকে নিজের অভিনব অপারেটর না করে সমস্ত প্রয়াস দেয় ।

অবশ্যই, এটিও রয়েছে #importএবং #inputউভয় হার্ডকোডিং ইনপুট সংরক্ষণ করতে এবং একই অভিব্যক্তিটি বারবার পুনরায় লিখে।

ব্যাখ্যা।

আকারে ইনপুট নেয়:

2
____
__
______
___

STDIN এ, এবং ফলাফল দেয় output

________________
____
________________________________________________________________
________

প্রথমত, প্রোগ্রামটি ম্যাথ লাইব্রেরি আমদানি করে , যা অবশ্যই পুরোপুরি রিরেজেক্সে লিখিত হয়। এর বেশিরভাগ অংশই তিনটি নিয়মিত এক্সপ্রেশন।

(\d+)\n((;.*\n)*)(_+)   ->  $1\n$2;$1^d<$4>
^\d+\n((;\d+\n?)+)$     ->  $1
^((_*\n)*);(\d+)        ->  $1u<$3>

প্রথমটি আমাদের ইনপুট বেসের সাথে মিলে যায় এবং এর পরে একাকার লাইনের সন্ধান করে। এরপরে, সেই লাইনটি ;$1^d<$4>, যা ভিত্তিটি, (দশমিক ইন) ইউনারি পাওয়ারের সাথে প্রতিস্থাপন করে । ম্যাথ লাইব্রেরি বেস রূপান্তর এবং সূচককে পরিচালনা করে। ক; এটি সমাপ্ত হিসাবে পরে এটি সনাক্ত করতে শুরুতে স্থাপন করা হয়।

দ্বিতীয়টি, সমাপ্তির আগে, বেসের সাথে অনেকগুলি লাইন; এটি যদি পুরো জিনিসের সাথে মেলে তবে এটি বেস থেকে স্নিপ করে। শুধু উত্তর এবং ;গুলি সঙ্গে uf ছেড়ে ।

শেষটি, শুরুতে কেবল অকার্যকর সাথে মেলে, allyচ্ছিকভাবে, তারপরে একটি ;উত্তর। এরপরে এটি উত্তরটিকে আবার অচিনেয় রূপান্তর করে ;

প্রথম রেজেজের সাথে আউটপুট মেলেনি বলে এটি অসীমভাবে লুপ করে না এবং তাই আমাদের সমাধান আউটপুট হয়।



2

রাদা , 19 বাইট

f n,s{s|["#"*n^#_]}

এটি অনলাইন চেষ্টা করুন!

ইনপুট হিসাবে একটি অ্যারে নেয় এবং আউটপুট হিসাবে মানগুলির একটি স্ট্রিম প্রদান করে।

ব্যাখ্যা

f n,s{s|["#"*n^#_]}              n is the number and s is the array of strings consisting of #s
      s|                         Push the each value of s to the stream
        [        ]               For each push
         "#"*                     "#" repeated
             n^#_                 n raised to the length of the string

2

হাস্কেল , 32 বাইট

f b=map$foldr(\_->([1..b]>>))"#"

এটি অনলাইন চেষ্টা করুন! উদাহরণ ব্যবহার: f 3 ["##","#","###","#"]আয় ["#########","###","###########################","###"]

mapM putStrLn $ f 3 ["##","#","###","#"]আরও দৃষ্টি আকর্ষণীয় আউটপুট পেতে ব্যবহার করুন :

#########
###
###########################
###

এখানে শুধু মন্তব্য করছি কারণ আপনি মোছা পোস্টে আমি মন্তব্য করতে পারি না ... চেষ্টা করুন sum[sum[]^sum[],sum[]^sum[]]
janrjan জোহানসেন

2

05 এ বি 1 ই , 9 বাইট

বারগুলি স্পেস দ্বারা পৃথক করা হয়, আউটপুট অক্ষর ইনপুট অক্ষরের সমান।

¬Š#€gm×ðý

এটি অনলাইন চেষ্টা করুন!

¬Š#€gm×ðý   Arguments: n, s
¬           Head, get bar character
 Š          Rearrange stack to get: s, n, bar-character
  #         Split s on spaces
   €g       Map to length
     m      n to that power
      ×     That many bar-characters
       ðý   Join on space
            Implicit output

1

পিএইচপি, 69 বাইট

<?foreach($_GET[1]as$l)echo str_pad("",$_GET[0]**strlen($l),"#")."
";

এটি অনলাইন চেষ্টা করুন!


এটি একটি শীর্ষস্থানীয় নিউলাইন দিয়ে প্রত্যাবর্তন করবে, যা রেজেক্স দ্বারা অনুমোদিত নয়। আপনি এটি (+1 বাইট) ঠিক করার [str_pad]."\n"পরিবর্তে ব্যবহার করতে পারেন "\n".[str_pad]। এছাড়াও, আপনি ফিলার কী তা ধরে নিতে পারেন, তাই আপনি $l[0]এটিকে পরিবর্তন করে দুটি বাইট সংরক্ষণ করতে পারেন "#"
ফায়ার ফ্লেম 241

@ ফায়ার ফ্লেম 241 সম্পন্ন হয়েছে আপনাকে ধন্যবাদ
জার্গ হালসারম্যান

1

জেলি , 7 বাইট

ṁL*@¥¥€

বারগুলির তালিকা গ্রহণ এবং ফিরে আসা একটি মোনাডিক লিঙ্ক (নিজেরাই অক্ষরের তালিকা, একে একে স্ট্রিং) ফিলার চরিত্রটি নমনীয়।

এটি অনলাইন চেষ্টা করুন! (পাদলেখগুলি নতুন উপাদানগুলির সাথে তার উপাদানগুলিতে যোগদান করে ফলাফলের তালিকাটি পূর্বরূপ দেয়))

কিভাবে?

ṁL*@¥¥€ - Main link: list of list of characters, bars; number, base
     ¥€ - last two links as a dyad for €ach bar in bars:
    ¥   -   last two links as a dyad:
 L      -     length (of a bar)
  *@    -     exponentiate (swap @rguments) (base ^ length)
ṁ       -   mould like (e.g. moulding "##" like 8 yields "########")

বিকল্প 7-বাইটার: ṁ"L€*@¥- প্রতিটি বারের দৈর্ঘ্য পান ( L€), baseসেই শক্তিতে উত্থাপন করুন ( *@), তারপরে "তালিকাটি জিপ করুন ( ) এবং এটি দুটিয়ের মধ্যে ছাঁচ ডায়াড ( ) প্রয়োগ করুন ।


4 কুইস এবং 3 আসল লিঙ্ক? ডেটা প্রবাহ নিয়ন্ত্রণ করতে এই চ্যালেঞ্জটি বেশ ভারী ...
ETH প্রোডাকশনগুলি

হ্যাঁ, একটি সংক্ষিপ্ত সমাধান উপলভ্য হতে পারে ...
জোনাথন অ্যালান

@ জোনাথান অ্যালান আমার ভয় হয় যে সেখানে নেই।
এরিক আউটগল্ফার

@ ইথ প্রডাকশনস এটি সামগ্রিকভাবে একটি লিঙ্ক। ব্যাখ্যাটি কেবলমাত্র এক লাইন হতে পারে।
এরিক আউটগল্ফার

1

রুবি , 29 বাইট

->x,y{x.map{|z|?#*y**z.size}}

এটি অনলাইন চেষ্টা করুন!

হ্যাঁ, আমি গত সপ্তাহে খুঁজে পেয়েছি যা ?#একটি একক-চরিত্রের স্ট্রিং উত্পাদন করে। এই বৈশিষ্ট্যটি কেন বিদ্যমান তা আমার কোনও ধারণা নেই তবে আমি এটি নিশ্চিত যে এতে আনন্দিত।


1
?Xঅপারেটর, যেখানে Xকিছু চরিত্র, "এই চরিত্রের ডিফল্ট উপস্থাপনা পেতে" অপারেটর। রুবি <1.9 এ, এটি চরিত্রের ইউনিকোড কোড পয়েন্টটি ফিরিয়ে আনবে, কারণ অক্ষরগুলি এভাবেই সংজ্ঞায়িত করা হয়েছিল, তবে এখন এটি অক্ষরযুক্ত একটি স্ট্রিং প্রদান করে। এটি রুবিতে আরও ধারাবাহিক ইউনিকোড পরিচালনার দিকে একটি সাধারণ শিফটের অংশ।
টটলম্যান

@ টার্টলম্যান, কেন কোনও হিস্টোরিকাল কিসমিন ?Xব্যবহার করা হচ্ছে? $পার্বের সাথে পরিচিত হওয়ার কারণে রুবি'র প্রচুর পরিমাণে কোয়ারকিয়ার কনভেনশন রয়েছে v
ymbirtt

1

জাভাস্ক্রিপ্ট (ES8), 39 বাইট

পূর্ণসংখ্যা হিসাবে গ্রাফ এবং কারিটিং সিনট্যাক্স ব্যবহার করে ফিলার হিসাবে কোনও চরিত্রের সাথে স্ট্রিংগুলির একটি অ্যারের হিসাবে গ্রাফটি নেয়।

b=>a=>a.map(x=>x.padEnd(b**x.length,x))

চেষ্টা করে দেখুন

f=
b=>a=>a.map(x=>x.padEnd(b**x.length,x))
oninput=_=>o.innerText=f(i.value)(j.value.split`\n`).join`\n`
o.innerText=f(i.value=2)((j.value=`####\n##\n######\n###`).split`\n`).join`\n`
*{box-sizing:border-box}#i,#j{margin:0 0 5px;width:200px}#j{display:block;height:100px
<input id=i type=number><textarea id=j></textarea><pre id=o>


বিকল্প, 49 বাইট

এই সংস্করণটি গ্রাফটিকে একটি নতুন লাইন পৃথক স্ট্রিং হিসাবে গ্রহণ করবে, আবার কোনও চরিত্র ফিলার হিসাবে।

b=>s=>s.replace(/.+/g,m=>m.padEnd(b**m.length,m))

mডিফল্টরূপে .নতুন রেখাগুলির সাথে মেলে না , রেজেজেজে পতাকা লাগবে বলে মনে করবেন না ।
ETH প্রোডাকশনগুলি

হুম, কোথা থেকে এসেছে তা জানেন না - একটি ফোন থেকে গল্ফ দেওয়ার চেষ্টা করার বিপদ। এটি ইঙ্গিত করার জন্য ধন্যবাদ, @ ইথ প্রডাকশনস।
শেগি

0

গণিত, 86 বাইট

(s=#2^StringLength[StringSplit@#1];StringJoin/@Table[Table["#",s[[i]]],{i,Length@s}])&

ইনপুট

["#### \ n ## \ n ###### \ n ###", ২]


ঠিক আছে ... স্থির ......
J42161217

0

অক্টাভা, 42 বাইট

@(b,s)[(1:max(k=b.^sum(s'>32)')<=k)+32 '']

* স্ট্রিং ইনপুট / আউটপুট পুরোপুরি রেজেক্সের সাথে মেলে না তবে কোন বারটি তা বোঝা সম্ভব।

একটি ফাংশন ইনপুট বেস হিসাবে ধারণ করে এমন bএকটি 2D অ্যারে sধারণ করে "!"এবং আউটপুটটিও অক্ষরের অ্যারে হয়।

এটি অনলাইন চেষ্টা করুন!

ব্যাখ্যা:

                       s'>32               % logical array of input represents 1 for filler and 0 for spaces
                   sum(     )'             % an array containing length of each string 
              k=b.^                        % exponentiate ( lengths of output)
        1:max(                )            % range form 1 to max of output lengths
                               <=k         % logical array of output represents 1 for filler and 0 for spaces
      [(                          )+32 ''] % convert the logical array to char array.

0

সিজোম, 20 বাইট

q~:A;N/{,A\#"#"e*N}%

ছক পূরণ করা

নিম্নলিখিত বিন্যাসে ইনপুট প্রয়োজন:

"##
####
######"2

0

কাঠকয়লা , 11 বাইট

NβWS«PXβLι↓

এটি অনলাইন চেষ্টা করুন! লিঙ্কটি কোডটির ভার্জোজ সংস্করণ। আই / ও হ'ল -অক্ষরের স্ট্রিংয়ের তালিকা হিসাবে রয়েছে (লক্ষ্য করুন যে তালিকাটি শেষ করতে আপনার খালি লাইন প্রয়োজন)।


0

ভি , 27 বাইট

মূল ধারণাটি হ'ল আমরা 'প্রতিটি সারিতে একটি যুক্ত করব (n ^ 0), এবং তারপরে প্রত্যেকটির জন্য #আমরা 'লাইনে s গুলি প্রতিস্থাপন করব [input] * '। শেষে আমি সব অদলবদল 'জন্য #আবার

Àé'ld0ÎA'
ò/#
"_xÓ'/"òÍ'/#

এটি অনলাইন চেষ্টা করুন!




0

রেটিনা , 62 বাইট

ms`^(?=.*¶(.*))
#;$1$*#;
{`#(?=#*;(#+);#)
$1
}m`#$

;#+;|¶.*$

এটি অনলাইন চেষ্টা করুন! সর্বোপরি, একটি বার গ্রাফটি কেবল আনারি সংখ্যার একটি তালিকা। গ্রাফ হিসাবে ইনপুট নেয় ( #গুলি ব্যবহার করে ) এর পরে দশমিক ভিত্তিতে বেস হয় (বিভ্রান্তি এড়াতে)। ব্যাখ্যা: প্রথম প্রতিস্থাপনের উপসর্গ 1 এবং গ্রাফের প্রতিটি লাইনের ভিত্তি। দ্বিতীয় প্রতিস্থাপনটি তখন প্রতিটি লাইনের প্রথম সংখ্যাটিকে দ্বিতীয় দ্বারা গুণ করে, তৃতীয় সংখ্যাটি যতক্ষণ না ননজারো হয়। তৃতীয় প্রতিস্থাপনের পরে প্রতিটি লাইনে তৃতীয় সংখ্যা হ্রাস হয়। তৃতীয় সংখ্যাটি শূন্য না হওয়া পর্যন্ত এই দুটি প্রতিস্থাপনের পুনরাবৃত্তি করা হয়। শেষ প্রতিস্থাপনটি কাঙ্ক্ষিত ফলাফল রেখে সর্বত্র বেস মুছে ফেলে।



0

অ্যালিস , 23 বাইট

/'/dI
\I!wO&K/h.n$@?~E&

এটি অনলাইন চেষ্টা করুন!

কেবল আমিই কুইটার নই, তবে আমি যে পয়েন্টটি ব্যবহার করি তা সঠিকভাবে তৈরি করার জন্য আমি প্রতিশ্রুতিবদ্ধ ! ফিলার হিসাবে । এটি অবশ্যই পাঠকের দৃষ্টি আকর্ষণ করবে।

ব্যাখ্যা

প্রোগ্রামটি কার্ডিনাল এবং অরডিনাল মোডগুলির মধ্যে স্যুইচ করলে এটি আরও স্পষ্ট করতে এই ব্যাখ্যায় আয়নাগুলি ধরে রাখা হয়।

/I/!/wI&/h.n$@?~E&\'!dOK

/I                        % input base
  /!/                     % store onto tape as integer
     w                    % push return address
      I                   % input next line
       &/h                % get length (by adding 1 for each character in the string)
          .n$@            % terminate if zero
              ?~E         % get base from tape and raise to power
                 &\'!     % push "!" onto the stack that many times
                     d    % combine into a single string
                      O   % output string with newline
                       K  % return to stored address (without popping it from the return address stack)

0

পার্ল 6 , 26 বাইট

{map '#'x$^b** *.comb,@^a}

ইনপুট স্ট্রিংগুলির তালিকা প্রথম প্যারামিটারে রয়েছে @^a। দ্বিতীয় প্যারামিটারটি $^bবেস হয়। আউটপুট স্ট্রিংয়ের একটি তালিকা ফিরে আসে।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.