Golf için ipuçları> <> (Balık)


14

Ben gördüğümden beri daha > <> gönderimler son zamanlarda etrafında yüzen, ben bir ipucu sayfası sahibi olmak iyi bir fikir olabileceğini düşündüm.

Yakından ilişkili olmadıkça lütfen gönderi başına bir ipucuna sadık kalın.

Resmi Python tercümanı

Çevrimiçi tercüman (bazı hatalar var, ancak çoğu durum için iyi)


9
Esolang sayfasına bakarken farkettim:> <> yaratıcısı "zıpkın" gibi gelebilecek bir ada sahip.
mbomb007

Balıkta yeni bir çizgiyi nasıl yazdırabilirim?
Kaptan Adam

@CaptainMan Kod noktaları ile çıktı alabilirsiniz ove yeni satır \nASCII 10 olduğundan bunu yapabilirsiniz ao.
Sp3000

@Sp teşekkürler, CRyerine deniyordum LFve dyerine bastırıyordum a.
Kaptan Adam

Yanıtlar:


5

0'a karşı kontrol

Kullanma ?!yerine 0=?tipik bir bayt kaydeder.

Bununla birlikte, ?biraz yeniden yapılandırmayı göze alabiliyorsanız , sadece bir standart bazen daha iyi olabilir

?!vA
  B

e karşı

?vB
 A

4

EOF kontrolü

EOF'ye ulaşıldığında,> <> iki yönden biriyle kontrol edilebilen istif üzerine -1 döndürür:

:0(?
:1+?

EOF'u kontrol etmek amacıyla, bu ikisi olumsuzlamalardır, bu yüzden hangisinin daha faydalı olduğu programınızın yapısına bağlıdır.


3

Yeni satırlar başlatmak için atlamak

Yeni bir satıra başlamak bazen bir sonraki satırda çok fazla önde gelen boşluk harcamak anlamına gelir. Böyle bir durumda, atlama faydalı olabilir.

Örneğin,

[lots of code here]>[loop body]v
                   ^ ......... <

böyle bir hatta sığacak şekilde yapılabilir:

[lots of code here][loop body][jump]

Pratik bir örnek için, bir satırda Merhaba Dünya programı:

"!dlroW ,olleH"l?!;oe0.

3

Girişi basitleştirmek için modül kullanma

Bu bir ipucu için çok basit olabilir, eğer öyleyse sadece değiştireceğim veya sileceğim.

Diyelim ki "a" ve "b" olmak üzere iki karakter girmek ve her biri için sırasıyla 1 ve 2 döndürmek istiyorsunuz. Muhtemelen bunun için koşullu kullanırsınız, çünkü bu en mantıklıdır ve ben bu özel örnek için daha yoğun bir form kullanacağım.

i:"a")+1+n

Bu, girişin "a" dan büyük olup olmadığını kontrol eder ve 1 ekler. "A" 0 ve "b" 1 döndüreceğinden, bu 1 ve 2 değerini verir. Bu, işi oldukça iyi yapar, ancak bizim durumumuzda girdiler, daha da ileri gidebiliriz.

i:3%n

"A" nın sayısal eşdeğeri olan mod 3, 97'de "1", 98'de "b" ler olan 2 olur. İki farklı sayı için, her ikisi için benzersiz sonuçlar veren bir mod garanti edilir. İkiden fazla, benzersiz sonuçlar veren bir mod var, ama en küçük olanı basit bir şekilde bulmak için matematik gücüm yok (örneğin, {100,101,102,103} setine sahipseniz, mod 104 için benzersiz sonuçlar verir) her değeri ama çok yararlı bir şekilde değil). Bununla birlikte, çoğu durumda, girdi birkaç alfabetik karakterle sınırlandırıldığında, genellikle çalışan bir mod bulabilirsiniz.

A ve b olmak üzere iki sayı için benzersiz sonuçlar veren en küçük modülü bulmak için aşağıdakileri yapın. A ve b ( |a - b|) arasındaki farkın mutlak değerini alın ve bölmeyen en küçük sayı olan n'yi bulun. örneğin 97 ve 98 için |98 - 97| = 1, ve böylece 2 en küçük mod olacaktır (ancak test programımız için bu, 97 için 97 ve 0 için 1 verir, bu nedenle mod 3 daha iyidir).


3

Atlamayı koşullu olarak kullanma

Bazı zamanlarda, farklı girdiler aldıktan sonra farklı şeyler yapmanızı gerektiren> <> programlarını yazabilirsiniz. Genellikle, bunu ?ayrıştırmak için koşullu ( ) ve yön değiştiriciler kullanırsınız. Bazı durumlarda, bu iyi çalışır (özellikle işlemek için daha az girdi türü olduğunda), ancak bazen böyle bir şeyle sonuçlanırsınız. (Bu kodun başka numaralar kullanılarak azaltılabileceğini dikkate almayın, sadece gösterim amaçlıdır)

i:"a"=?v:"b"=?v"c"=?v>
  .00n1< .00n2<.00n3<

Bu iyi olsa da, (ki ben şahsen hiç görmeyi sevmediğim) bazı boşlukları var ve çok fazla tekrar var ( =?vve .00n). Bunun yerine, koşullarınız olarak bir atlama ve farklı çizgiler kullanabilirsiniz. İşte bir örnek:

i:"a")$"b")+1+0$.>
v1
v2
v3
<.00n

Bu, 10 bayt kapalı olur. İşte olanlar:

i: Girdiyi bir kez çoğaltırız, böylece iki kez değerlendirebiliriz

"a")$"b")+Bu kendi tür bir ipucu olabilir, ama burada yaptığım girişin "a" karakterinden daha büyük olup olmadığını ve sonra "b" karakterinden daha büyük olup olmadığını kontrol etmek ve sonucu eklemek. "A" için bu, "b" için 1 ve "c" için 0 verir.

1+0$.Sihir yapılan yer burasıdır; önceki basitleştirmenin sonucunu alıyoruz ve 1 ekliyoruz ("a" için 1, "b" için 2, "c" için 3), ardından 0'a basın ve değerleri değiştirin. Atlamaya ulaştığımızda, bu karakterlere atadığımız değere karşılık gelen satıra taşınır (örneğin, "a" için satır 1). NB Satırı 0, programın en üstüdür.


1

İki şekilde çalışabilen kod yazma

Trambolin ( !), kodunuzun ileri ve geri (veya yukarı ve aşağı) çalıştırılmasını istediğinizde çok kullanışlıdır. Bu senaryolar biraz olası değildir, ancak palindrom veya benzer zorluklar için bu ipucu yararlı olabilir.

İşte bir örnek: Bazı kodları bir kez çalıştırmak, sonra 0'a ulaşıncaya kadar değerleri atıp yığın içinde döngü ve sonra aşağı gitmek istiyorum. İşaretçi bu döngüye >. Bunu yapmak için bir sıçrama kullanabilirsiniz, örn.

?!v80.>ao (diyelim ki önce yeni satır yazdırmak istiyorum)

ancak bir kez çalıştırmak istediğimiz kod (kodun ötesindeki kod >) satırı 16 karakterden daha uzun yaparsa, artık üç karakterde atlamayı kullanamazız. Ancak, bu ileri ve geri koşmanın önemsiz olduğu bir örnektir ...

?!v!?<>ao>

İleriye doğru, yeni bir satır yazdırırız ve sonra ?!v0 değilse değeri atarız, sonra trambolin nedeniyle bir sonraki atlar ?ve geri gideriz. Aynı şey olur ve döngü 0'a ulaşana kadar devam eder.

Bu tuhaf bir şekilde spesifik bir örnek, ancak bazı (belki de çok fazla değil) uygulama var.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.